grapesjs 中 init() 和 onRender() 生命周期挂钩之间的区别?

Difference between init() and onRender() lifecycle hooks in grapesjs?

Grapesjs提供了两个生命周期方法:init()onRender(),我其实对这两个hook很迷惑:

正如医生所说:

  • Local hook: view.init() method, executed once the view of the component is initiliazed
  • Local hook: view.onRender() method, executed once the component is rendered on the canvas
init({ model }) {
  // Do something in view on model property change
  this.listenTo(model, 'change:prop', this.handlePropChange);

  // If you attach listeners on outside objects remember to unbind
  // them in `removed` function in order to avoid memory leaks
  this.onDocClick = this.onDocClick.bind(this);
  document.addEventListener('click', this.onDocClick)
},

// Do something with the content once the element is rendered.
// The DOM element is passed as `el` in the argument object,
// but you can access it from any function via `this.el`
onRender({ el }) {
  const btn = document.createElement('button');
  btn.value = '+';
  // This is just an example, AVOID adding events on inner elements,
  // use `events` for these cases
  btn.addEventListener('click', () => {});
  el.appendChild(btn);
},

例如,我可以在两种方法中访问 this.el 以获取 dom 元素。如果我想在 this.el 上附加一个事件监听器,哪个更适合做这样的操作?

总的来说,这两种方法有什么区别,我应该在什么情况下使用它们?

当您在执行挂钩之前需要 DOM 中的元素时使用 onRender

示例:

var el = document.createElement('DIV');
el.style = 'height: 10px';

// logs 0
console.log(el.clientHeight);

document.body.appendChild(el);

// logs 10
console.log(el.clientHeight);

clientHeight returns DOM中元素的高度。如果元素不在 DOM 中,它不会计算元素的高度。 HTML 元素的许多属性和函数与此相关。

如果您希望挂钩在组件初始化后立即执行而不等待渲染,请使用 init

这对设置事件侦听器很有帮助。如果您在 onRender 中设置事件侦听器,则不会捕获在 init 之后和 onRender 之前触发的任何事件。

如果您的钩子中的代码不需要在组件初始化后立即调用,并且不依赖于 DOM 中的元素,那么您选择哪个并不重要选择。在大多数情况下,这些事件将相隔几毫秒。

不过我通常会倾向于 init,这样钩子会尽快执行并且不会在渲染出现问题时等待。