vue教程3-05 vue組件數據傳遞
一、vue默認情況下,子組件也沒法訪問父組件數據
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <style> </style> </head> <body> <div id="box"> <aaa> </aaa> </div> <script> var vm=new Vue({ el:'#box', data:{ a:'aaa' }, components:{ 'aaa':{ data(){ return { msg:'我是父組件的數據' } }, template:'<h2>我是aaa組件</h2><bbb></bbb>', components:{ 'bbb':{ template:'<h3>我是bbb組件->{{msg}}</h3>'//這里是子組件,是訪問不到父組件的數據msg } } } } }); </script> </body> </html>
二、數據傳遞
組件數據傳遞: √ 1. 子組件獲取父組件data 在調用子組件: <bbb :m="數據"></bbb> 子組件之內: props:['m','myMsg'] props:{ 'm':String, 'myMsg':Number } 2. 父級獲取子級數據 *子組件把自己的數據,發送到父級 vm.$emit(事件名,數據); v-on: @
1、子組件獲取父組件data
方法一:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <style> </style> </head> <body> <div id="box"> <aaa></aaa> </div> <template id="aaa"> <h1>11111</h1> <bbb :mmm="msg2" :my-msg="msg"></bbb> </template> <script> var vm=new Vue({ el:'#box', data:{ a:'aaa' }, components:{ 'aaa':{ data(){ return { msg:111, msg2:'我是父組件的數據' } }, template:'#aaa', components:{ 'bbb':{ props:['mmm','myMsg'],//my-msg在這里要變成駝峰命名法 template:'<h3>我是bbb組件->{{mmm}} <br> {{myMsg}}</h3>' } } } } }); </script> </body> </html>
方法二:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <style> </style> </head> <body> <div id="box"> <aaa></aaa> </div> <template id="aaa"> <h1>11111</h1> <bbb :mmm="msg2" :my-msg="msg"></bbb> </template> <script> var vm=new Vue({ el:'#box', data:{ a:'aaa' }, components:{ 'aaa':{ data(){ return { msg:111, msg2:'我是父組件的數據' } }, template:'#aaa', components:{ 'bbb':{ props:{ 'm':String,//注明數據類型 'myMsg':Number }, template:'<h3>我是bbb組件->{{mmm}} <br> {{myMsg}}</h3>' } } } } }); </script> </body> </html>
2、 父級獲取子級數據
方法一:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <style> </style> </head> <body> <div id="box"> <aaa></aaa> </div> <template id="aaa"> <span>我是父級 -> {{msg}}</span> <bbb @child-msg="get"></bbb> </template> <template id="bbb"> <h3>子組件-</h3> <input type="button" value="send" @click="send"> </template> <script> var vm=new Vue({ el:'#box', data:{ a:'aaa' }, components:{ 'aaa':{ data(){ return { msg:'我是父組件的數據' } }, template:'#aaa', methods:{ get(msg){ // alert(msg); this.msg=msg; } }, components:{ 'bbb':{ data(){ return { a:'我是子組件的數據' } }, template:'#bbb', methods:{ send(){ this.$emit('child-msg',this.a); } } } } } } }); </script> </body> </html>
注意:
vm.$dispatch(事件名,數據) 子級向父級發送數據
vm.$broadcast(事件名,數據) 父級向子級廣播數據
配合: event:{}
在vue2.0里面已經,報廢了
slot:位置、槽口
作用: 占個位置,不覆蓋原先的內容
類似ng里面 transclude (指令)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <style> </style> </head> <body> <div id="box"> <aaa> <ul slot="ul-slot"> <li>1111</li> <li>2222</li> <li>3333</li> </ul> <ol slot="ol-slot"> <li>111</li> <li>222</li> <li>333</li> </ol> </aaa> <hr> <aaa> </aaa> </div> <template id="aaa"> <h1>xxxx</h1> <slot name="ol-slot">這是默認的情況</slot> <p>welcome vue</p> <slot name="ul-slot">這是默認的情況2</slot> </template> <script> var vm=new Vue({ el:'#box', data:{ a:'aaa' }, components:{ 'aaa':{ template:'#aaa' } } }); </script> </body> </html>
效果圖:
vue-> SPA應用,單頁面應用 vue-router路由
vue-> SPA應用,單頁面應用 vue-router路由 vue-resouce 交互 vue-router 路由 路由:根據不同url地址,出現不同效果 該課程配套用 0.7.13版本 vue-router 主頁 home 新聞頁 news html: <a v-link="{path:'/home'}">主頁</a> 跳轉鏈接 展示內容: <router-view></router-view> js: //1. 准備一個根組件 var App=Vue.extend(); //2. Home News組件都准備 var Home=Vue.extend({ template:'<h3>我是主頁</h3>' }); var News=Vue.extend({ template:'<h3>我是新聞</h3>' }); //3. 准備路由 var router=new VueRouter(); //4. 關聯 router.map({ 'home':{ component:Home }, 'news':{ component:News } }); //5. 啟動路由 router.start(App,'#box'); 跳轉: router.redirect({ ‘/’:'/home' });
下載vue-router:
vue-router路由:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <script src="bower_components/vue-router/dist/vue-router.js"></script> <style> </style> </head> <body> <div id="box"> <ul> <li> <a v-link="{path:'/home'}">主頁</a> </li> <li> <a v-link="{path:'/news'}">新聞</a> </li> </ul> <div> <router-view></router-view> </div> </div> <script> //1. 准備一個根組件 var App=Vue.extend(); //2. Home News組件都准備 var Home=Vue.extend({ template:'<h3>我是主頁</h3>' }); var News=Vue.extend({ template:'<h3>我是新聞</h3>' }); //3. 准備路由 var router=new VueRouter(); //4. 關聯 router.map({ 'home':{ component:Home }, 'news':{ component:News } }); //5. 啟動路由 router.start(App,'#box'); </script> </body> </html>
跳轉:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="bower_components/vue/dist/vue.js"></script> <script src="bower_components/vue-router/dist/vue-router.js"></script> <style> </style> </head> <body> <div id="box"> <ul> <li> <a v-link="{path:'/home'}">主頁</a> </li> <li> <a v-link="{path:'/news'}">新聞</a> </li> </ul> <div> <router-view></router-view> </div> </div> <script> //1. 准備一個根組件 var App=Vue.extend(); //2. Home News組件都准備 var Home=Vue.extend({ template:'<h3>我是主頁</h3>' }); var News=Vue.extend({ template:'<h3>我是新聞</h3>' }); //3. 准備路由 var router=new VueRouter(); //4. 關聯 router.map({ 'home':{ component:Home }, 'news':{ component:News } }); //5. 啟動路由 router.start(App,'#box'); //6. 跳轉 router.redirect({ '/':'home' //訪問根目錄時,跳轉到/home }); </script> </body> </html>