我总是使用 vue-cli 构建我的 SPA 应用程序。
这次我正在构建一个小项目,我将 Vue 与脚本标签结合在一起。
但我不明白以下行为。
// app.js
Vue.component('todo-item', {
template: `<div>Todo Component!</div>`
})
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue App!'
}
})
Run Code Online (Sandbox Code Playgroud)
HTML index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Title</title>
</head>
<body>
<div id="app">
{{ message }}
<div>
Just some content...
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="./js/app.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
结果是这样的:
现在,我将尝试'<todo-item />'在 HTML 中添加Component:
<div id="app">
{{ message }}
<todo-item />
<div>
Just some content...
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
文字“只是一些内容...”消失了:
我究竟做错了什么?
TL; 博士;
而不是<todo-item/>使用<todo-item></todo-item>
未编译的 vue.js 不支持自关闭 html 标签。
见风格指南:
不幸的是,HTML 不允许自定义元素自动关闭——只有官方的“void”元素。这就是为什么只有当 Vue 的模板编译器可以在 DOM 之前到达模板,然后提供符合 DOM 规范的 HTML 时,才可以使用该策略。
https://vuejs.org/v2/style-guide/#Self-closure-components-strongly-recommended
和github中的问题:
https://github.com/vuejs/vue/issues/1036
https://github.com/vuejs/vue/issues/8664