Vue--vue中的组件、组件绑定事件和数据、私有组件、子组件,父子组件参数互传
一.公有组件以及组件的使用和特点
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 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <script src="../vue2.4.4.js"></script> 9 </head> 10 11 <body> 12 <!-- 定义一个vue的管理区块,(MVVM中的View) --> 13 <template id="tlogin"> 14 <div> 15 用户名:<input type="text"><br> 16 密 码:<input type="text"> 17 </div> 18 </template> 19 <!-- <script type="x-template" id="tlogin"> 20 <div> 21 用户名:<input type="text"><br> 22 密 码:<input type="text"> 23 </div> 24 </script> --> 25 26 <div id="app"> 27 <vue-login></vue-login> 28 </div> 29 </body> 30 <script> 31 //公有组件: 32 //注意: 33 // 1)所有的模板代码都都必须有一个根标签 34 // 2)如果组件的名称如首字母大写: 35 // a.所有的字母全部小写 36 // b.内部如果也有大写将大写将改为小写并且在这个字母之前加上一个“-” 37 38 39 //1.0 将组件的定义和注册分为两步来执行 40 // // 定义格式: 41 // // Vue.extend({ 42 // // template: "组件的html代码" 43 // // }); 44 // var login = Vue.extend({ 45 // template: "<h1>我是login</h1>" 46 // }); 47 // // 注册: 48 // // 参数一:当前注册组件的名称 49 // // 参数二:组件对象 50 // // Vue.component("login",login)//向Vue中注册组件: 51 // Vue.component("login",login); 52 53 //2.0组件的定义和注册一步到位 54 //使用组件时一定要给组件加上根标签 55 // Vue.component("login",{ 56 // template: "<div>用户名:<input type='text'><br/>密 码:<input type='text'></div>" 57 // }); 58 59 //3.0组件的使用三: 60 Vue.component("VueLogin",{ 61 template: "#tlogin" 62 }); 63 64 //4.0组件的使用四: 65 // Vue.component("login",{ 66 // template: "#tlogin" 67 // }); 68 69 // 实例化vue对象(MVVM中的View Model) 70 new Vue({ 71 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 72 el:'#app' 73 }) 74 </script> 75 </html>
二.给组件绑定事件和数据
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 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <script src="../vue2.4.4.js"></script> 9 </head> 10 11 <body> 12 <!-- 定义一个vue的管理区块,(MVVM中的View) --> 13 <template id="reg"> 14 <div> 15 <input type="text" v-model="name"> 16 <input type="text" v-model="age"> 17 <button @click="getValue">注册</button> 18 </div> 19 </template> 20 <div id="app"> 21 <register></register> 22 </div> 23 24 </body> 25 26 <script> 27 //定义和注册 28 Vue.component("register",{ 29 template:"#reg", 30 data:function() { 31 return { 32 name:"我是组件中的name属性", 33 age:18 34 } 35 }, 36 methods:{ 37 getValue:function() { 38 alert("我被点击了"); 39 } 40 } 41 }); 42 43 // 实例化vue对象(MVVM中的View Model) 44 new Vue({ 45 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 46 el:'#app', 47 data:{ 48 // 数据 (MVVM中的Model) 49 }, 50 methods:{ 51 52 } 53 }) 54 </script> 55 </html>
三.私有组件 components
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 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <script src="../vue2.4.4.js"></script> 9 </head> 10 11 <body> 12 <!-- 定义一个vue的管理区块,(MVVM中的View) --> 13 <template id="tlogin"> 14 <div> 15 用户名<input type="text"><br> 16 密码: <input type="text"> 17 </div> 18 </template> 19 <div id="app"> 20 <login></login> 21 </div> 22 23 </body> 24 25 <script> 26 27 // 实例化vue对象(MVVM中的View Model) 28 new Vue({ 29 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 30 el:'#app', 31 data:{ 32 // 数据 (MVVM中的Model) 33 }, 34 components:{ //私有组件 35 "login":{ 36 template:"#tlogin" 37 } 38 } 39 }) 40 </script> 41 </html>
四.子组件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script src="../vue2.4.4.js"></script> </head> <body> <!-- 定义一个vue的管理区块,(MVVM中的View) --> <div id="app"> <account></account> <login></login><!-- 会报错,因为login是account组件的私有组件 --> </div> </body> <script> // 定义组件 Vue.component("account",{ template:"<div>account<login></login><register></register></div>", components:{ "login":{ template:"<div>login</div>", }, "register":{ template:"<div>register</div>", } } }); // 实例化vue对象(MVVM中的View Model) new Vue({ // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 el:'#app', data:{ // 数据 (MVVM中的Model) }, methods:{ } }) </script> </html>
五.使用component中的is来实现组件切换
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 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 7 <title>Document</title> 8 <script src="../vue2.4.4.js"></script> 9 </head> 10 11 <body> 12 <!-- 定义一个vue的管理区块,(MVVM中的View) --> 13 <template id="account"> 14 <div> 15 <a href="#" @click="componentId='login'">登录</a> 16 <a href="#" @click="componentId='register'">注册</a> 17 <!-- :is 相当于给component绑定组件,绑定is后面的值对应的组件 --> 18 <component :is="componentId"></component> 19 </div> 20 </template> 21 <div id="app"> 22 <account></account> 23 </div> 24 </body> 25 <script> 26 Vue.component("account",{ 27 template:"#account", 28 // 在父组件中添加一个componentId的属性,将来给上面模板中的component使用 29 data:function() { 30 return { 31 componentId:"login" 32 } 33 }, 34 // methods:{ 35 // register:function() { 36 // this.componentId = "register"; 37 // } 38 // }, 39 components:{ 40 "login":{ 41 template:"<span>login</span>" 42 }, 43 "register":{ 44 template:"<span>register</span>" 45 } 46 } 47 }); 48 // 实例化vue对象(MVVM中的View Model) 49 new Vue({ 50 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 51 el:'#app', 52 data:{ 53 // 数据 (MVVM中的Model) 54 }, 55 methods:{ 56 } 57 }) 58 </script> 59 </html>
六.父组件传值给子组件
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>Document</title> 9 <script src="../vue2.4.4.js"></script> 10 </head> 11 12 <body> 13 <!-- 定义一个vue的管理区块,(MVVM中的View) --> 14 <template id="account"> 15 <div>account<br/> 16 <login :aname="name"></login> 17 </div> 18 </template> 19 <div id="app"> 20 <account></account> 21 </div> 22 23 </body> 24 25 <script> 26 Vue.component("account", { 27 template: "#account", 28 data: function () { 29 return { 30 name: "account中的name" 31 } 32 }, 33 components: { 34 "login": { 35 template: "<div>子组件输出:{{aname}}</div>", 36 props:["aname"] // 这个是用来接受将来父组件传递过来的参数的数据 37 }, 38 39 } 40 }); 41 42 // 实例化vue对象(MVVM中的View Model) 43 new Vue({ 44 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 45 el: '#app', 46 data: { 47 // 数据 (MVVM中的Model) 48 }, 49 methods: { 50 51 } 52 }) 53 54 </script> 55 56 </html>
七.子组件传值给父组件
1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset="UTF-8"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>Document</title> 9 <script src="../vue2.4.4.js"></script> 10 </head> 11 12 <body> 13 <!-- 定义一个vue的管理区块,(MVVM中的View) --> 14 <template id="account"> 15 <div> 16 {{name}}<br/> 17 <login @loginkey="getV"></login> 18 </div> 19 </template> 20 <div id="app"> 21 <account></account> 22 </div> 23 24 </body> 25 26 <script> 27 Vue.component("account", { 28 template: "#account", 29 data: function () { 30 return { name: "" } 31 }, 32 methods: { 33 getV: function (value) { 34 //接收子组件传递过来的参数 35 this.name = value; 36 } 37 }, 38 components: { 39 "login": { 40 template: "<div><button @click='sendV'>点我将name传给父元素</button></div>", 41 data: function () { 42 return { 43 name: "login中的name" 44 } 45 }, 46 methods: { 47 sendV: function () { 48 // 我们要将子组件的name属性设置给父组件 49 // 这个send方法需要一个键值对 50 this.$emit('loginkey', this.name); 51 } 52 } 53 } 54 55 }, 56 57 58 }); 59 // 实例化vue对象(MVVM中的View Model) 60 new Vue({ 61 // vm控制的区块为id为app的div,此div中的所有vue指令均可以被vm解析 62 el: '#app', 63 data: { 64 // 数据 (MVVM中的Model) 65 }, 66 methods: { 67 68 } 69 }) 70 71 </script> 72 73 </html>