Vue 2如何在正确时机实例化?DOMContentLoaded下事件绑定失效如何解决
问题排查与解决步骤
- 优先修复模板语法错误
你提供的组件模板存在明显的语法错误,<nav class="burgerNav""处多了一个多余的双引号,会导致Vue模板解析异常,直接引发事件绑定失效。修正后的组件代码如下:
const navBurger = { template: ` <nav class="burgerNav"> <button class="burgerNav__icon" @click="test"> </button> </nav> `, methods: { test: function() { console.log('test') } } } export default navBurger
- 修正实例化时机逻辑
你的脚本使用了type="module"属性,ES模块本身默认就会在DOM解析完成后、DOMContentLoaded事件触发前执行,和defer属性效果完全一致。如果此时你在模块代码中额外绑定DOMContentLoaded监听,会出现两种异常情况:
- 若模块执行时
DOMContentLoaded已经触发,监听回调永远不会执行 - 回调执行时机被不必要的后置,反而增加了和其他DOM操作脚本冲突的概率
建议直接在模块顶层执行Vue实例化代码,同时提前校验挂载节点是否真实存在:
// 根实例代码示例 import navBurger from './components/nav/nav.js' const mountNode = document.querySelector('#你的挂载节点ID') // 确认DOM节点存在再实例化,避免无意义报错 if (mountNode) { new Vue({ el: mountNode, components: { navBurger }, template: '<nav-burger/>' }) }
- 冲突场景的兜底方案
如果你的项目存在其他会动态修改头部DOM结构的脚本,可将实例化逻辑绑定到window.load事件,该事件会在页面所有资源加载、所有同步DOM操作完成后触发,比手动写固定延迟的方案可靠得多,对于导航组件的加载速度影响几乎可以忽略:
window.addEventListener('load', () => { // 放入Vue实例化代码 })
性能优化建议
如果要进一步提升导航组件的加载速度,可以把组件模板直接写在HTML页面的挂载节点内,不需要放在JS的字符串模板中,Vue可以直接解析已存在的DOM作为模板,省去字符串解析的耗时,也能避免模板字符串的语法错误问题。额外排查项
如果上述操作完成后问题仍然存在,检查是否有其他全局JS脚本给document、导航容器绑定了click事件的阻止冒泡逻辑(e.stopPropagation()),这类逻辑也会导致Vue的@click事件无法触发。
内容的提问来源于stack exchange,提问作者isUnknown
相关产品推荐
相关产品推荐

