下图是 Vue的官网中 对解析 DOM 模板时的注意事项:
“如果我们从以下来源使用模板的话,这条限制是不存在的” 对于这句话困扰了我一段时间,觉得有必要做一个记录:
<body>
<div id="app">
<!-- is="" 的方式可以避开一些潜在的浏览器 **解析规则** ,正确渲染元素 -->
<table>
<tr is="todo-item-template"></tr>
</table>
<!-- 方式一:直接在table下使用子组件 -->
<table>
<todo-item-template></todo-item-template>
</table><hr>
<!-- 方式二:通过template字符串 -->
<todo-three></todo-three><hr>
<!-- 方式三:通过<script type="text/x-template" id="todo-four"></script> -->
<todo-four></todo-four>
</div>
</body>
<script type="text/x-template" id="todo-four-template">
<table><todo-item-template></todo-item-template></table>
</script>
Vue.component('todo-item-template', {
template: '<tr>通过控制台查看我是否正确渲染</tr>',
});
Vue.component('todo-four', {
template: '#todo-four-template',
});
const vm = new Vue({
el: '#app',
components: {
'todo-three': {
template: '<table><todo-item-template></todo-item-template></table>',
},
},
});
通过控制台就可以发现只有方式一出现了问题,tr元素跑到了table元素的同级:
- 字符串(例如:
template: '...'
) - 单文件组件(
.vue
)【该方法需要使用 vue-cli 脚手架,上例中未进行演示】 <script type="text/x-template">
因此官网说 “如果我们从以下来源使用模板的话,这条限制是不存在的”。