Javascript 在mithril.js中,onremove和onbeforeremove事件不触发,而oninit和oncreate则不触发

Javascript 在mithril.js中,onremove和onbeforeremove事件不触发,而oninit和oncreate则不触发,javascript,mithril.js,Javascript,Mithril.js,文件TodoApp.js: ... const Todo = { oninit(vnode) { ... // ok }, oncreate() { ... // ok }, onbeforeremove() { ... // not firing }, onremove() { ... // not firing } }; ... 我试图在onremove或onbeforemove中进行一些清理,

文件
TodoApp.js

...
const Todo = {
  oninit(vnode) {
    ...
    // ok
  },
  oncreate() {
    ...
    // ok
  },
  onbeforeremove() {
    ...
    // not firing
  },
  onremove() {
    ...
    // not firing
  }
};
...
我试图在
onremove
onbeforemove
中进行一些清理,但两者都不起作用。

在mithril.js中是否有类似React的
组件将卸载
的东西?

它们应该是相似的,除了
onbeforeremove
仅适用于被分离的最顶层元素,据我所知。我想可能是其他原因导致了这些枪不开火。您确定TODO没有被css隐藏,或者在执行钩子之前另一个错误被静音了吗

也许你需要发布更多的代码来调试

我用MithrilJS 2.0.4做了一个简单的例子,演示了
onbeforeremove
onremove
之间的区别

打开后:

TODO.oncreate <div>​…​</div>​
TODOContent.oncreate <div>​Get something done​</div>​

onremove和onbeforeremove仅在组件脱离dom时激发。看起来组件并没有分离,而是在更新同一个组件。您可以通过触发onupdate和onbeforeupdate事件来检查它。如果他们触发的是onupdate事件而不是oncreate事件,那么您的组件将被更新而不是重新创建。
TODO.onbeforeremove <div>​…​</div>​
TODO.onremove <div>​…​</div>​
TODOContent.onremove <div>​Get something done​</div>​
const TODOContent = {
  oncreate: function (vnode) {
    console.log('TODOContent.oncreate', vnode.dom);
  },
  onbeforeremove: function (vnode) {
    console.log('TODOContent.onbeforeremove', vnode.dom);
  },
  onremove: function (vnode) {
    console.log('TODOContent.onremove', vnode.dom);
  },
  view: function () {
    return m('div', 'Get something done');
  }  
}

const TODO = {
  oncreate: function (vnode) {
    console.log('TODO.oncreate', vnode.dom);
  },
  onbeforeremove: function (vnode) {
    console.log('TODO.onbeforeremove', vnode.dom);
  },
  onremove: function (vnode) {
    console.log('TODO.onremove', vnode.dom);
  },
  view: function () {
    return m('div', m(TODOContent));
  }
};

function TODOWrapper(vnode) {
  let show = false;
  function toggle(e) {
    show = !show;
  }
  return {
    view: function (vnode) {
      return m('div', [
        m('button[type=button]', {onclick: toggle}, 'toggler'),
        show ? m(TODO) : null,
        ]);
    }
  }
}
  

m.mount(document.body, {view: function () { return m(TODOWrapper);}});