2 回答

TA贡献1842条经验 获得超12个赞
如果您关心“体面”,那么可以,做正确的事,删除该侦听器。但是从实用主义者的角度来看,也许并非如此。由于您的应用程序不是SPA,因此每次用户单击链接并转到其他页面时,都会自动解决该问题。
但还是要视情况而定。在某些情况下,对您的其中一个页面进行一次长期访问后,有可能多次加载了此指令?如果出现这种情况,则最好正确注销该侦听器。如果否,则该指令仅被加载一次,那么您可以放心地保留它。

TA贡献1817条经验 获得超6个赞
您可以在unbind挂钩中的窗口上删除事件侦听器。但是,为了删除事件侦听器,您将需要存储它们的回调。只需将其存储为的属性即可完成此操作el,例如el.scrollCallback:
bind: (el) => {
el.scrollCallback = () => {
el.dataset.scrolled = true;
}
},
unbind: (el) => {
window.removeEventListener('scroll', el.scrollCallback);
},
然后,在inserted钩子中,只需更新存储scrolled布尔值的方式即可。您可以将其存储在el的数据集中,而不是将其封装在钩子中,以便其他钩子可以访问它:
inserted: (el, binding, vnode) => {
// Store data in element directly
el.dataset.scrolled = false;
let stickyTop = 300;
setTimeout(function(){
stickyTop = el.offsetTop;
checkPosition();
window.addEventListener('scroll', el.scrollCallback);
}, 2500);
// REST OF YOUR CODE HERE
// Remember to update all references to `scrolled` to `el.dataset.scrolled`
let timeout = setInterval(function() {
if (el.dataset.scrolled) {
el.dataset.scrolled = false;
checkPosition();
}
}, 2500);
}
添加回答
举报