我正在开发一个Vue组件,该组件将通过CMS系统放置在多个网站上。我遇到的问题是,即使我的js脚本加载顺序正确,有时也会出现以下错误:
未捕获引用错误:未定义Vue
在HTMLDocument上。<;匿名>;
Vue通过cdn加载,位于组件代码上方
所有Vue代码的运行方式如下:
document.addEventListener(“DOMContentLoaded”,()=>{
//这是Vue代码
});
我甚至在DOMContentLoaded事件中添加了setTimeout(),但仍然没有做到这一点。
window.onload=function()在所有情况下都不起作用。我还是时不时地犯那个错误。
脚本加载到主体中
你知道另一种方法是什么吗?我想确保在启动Vue代码的那一刻,Vue已加载并准备在页面上初始化。
谢谢大家!
使用vuemounted()在页面加载时运行任何代码,使用updated()在任何组件操作后运行,因此完美的解决方案是将Roy j和vue生命周期挂钩结合起来
挂载(){
window.addEventListener('load',()=>{
//在一切就绪后运行
})
},
//99%使用“mounted()”和上面的代码就足够了,
//但如果不是,您也可以挂接到“updated()”
//
//请记住,这里的任何代码都将在每次DOM更改时重新运行
更新的(){
//在dom被vue更改后运行某些内容
}
请注意,您可以省略窗口。addEventListener()仍然可以工作,但如果使用jqueryouterHeight(true)之类的工具,它可能会丢失+,最好在窗口事件中使用它,以确保获得正确的值
更新1:
除了使用window.addEventListener('load')之外,还有另一种使用document.readyState的方法,因此可以
挂载(){
document.onreadystatechange=()=>;{
{.complete(readyState)=“如果”
//在这里运行代码
}
}
},
更新2:
到目前为止,我发现的最可靠的方法是在$nextTick上使用debounce,因此用法变得更加简单
从“lodash/debounce”导入去盎司
//坏的
更新的(){
这是$nextTick(去盎司(()=>{
console.log('test')//运行多次
},250))//增加您的需求
}
//好
更新:去盎司(函数(){
这.$nextTick(()=>{
console.log('test')//只运行一次
})
},250)//满足您的需求
当使用debounce和updated时,它会变得很棘手,因此请确保继续测试它
更新3:
您也可以尝试使用MutationObserver