简介
主要介绍非单文件组件的方式创建Vue组件、使用。 非单文件组件指的是一个文件中包含多个vue组件。 非单文件组件实际上是html文件。
使用组件化主要分为三步:
- 编写组件。
- 注册组件。
- 使用组件(组件标签)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>非单文件组件</title>
</head>
<body>
<div id="root1">
<school></school>
<hr>
<student></student>
</div>
<script src="./js/vue.js"></script>
<script>
Vue.config.productionTip = false;
const school = Vue.extend({
template:`
<div>
<div>学校:{{schoolName}}</div>
<div>地址:{{schoolAddress}}</div>
</div>
`,
data() {
return {
schoolName:"尚硅谷",
schoolAddress:"北京"
}
},
});
const student = Vue.extend({
template:`
<div>
<div>学生:{{studentName}}</div>
<div>年龄:{{studentAge}}</div>
</div>
`,
data() {
return {
studentName:"张三",
studentAge:18
}
},
});
const vm = new Vue({
el:"#root1",
components:{
school:school,
student:student
}
})
</script>
</body>
</html>
效果:  vue开发者工具: 
为什么组件的data只能写成函数形式呢,因为组件是要达到复用的,如果组件在多个地方复用,比如在a地方和b地方使用了组件。 如果组件data能够写成对象形式,那么,等于所有使用到他的地方都用到了同样引用的对象(也就是dataA===dataB返回true),这个a地方修改data属性值会影响到b地方。
用原生js演示:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
<script>
let data = {
name:"yehaocong",
age:25
}
let dataA = data;
let dataB = data;
function dataF(){
return {
name:"yehaocong",
age:25
}
}
let dataC = dataF();
let dataD = dataF();
</script>
</body>
</html>
效果:  
上面的注册形式是局部注册,也就是只有该vue实例管理的容器才能使用该组件。 代码:  
效果:

全局注册组件: 代码:  效果: 
注意事项:
-
组件名称的定义: 官方推荐首字母大写,多个单词用横杠分隔。 比如 My-School 使用时就用 <My-School></My-School> -
vue组件的另外一种定义方式是直接使用对象定义: const school = { //这个就是配置对象。 }  也能成功。
|