如何在Twig模板中使用Vue.js 3且不覆盖挂载容器原有内容?
Vue.js 3 挂载时保留容器原有内容的实现方法
在Vue 3里,直接用createApp(App).mount('#app')确实会替换掉容器内的所有内容,这和Vue 2的new Vue({el: '#app'})行为不同——Vue 2会把容器里的内容当作根组件的模板来编译,不会直接清空。要在Vue 3里实现同样的效果,有两种实用的方式:
方式一:复用容器现有内容作为根组件模板
先把容器里的内容取出来当作根组件的模板,再挂载到容器上,步骤如下:
// main.ts import { createApp } from 'vue' // 获取目标容器 const appContainer = document.getElementById('app') if (!appContainer) return // 保存容器内的原有内容 const originalContent = appContainer.innerHTML // 创建Vue应用,把原有内容作为根组件的模板 const app = createApp({ template: originalContent }) // 注册你需要的全局组件(比如自定义组件) app.component('my-custom-component', () => import('./components/MyCustomComponent.vue')) // 先清空容器,再挂载应用 appContainer.innerHTML = '' app.mount(appContainer)
这样处理后,容器里的原有内容会被当作Vue模板编译,静态内容会保留,Vue指令、组件也能正常工作,和Vue 2的效果一致。
方式二:直接挂载空应用并利用容器内容作为模板
如果你的根组件不需要额外逻辑,也可以直接创建一个空的Vue应用,然后把容器本身作为模板引用:
// main.ts import { createApp } from 'vue' const app = createApp({ template: '#app' // 这里的#app是容器选择器,Vue会自动提取容器内的内容作为模板 }) // 注册全局组件 app.component('my-custom-component', () => import('./components/MyCustomComponent.vue')) // 挂载到容器 app.mount('#app')
这种方式更简洁,Vue会自动读取#app容器内的内容作为根模板,编译后替换容器内容,最终效果和Vue 2完全一致。
需要注意的是:如果容器里有Twig渲染的动态内容,确保这些内容在Vue挂载前已经完全渲染完成,否则Vue可能无法正确编译这些内容。
内容的提问来源于stack exchange,提问作者The50
相关产品推荐
相关产品推荐

