一、Vue.js组件注册内容
• 全局注册 • 组件基础 • 局部注册
二、全局注册
• 全局注册的组件在注册后可以用于任意实例或组件中。
<body>
<div id="app">
<p>这是p标签</p>
<my-component></my-component>
</div>
<script src="./vue.js"></script>
<script>
// 语法: Vue.component('my-component',{选项对象});
Vue.component('my-component',{
template: '<div>这是我们全局注册的组件</div>'
})
new Vue({
el:'#app',
data: {
}
})
</script>
</body>
• 注意:全局注册必须设置在根 Vue 实例创建之前。
三、组件基础
• 本质上,组件是可复用的 Vue 实例,所以它们可与 new Vue 接收相同的选项,例如 data、methods 以及生命周期钩子等。
• 仅有的例外是像 el 这样根实例特有的选项。
组件基础主要学习内容:• 组件命名规则 • template 选项 • data 选项
3.1组件命名规则
• 组件具有两种命名规则:
• kebab-case:'my-component’ 驼峰命名法
• PascalCase:'MyComponent' 帕斯卡命名法
• 注意:无论采用哪种命名方式,在 DOM 中都只有 kebab-case 可以使用。
示例:我们再视图中使用组件的时候,不能够使用帕斯卡命名法去书写,否则会报错。
<body>
<div id="app">
<my-com-a></my-com-a>
<!-- <MyComA></MyComA> -->
<my-com-b></my-com-b>
<!-- <MyComB></MyComB> -->
</div>
<script src="../01.TodoMVC/todomvc-app-template/node_modules/vue/dist/vue.js"></script>
<script>
//kebab-case进行注册 (驼峰命名法)
Vue.component('my-com-a', {
template: '<div>这是a组件的内容</div>'
})
//pascalCase进行注册 (帕斯卡命名法)
Vue.component('MyComB', {
template: '<div>这是b组件的内容</div>'
})
new Vue({
el: '#app'
})
</script>
</body>
3.2template选项
• template 选项用于设置组件的结构,最终被引入根实例或其他组件中。
• 注意:组件必须只有一个根元素。如果出现同级的根元素就会出现报错情况。
<body>
<!-- 挂载元素 -->
<div id="app">
<my-com-a></my-com-a>
</div>
<script src="../01.TodoMVC/todomvc-app-template/node_modules/vue/dist/vue.js"></script>
<script>
Vue.component('MyComA', {
template: `
<div>
<h1>组件 A 的标题内容</h1>
</div>
<div>
<h1>组件 A 的标题内容</h1>
</div>
`
});
new Vue({
el: '#app'
})
</script>
</body>
3.3data选项
• data 选项用于存储组件的数据,与根实例不同,组件的 data 选项必须为函数,数据设置在返回值对象中。
<body>
<!-- 挂载元素 -->
<div id="app">
<my-com-a></my-com-a>
<my-com-a></my-com-a>
<my-com-a></my-com-a>
</div>
<script src="../01.TodoMVC/todomvc-app-template/node_modules/vue/dist/vue.js"></script>
<script>
Vue.component('MyComA',{
template: `
<div>
<h3> {{ title }} </h3>
<p> {{content}} </p>
</div>
`,
// data() {} 简写形式
data: function () {
return {
title: '这是组件A的标题',
content: '这是组件A的内容'
}
}
});
new Vue({
el: '#app',
data: {
}
})
</script>
</body>
data参数使用函数的实现方式,是为了确保每个组件实例可以维护一份被返回对象的独立的拷贝,不会相互影响。
通过如下使用DevTools插件,我们可以选择一个组件进行数据修改,发现我们多次调用的组件,再修改的时候,只会更改自身选中的组件,其他的同名的组件不会随之变化,受到影响。
四、局部注册
• 局部注册的组件只能用在当前实例或组件中。
<body>
<div id="app">
<my-com-a></my-com-a>
<my-com-b></my-com-b>
</div>
<script src="vue.js"></script>
<script>
new Vue({
el: '#app',
data: {
},
components: {
'my-com-a': {
templata: `
<div>
<h3>{{ title }}</h3>
<p>{{ content }}</p>
</div>
`,
data: function () {
return {
title: '这是组件A的标题',
content: '这是组件A的内容'
}
}
},
'my-com-b': {
templata: `
<div>
<h3>{{ title }}</h3>
<p>{{ content }}</p>
</div>
`,
data: function () {
return {
title: '这是组件B的标题',
content: '这是组件B的内容'
}
}
}
}
})
</script>
</body>
单独配置组件的选项对象:
<body>
<div id="app">
<my-com-a></my-com-a>
<my-com-b></my-com-b>
</div>
<script src="vue.js"></script>
<script>
let MyComA = {
templata: `
<div>
<h3>{{ title }}</h3>
<p>{{ content }}</p>
</div>
`,
data: function () {
return {
title: '这是组件A的标题',
content: '这是组件A的内容'
}
}
};
let MyComB = {
templata: `
<div>
<h3>{{ title }}</h3>
<p>{{ content }}</p>
</div>
`,
data: function () {
return {
title: '这是组件B的标题',
content: '这是组件B的内容'
}
}
};
new Vue({
el: '#app',
data: {
},
components: {
'my-com-a': MyComA,
'my-com-b': MyComB
}
})
</script>
</body>
ES6 的对象属性简写:
new Vue({
el: '#app',
data: {
},
components: {
MyComA,
MyComB
}
})