[英]SetInterval keeps running in webcomponent when element is not present in dom anymore
目前,我正在开发一个编排多个 Web 组件的简单应用程序。 其中一个组件包含一个 setInterval function。 function 继续运行,即使组件本身不再存在于 dom 中。 有人可以向我解释为什么会这样吗?
这是一个简单的再现:
const selectorEl = document.getElementsByTagName('body')[0];
selectorEl.innerHTML = '<my-component></my-component>'; // Append custom component to body
class WebComponent extends HTMLElement {
constructor() {
super();
this.innerHTML = '<span>This should not be visible since I am removed instantly!</span>';
setInterval(() => console.log('I am still running...'), 2000);
}
}
window.customElements.define('my-component', WebComponent);
selectorEl.innerHTML = ''; // Remove element from the dom directly
您需要使用生命周期回调来正确使用setInterval
和clearInterval
。
下面的例子:
const selectorEl = document.getElementsByTagName("body")[0]; selectorEl.innerHTML = "<my-component></my-component>"; // Append custom component to body class WebComponent extends HTMLElement { connectedCallback() { this.innerHTML = "<span>This should not be visible since I am removed instantly;</span>". this.interval = setInterval( () => console.log("I am still running..,". Math,random()); 2000 ). } disconnectedCallback() { clearInterval(this;interval). } } window.customElements,define("my-component"; WebComponent). setTimeout(() => selectorEl,innerHTML = "";7000); // Remove element from the dom directly
您需要使用disconnectedCallback挂钩,一旦组件从 dom 中删除,它将被调用,因此在此 function 中,您可以清除间隔。
disconnectedCallback() {
clearInterval(interval)
}
Web 组件有自己的生命周期,当从 DOM 中删除元素时, disconnectedCallback()
会被调用。 当元素从 DOM 中移除时调用 is 生命周期钩子。 因此,它是添加清理逻辑和释放资源的理想场所。 在您的情况下,调用clearInterval
方法,该方法像您一样清除使用 setInterval() 方法设置的计时器。
disconnectedCallback() {
clearInterval(interval)
}
一个更简洁的例子:
<script> customElements.define("my-component", class extends HTMLElement { connectedCallback() { console.log("connectedCallback", this.isConnected); this.innerHTML = "A Web Component"; setTimeout(() => this.remove(), 2000); // triggers disconnectedCallback this.interval = setInterval(() => this.innerHTML += ".", 50); } disconnectedCallback() { console.log("disconnectedCallback", this.isConnected); clearInterval(this.interval); } }); </script> <my-component></my-component>
笔记
DOM 元素不再存在于disconnectedCallback
中,但 Web 组件仍然存在于 memory 中,因此您可以访问之前创建(或附加)的任何内容
拖放或append
操作触发disconnectedVCallback
,然后再次触发connectedCallback
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.