vue中組件間多種傳值方式案例詳解
組件傳值
vue中每個組件都是隔離的,包括父組件和子組件,各組件之間需要數據通信,就涉及到了組件傳值
通過prop屬性進行傳值,值是數組
1.父組件往子組件傳值
兩步:
?1.父組件在使用子組件時要定義自定義的屬性:
比如:動態(tài)傳值 <Vheader :ff="num"></Vheader>
靜態(tài)傳值:<Vheader ff="123"></Vheader> #靜態(tài)傳值,父標簽數據發(fā)生變化,子標簽數據不會變化,值不會變
?2.在子組件中使用props屬性聲明:比如:props:[‘ff’, ],然后子組件就可以將ff作為一個數據屬性來使用了
靜態(tài)傳值案例:
在度組件模板標簽中定義屬性
// 父組件往子組件傳值,父組件定義數據 let App = { data(){ return { name:'景浩' } }, // 在模板中定義屬性實現靜態(tài)傳值 <Vheader ff="123"></Vheader> 靜態(tài)傳值 template: `<div class="App"> <Vheader ff="123"></Vheader> <Vcontent></Vcontent> </div>`, components: { Vheader, Vcontent } }
在子組件中接收父組件傳來的值,使用props屬性接收
let Vheader = { //組件的屬性必須用函數方式來寫 data(){ return{ nav_lst: ['個人中心','登錄','注冊'] } }, //在子組件中接收父組件傳來的值 template: `<div> <h1>{{nav_lst}}</h1> <h2 style="color: mediumvioletred">{{ff}}</h2> </div>`, props: ['ff'], };
瀏覽器查看,已接收到值,并予以展示
動態(tài)傳值案例:
接收方式不變,傳值方式使用v-bind方式
// 父組件往子組件傳值,父組件定義數據 let App = { data(){ return { name:'景浩' } }, // 在模板中定義屬性實現靜態(tài)傳值 <Vheader ff="123"></Vheader> 靜態(tài)傳值 template: `<div class="App"> <!-- //靜態(tài)傳值--> <!-- <Vheader ff="123"></Vheader>--> <!--動態(tài)傳值,通過v-bind的方式,變量名前面加冒號--> <Vheader :ff="name"></Vheader> <Vcontent></Vcontent> </div>`, components: { Vheader, Vcontent } }
瀏覽器查看傳值成功
使用父組件傳遞數據給子組件時, 注意一下幾點:
1.傳遞數據是變量,則需要在屬性左邊添加冒號.
傳遞數據是變量,這種數據稱之為"動態(tài)數據傳遞"
傳遞數據不是變量,這種數據稱之為"靜態(tài)數據傳遞"
2.父組件中修改了數據,在子組件中會被同步修改,但是,子組件中的數據修改了,是不是影響到父組件中的數據. 不影響
這種情況,在開發(fā)時,也被稱為"單向數據流",父組件數據修改后,子組件數據也會變,但改變子組件的值,父組件數據不會變
2.子組件往父組件傳值
兩步:
a.子組件中使用this.$emit(‘fatherHandler’,val); fatherHandler是父組件中使用子組件的地方添加的綁定自定義事件,
注意,如果fatherHandler報錯了,那么可能是你的vue版本不支持自定義鍵名稱fatherHandler中有大寫字母,所以我們改成father-handler或者直接就全部小寫就可以了
<Vheader @fatherHandler="appFatherHandler"></Vheader>
b.父組件中的methods中寫一個自定義的事件函數:appFatherHandler(val){},在函數里面使用這個val,這個val就是上面子組件傳過來的數據
案例:比如要將Vheader里面的一個屬性head_num:80 傳給父組件App,并在里面展示
1、父組件中的操作,首先在父組件中的模板中,從哪個子組件傳值就在哪個子組件標簽中自定義一個事件,事件綁定個方法,不要與系統(tǒng)事件重名
data(){ return { name:'景浩和靈鴿', son_data:'' } }, template: `<div class="App"> //自定義事件 <Vheader @ffunc="receive_data"></Vheader> <Vcontent></Vcontent> <!-- 父組件展示子組件傳來的值--> <h1>子組件傳來的值{{son_data}}</h1> </div>`, //父組件定義方法,帶一個參數,用來接受子組件傳來的值 methods:{ receive_data(val){ //在這里將從子組件傳過來的值,賦值給父組件中的son_data屬性 this.son_data = val } }
2、子組件中的操作
//在子組件中定義一個點擊事件,用來觸發(fā)傳值動作 //組件的屬性必須用函數方式來寫 data(){ return{ nav_lst: ['個人中心','登錄','注冊'], //將子組件的這個header_num傳給父組件 header_num: 80 } }, template: `<div> <h1>{{nav_lst}}</h1> <button @click="zouni">chuanzhi</button> </div>`, //用方法定義傳值邏輯,必須使用this.$emit()方法傳值 methods:{ //方法的第一個參數是父組件中定義的事件名稱,第二個是子組件的屬性 zouni(){ this.$emit('ffunc', this.header_num) } }
未點擊之前,son_data的值為空
點擊觸發(fā)傳值,子組件的值已經傳給了父組件
3.平行組件傳值,兄弟組件傳值
什么是平行組件,看圖
平行組件傳值依賴vue對象,一般是新建一個不帶有任何參數的vue對象,平行組件都可以往該對象中存放值,平行組件都可以從該對象拿值
//平行組件傳值,比如我們從Vheader往Vcontent傳值,先聲明個vue對象
let bus = new Vue()
組件1
let Vheader = { //組件的屬性必須用函數方式來寫 data(){ return{ nav_lst: ['個人中心','登錄','注冊'], //平行組件傳值 header_num: 100 } }, // template: `<div> <h1>{{nav_lst}}</h1> <button @click="zouni">chuanzhi</button> 通過點擊觸發(fā)傳值 </div>`, //在加載的時候,就把屬性值放到對象bus中,使用created不能傳值 // created(){ // //往公交車上放值,用$emit() // console.log(1111) // bus.$emit('header_data',this.header_num); // }, methods:{ zouni(){ bus.$emit('header_data',this.header_num); 在加載的時候,就把屬性值放到對象bus中,放值用$emit() } } };
組件2:
//平行組件拿值,用$on() let Vcontent = { //組件的屬性必須用函數方式來寫 data(){ return{ content_lst: ['xx', 'oo'], content_num: 200, head_num:'' 這里存放平行組件傳來的值,沒傳值時為空 } }, //組件要有自己的標簽,用標簽將組件自己的屬性包裹起來 template: `<div> <h1 style="color: seagreen">{{content_lst}}</h1> <h1>平行組件傳來的值{{head_num}}</h1> </div>`, created() { //以鍵的形式取值,記得使用this的時候要用箭頭函數改變指引,指向vue對象 bus.$on('header_data',val =>{ console.log(val) this.head_num = val }) } };
瀏覽器展示,沒點擊之前,數據為空
點擊之后,就把Vheader組件的header_num 屬性值穿來過來
總結,如上就是vue中常用的各種組件間傳值的方法與案例分享,vue框架使用以及案例剖析,持續(xù)更新中!!!
到此這篇關于vue中組件間多種傳值方式的文章就介紹到這了,更多相關vue組件間傳值內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
vue+canvas實現炫酷時鐘效果的倒計時插件(已發(fā)布到npm的vue2插件,開箱即用)
這篇文章主要介紹了vue+canvas實現炫酷時鐘效果的倒計時插件(已發(fā)布到npm的vue2插件,開箱即用) ,需要的朋友可以參考下2018-11-11