组件
组件 (Component) 是 Vue.js 最强大的功能之一。组件可以扩展 HTML 元素,封装可重用的代码。在较高层面上,组件是自定义元素,Vue.js 的编译器为它添加特殊功能。在有些情况下,组件也可以表现为用 js 特性进行了扩展的原生 HTML 元素。
总结:
组件是用来完成特点功能的一个自定义的HTML标签
例如:
<body>
<mytag></mytag>
</body>
注意: mytag就是一个组件, 该组件必须通过Vue为mytag赋予一定的功能
组件的作用
组件是对特点功能代码(html,css,js)的封装, 通过组件的名字可以重复利用该组件中的代码.
组件分类
全局组件和局部组件
全局组件
1全局组件的语法:
Vue.component("自定义标签的名字",{配置对象})
2. 全局组件的特点:
2.1 全局组件可以在任何被挂着的标签中使用.
2.2 全局组件的配置对象中必须包含template属性
3. 注意事项:
template中的html必须在一个标签中. 仅且只能有一个根节点.
4. 全局组件应用场景
如果该组件的特定功能需要在任何被挂着的标签中使用. 推荐使用全局组件
<div id="app">
<mycomponent1></mycomponent1>
<mycomponent2></mycomponent2>
</div>
<div id="app1">
<mycomponent1></mycomponent1>
<mycomponent2></mycomponent2>
</div>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
//>>1. 定义第一个全局组件
Vue.component("mycomponent1",{
template : "<h1>这是第一个全局组件</h1>"
})
//>>2. 定义第二个全局组件
var component2Config = {
template : "<h1>这是第二个全局组件</h1>"
};
Vue.component("mycomponent2",component2Config);
var app = new Vue({
el: "#app",
data: {
}
});
var app1 = new Vue({
el: "#app1",
data: {
}
});
</script>
局部组件
1. 局部语法:
var app = new Vue({
el: "#app",
data: {},
components : {
"局部组件的名字1" : {组件的配置对象}
"局部组件的名字2" : {组件的配置对象}
}
});
2. 局部组件的特点
局部组件只能够在所挂载的标签中使用.
<div id="app1">
<mycomponent></mycomponent>
</div>
<div id="app2">
<mycomponent></mycomponent>
</div>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
//>>1. 在id=app1挂载的实例的components中定义局部组件
var app1 = new Vue({
el: "#app1",
data: {},
components : {
"mycomponent" : {
template : "<h1>这是一个局部组件</h1>"
}
}
});
//>>2. 在id=app2的标签中是不能够使用上面app2对象的局部组件.
var app2 = new Vue({
el: "#app2",
data: {}
});
</script>
组件使用两种HTML模板
两种方式
1 直接在template属性写上html代码字符串
template: "html代码的字符串"
2 将当前网页中的html标签作为模板代码 (大量的HTML不用拼装HTML字符串)
a. 在网页中定义template标签或者script标签包含模板中需要的html模板代码
<!--
<template id="mytemplate">
<h1>template标签中的html</h1>
</template>
<script type="text/template" id="mytemplate">
<h1>template标签中的html</h1>
</script>
-->
b. template属性上使用上门的html模板代码.
<!--
"mycomponent2":{
template: "#mytemplate" , #代表找到对应的html代码作为当前组件的模板代码
}-->
3.注意事项:
如果是script的话建议加上 type="text/template"
<div id="app">
<mycomponent1></mycomponent1>
<mycomponent2></mycomponent2>
<mycomponent3></mycomponent3>
</div>
<template id="mytemplate2">
<h1>template标签中的html</h1>
</template>
<script type="text/template" id="mytemplate3">
<h1>script标签中的html</h1>
</script>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {},
components:{
"mycomponent1":{
template: "<h1>这是html标签代码字符串</h1>"
},
"mycomponent2":{
template: "#mytemplate2"
},
"mycomponent3":{
template: "#mytemplate3"
}
}
});
</script>
组件中的数据必须是函数
1. 组件中数据的定义
语法:
"组件的名字":{
template: "",
data : function(){
return {
键1:值1,
键2:值2
}
}
}
2.注意事项:
2.1 data数据只能够以函数的形式返回,因为函数中可用写其他的业务代码
2.2 只能够在各自的组件模板中使用各自的组件中的data数据
2.3 Vue对象中的数据不能够在组件中使用. 组件的数据也不能够在挂载的html标签上使用.
<div id="app">
{{message}}
<mycomponent1></mycomponent1>
<mycomponent2></mycomponent2>
<mycomponent3></mycomponent3>
</div>
<template id="mytemplate2">
<h1>template标签中的html--- {{message}}</h1>
</template>
<script type="text/template" id="mytemplate3">
<h1>script标签中的html--- {{message}}</h1>
</script>
<script type="text/javascript" src="../js/vue.js"></script>
<script type="text/javascript">
var app = new Vue({
el: "#app",
data: {
message: "这是app中的data数据"
},
components:{
"mycomponent1":{
template: "<h1>这是html标签代码字符串---{{message}}</h1>",
data :function () {
return {
message:"组件mycomponent1中的数据"
}
}
},
"mycomponent2":{
template: "#mytemplate2",
data :function () {
return {
message:"组件mycomponent2中的数据"
}
}
},
"mycomponent3":{
template: "#mytemplate3",
data :function () {
return {
message:"组件mycomponent3中的数据"
}
}
}
}
});
组件中使用引用数据的问题
1. 注意事项:
1.1 当组件返回一个全新的对象时, 组件在每次使用时都会使用各自的数据对象.
1.2 当组件返回一个引用的已经存在的对象时, 每个组件都会公用同一个数据对象.
1.<div id="app">
2. <mycomponent></mycomponent>
3. <mycomponent></mycomponent>
4. <mycomponent></mycomponent>
5. <mycomponent></mycomponent>
6.</div>
7.
8.
9.<template id="mytemplate">
10. <button @click="counter++">{{counter}}</button>
11.</template>
12.
13.<script type="text/javascript" src="../js/vue.js"></script>
14.<script type="text/javascript">
15. var data ={ counter: 1};
16. var app = new Vue({
17. el: "#app",
18. components: {
19. "mycomponent": {
20. template: "#mytemplate",
21. /*
22. 该data函数在组件被每次使用时都返回一个全新的对象.
23. data: function () {
24. return {
25. counter: 1
26. }
27. },*/
28.
29. //该data函数在组件被每次使用时公用同一个数据对象.
30. data: function () {
31. return data;
32. },
33.
34. }
35. }
36. });
37.</script>
组件的父子关系
1. 语法:
Vue.component("父组件的名字",{
template: 'html <子组件名字></子组件名字> html',
components :{
子组件的名字: {
template : "子组件的模板"
}
}
});
定义在父组件中的组件叫做子组件
2. 注意事项
2.1 父子模板的html都可以是一个template标签或者script标签
2.2 子组件只能够在父组件中使用
2.3.这种写法也适用于局部组件.
4.4.子组件中可以继续定义子组件
1.<div id="app">
2. <parent></parent>
3.</div>
4.<script type="text/javascript" src="../js/vue.js"></script>
5.<script type="text/javascript">
6. Vue.component("parent",{
7. template: "<h1>这是父模板 <child></child></h1>",
8. components:{
9. child:{
10. template: "<h1>这是子模板</h1>"
11. }
12. }
13. });
14. var app = new Vue({
15. el: "#app"
16. });
17.</script>
Vue应用中的数据给顶级组件
因为每个组件都是独立的. 相互不能够默认情况下相互不能够共享数据.
语法:
1 期望数据
Vue.component("mycompenent",{
props: ["期望数据的名字1", "期望数据的名字2"],
template: "{{期望数据的名字1}} {{期望数据的名字2}}",
});
var app = new Vue({
el: "#app",
data :{
age :29
}
});
2 在Vue挂着的标签中为组件传递数据
<mycompenent 期望数据的名字1="值1" :期望数据的名字1="值2"></mycompenent>
语法解释:
1. 子组件要显式地用 props 选项声明它预期的数据.
2. 在父组件中使用子组件时, 通过标签属性的形式传递过来. 标签的数据不能够使用功能{{}},只能够使用数据绑定
3. 如果属性是带有中划线的, 在props中一定要使用驼峰式的写法.
1.<div id="app">
2. <mycompenent name="小花" :age="age"></mycompenent>
3.</div>
4.<script type="text/javascript" src="../js/vue.js"></script>
5.<script type="text/javascript">
6. Vue.component("mycompenent",{
7. props: ["name", "age"],
8. template: "<h1>姓名: {{name}} 年龄:{{age}}</h1>",
9. });
10. var app = new Vue({
11. el: "#app",
12. data :{
13. age :29
14. }
15. });
16.</script>
父组件的数据传递给子组件
语法:
Vue.component("父组件的名字",{
template: 'html <子组件名字 期望数据的名字1="表达式" 期望数据的名字2="表达式"></子组件名字> html',
components :{
子组件的名字: {
props:["期望数据的名字1","期望数据的名字2"]
template : "子组件的模板"
}
}
});
语法解释:
1. 子组件要显式地用 props 选项声明它预期的数据.
2. 在父组件中使用子组件时, 通过标签属性的形式传递过来. 标签的数据不能够使用功能{{}},只能够使用数据绑定
3. 如果属性是带有中划线的, 在props中一定要使用驼峰式的写法.
1.<div id="app">
2. <parent></parent>
3.</div>
4.<script type="text/javascript" src="../js/vue.js"></script>
5.<script type="text/javascript">
6. Vue.component("parent",{
7. template: "<h1>这是父模板 <child name='张三' :student-age='age'></child></h1>",
8. data : function () {
9. return {
10. age : 29
11. }
12. },
13. components:{
14. child:{
15. props:["name","studentAge"],
16. template: "<h1>这是子模板 姓名:{{name}} 年龄:{{studentAge}}</h1>"
17. }
18. }
19. });
20. var app = new Vue({
21. el: "#app",
22. });
23. console.log(app);
</script>