javascript - 从 DOM 中删除时自动卸载

标签 javascript dom riot.js

考虑以下示例:

riot.mount('clock')
setTimeout(()=>{
  console.log("removing from dom")
  var el = document.getElementsByTagName("clock")[0];
  el.parentNode.removeChild(el);
  riot.update();
}, 5000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.5.0/riot+compiler.min.js">
</script>
<script type="riot/tag">
  <clock>
      <p>{ time }</p>
      
      this.time = new Date();
      tick() {
        this.update({ time: new Date() })
      }
      var timer = setInterval(this.tick, 1000)
      this.on("unmount",() => {
      	console.log("unmounted")
        clearInterval(timer)
      });
      this.on("update",() => {
        console.log("on update");
      });
      this.tick();
  </clock>
</script>

<clock></clock>

我们在其中安装标签,然后使用普通的 DOM 方法将其删除。在这种情况下,可以看出虽然标签不再存在,但它还没有被卸载,因此 unmount 事件处理程序中的处理代码没有运行。

我可以使用 DOM MutationObserver 来处理这种情况,但我想知道我是否遗漏了什么。

最佳答案

更新时检查 parentNode,如果不存在则调用 unmount

riot.mount('clock')
setTimeout(()=>{
  console.log("removing from dom")
  var el = document.getElementsByTagName("clock")[0];
  el.parentNode.removeChild(el);
  riot.update();
}, 5000)
<script src="https://cdnjs.cloudflare.com/ajax/libs/riot/2.5.0/riot+compiler.min.js">
</script>
<script>
  riot.mixin("autoUnmount", {
    init: function() {
      this.on("update",() => {
        if (!this.root.parentNode) {
          this.unmount();
        }
      });
    }
  });
</script>
<script type="riot/tag">
  <clock>
      <p>{ time }</p>
      
      this.mixin("autoUnmount");
      this.time = new Date();
      tick() {
        this.update({ time: new Date() })
      }
      var timer = setInterval(this.tick, 1000)
      this.on("unmount",() => {
      	console.log("unmounted")
        clearInterval(timer)
      });
      this.on("update",() => {
        console.log("on update");
      });
      this.tick();
  </clock>
</script>

<clock></clock>

关于javascript - 从 DOM 中删除时自动卸载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38223137/

相关文章:

javascript - 网页在本地运行但在 GitHub 和 CodePen 上失败

javascript - 如何更改使用 javascript 创建的单元格内容的字体大小

javascript - 如何通过JS将riot标签附加到根目录?

javascript - 我们如何检测 Riot.js 中循环/渲染的结束?

javascript - 使用 Selenium 总是得到 'Error: timeout of 2000ms exceeded'

javascript - 为什么 jQuery backgroundPosition 动画函数是跳跃而不是动画?

javascript - 在 Node.js 和 node-webkit 中打开目录

javascript - 在动态创建的元素上的单击事件监听器上包含子元素

javascript - 如何刷新存储和快照的 jquery 选择器变量

javascript - RiotJs - 如何使用 each={} 访问 RiotJs 绑定(bind)的对象?