Vue非单文件组件
1. Vue使用组件步骤
- 定义组件(创建组件)
- 注册组件
- 使用组件(写组件标签)
2. 如何定义一个组件
使用Vue.extend(options)创建,其中options和new Vue(options)时传入的那个options几乎一样,但区别如下:
- el不要写,为什么? -- 最终所有的组件都要经过一个vm的管理, 由vm中的el决定服务哪个容器
- data必须写成函数,为什么?---避免组件被复用时,多个组件实例的数据引用同一份data数据。
- 使用
template
配置项进行配置组件结构。
备注
template
选项里面不能配置<template></template>
根节点,扩展:v-if指令可以使用<template></template>
3. 如何注册组件
- 局部注册: 靠new Vue的时候传入comonents选项
- 全局注册: 靠Vue.component('组件名', 组件)
4. 组件命名
4.1 关于组件名
一个单词组成:
- 第一种写法(首字母小写): school
- 第二种写法(首字母大写): School
多个单词组成:
- 第一种写法(kebab-case命名):my-school
- 第二种写法(CameCase命名):MySchool(需要Vue脚手架支持)
备注
(1)组件名尽可能回避HTML中已有的元素名称。例如h2,H2都不行
(2) 可以使用name配置项指定组件在开发者工具中呈现的名字。
4.2 关于组件标签
- 第一种写法:
<school></school>
- 第二种写法:
<school/>
提示:
如果没有使用Vue脚手架时,会导致后续使用组件不能渲染。
4.3 简写形式
js
const school = Vue.extend(options) 可简写为 ==> const school = options
5. 使用组件标签
比如前面定义的是名叫school组件,直接在html页面中编写<school></school>
完整的例子:
html
<div id="editor">
<!-- 3使用组件-->
<school></school>
<student></student>
</div>
</body>
<script>
Vue.config.productionTip = false
// 1创建school组件
const school = Vue.extend({
// el: "#editor", // 子组件不能加el,首先本身不支持,其次设计成这样是将组件和html解耦,更加灵活
data() { // data不能用data:{} 对象式而是函数式, 避免同一个组件多个地方使用引用同一个data对象
return {
schoolName: 'demoSchool'
}
},
template: `
<div>{{schoolName}}</div>
`
})
// 1创建student组件
const studentA = Vue.extend({
data() {
return {
studentName: 'demoStudent'
}
},
template: `
<div>{{studentName}}</div>
`
})
// 2注册组件
const vm = new Vue({
el: "#editor",
components:{
school, // 如果对象中属性的名字和值一样的名字可以简写
student: studentA
}
})
</script>
6. 组件嵌套
html
<div id="root">
<app></app><!--如果不写,就需要在vm里面配置template节点:'<app></app>'-->
</div>
</body>
<script>
Vue.config.productionTip=false
let student = Vue.extend({
name:'student',
template: `
<div>
<span>{{studentName}}</span>
<span>{{studentAddress}}</span>
</div>
`,
data(){
return{
studentName:'未知名考生',
studentAddress:'四川成都'
}
}
})
let school = Vue.extend({
name:'school',
template: `
<span>{{schoolName}}</span>
`,
data(){
return{
schoolName:'清华'
}
}
})
const app = Vue.extend({
name: 'app',
template: `
<div>
<school></school>
<student></student>
</div>
`,
components:{
school, student
}
})
new Vue({
el:'#root',
components:{
app
}
})
</script>
打开vue-tools工具,可以看到嵌套效果: