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);}});