Vue组件化
一、注册组件的基本步骤。
1、创建组件构造器
2、注册组件
3、使用组件
具体代码分析:
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Document</title> 7 </head> 8 <body> 9 <div id="app"> 10 <my-cpn></my-cpn> 11 </div> 12 <my-cpn></my-cpn> /*写在这里是无效的*/ 13 <script src="../vue.js"> </script> 14 <script> 15 // 1、创建组件构造器对象 16 const cpnC = Vue.extend({ 17 template:` 18 <div> 19 <h2>握手</h2> 20 </div> 21 ` 22 }) 23 // 2、注册组件(全局组件,可在多个vue实例中使用) 24 Vue.component('my-cpn', cpnC) 25 26 const app = new Vue({ 27 el: '#app', 28 data: { 29 30 } 31 }) 32 </script> 33 </body> 34 </html>
首先调用Vue.extend()方法创建组件构造器,通常在创建组件构造器时,传入template代表我们自定义组件的模板,该模板就是在使用组件的地方,要显示的HTML代码,不过这种写法在VUE2.x的文档中几乎看不到了。
然后调用Vue.component()方法注册组件,该方法需要传递两个参数:A.注册组件的标签名。B.组件构造器名称
最后使用的时候要在Vue实例的作用范围内,否则不会生效。
注意:在template中使用的不是单引号,而是波浪号上的那个点,使用单引号是不能这样换行的,需要用加号连接。
二、组件的分类:全局组件和局部组件。
<script src="../vue.js"> </script> <script> // 1、创建组件构造器对象 const cpnC = Vue.extend({ template:` <div> <h2>握手</h2> </div> ` }) // 2、注册组件(全局组件,可在多个vue实例中使用) Vue.component('my-cpn', cpnC) const app = new Vue({ el: '#app', data: {}, // 局部注册 components: { // cpn 使用组件时的标签名 cpn: cpnC } }) </script>
一般局部组件使用的多一点,而且一般一个组件创建一个Vue实例。
注意:cpn: cpnC 使用的标签名,如果是大写驼峰命名如:MyCpn: cpnC那么vue解析标签名时会解析成my-cpn,若是直接使用MyCpn则会无效。
三、组件注册语法糖。
1、全局注册:
1 Vue.component('my-cpn', { 2 template:` 3 <div> 4 <h2>握手</h2> 5 </div> 6 ` 7 })
即:不再写Vue.extend()方法,直接将extend中的template对象写到注册器中,它会自己调用。
2、局部注册:
1 const app = new Vue({ 2 el: '#app', 3 data: {}, 4 // 局部注册 5 components: { 6 // cpn 使用组件时的标签名,cnp加不加引号都可以 7 cnp: { 8 template:` 9 <div> 10 <h2>握手</h2> 11 </div> 12 ` 13 } 14 } 15 })
四、组件模板的分离写法。
1、利用script标签的text/x-template类型
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Document</title> 7 </head> 8 <body> 9 <div id="app"> 10 <cpn></cpn> 11 </div> 12 <script type="text/x-template" id="cpn"> 13 <div> 14 <h2>握手</h2> 15 </div> 16 </script> 17 <script src="../vue.js"> </script> 18 <script> 19 20 // 2、注册组件(全局组件,可在多个vue实例中使用) 21 // Vue.component('cpn', { 22 // template: '#cpn' 23 // }) 24 25 const app = new Vue({ 26 el: '#app', 27 data: {}, 28 // 局部注册 29 components: { 30 // cpn 使用组件时的标签名 31 cpn: { 32 template: '#cpn' 33 } 34 } 35 }) 36 </script> 37 </body> 38 </html>
2、直接使用template标签
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <title>Document</title> 7 </head> 8 <body> 9 <div id="app"> 10 <cpn></cpn> 11 </div> 12 <template id="cpn"> 13 <div> 14 <h2>握手</h2> 15 </div> 16 </template> 17 <script src="../vue.js"> </script> 18 <script> 19 20 // 2、注册组件(全局组件,可在多个vue实例中使用) 21 // Vue.component('cpn', { 22 // template: '#cpn' 23 // }) 24 25 const app = new Vue({ 26 el: '#app', 27 data: {}, 28 // 局部注册 29 components: { 30 // cpn 使用组件时的标签名 31 cpn: { 32 template: '#cpn' 33 } 34 } 35 }) 36 </script> 37 </body> 38 </html>
五、组件中的data为什么必须是函数。
1 a() { 2 return { 3 'a':b, 4 'b':c 5 } 6 } 7 8 let obj1 = a() 9 let obj2 = a() 10 let obj3 = a() 11 这三个对象是不同的,每次调用a函数时,它都会新建新对象
let obj = { 'a':b, 'b':c } a(){ return obj } let obj1 = a() let obj2 = a() let obj3 = a() 此时三个对象是同一个
通过上面对比可以知道,当组件的data是对象时,该组件被多次调用时,会导致它们对应同一个data,当一个做修改后,其他调用的地方也会被改变,而使用函数时,多次调用都会生成新对象,从而避免了互相影响。


浙公网安备 33010602011771号