vue中組件間多種傳值方式案例詳解
組件傳值
vue中每個(gè)組件都是隔離的,包括父組件和子組件,各組件之間需要數(shù)據(jù)通信,就涉及到了組件傳值
通過(guò)prop屬性進(jìn)行傳值,值是數(shù)組
1.父組件往子組件傳值
兩步:
?1.父組件在使用子組件時(shí)要定義自定義的屬性:
比如:動(dòng)態(tài)傳值 <Vheader :ff="num"></Vheader>
靜態(tài)傳值:<Vheader ff="123"></Vheader> #靜態(tài)傳值,父標(biāo)簽數(shù)據(jù)發(fā)生變化,子標(biāo)簽數(shù)據(jù)不會(huì)變化,值不會(huì)變
?2.在子組件中使用props屬性聲明:比如:props:[‘ff’, ],然后子組件就可以將ff作為一個(gè)數(shù)據(jù)屬性來(lái)使用了
靜態(tài)傳值案例:
在度組件模板標(biāo)簽中定義屬性
// 父組件往子組件傳值,父組件定義數(shù)據(jù) let App = { data(){ return { name:'景浩' } }, // 在模板中定義屬性實(shí)現(xiàn)靜態(tài)傳值 <Vheader ff="123"></Vheader> 靜態(tài)傳值 template: `<div class="App"> <Vheader ff="123"></Vheader> <Vcontent></Vcontent> </div>`, components: { Vheader, Vcontent } }
在子組件中接收父組件傳來(lái)的值,使用props屬性接收
let Vheader = { //組件的屬性必須用函數(shù)方式來(lái)寫(xiě) data(){ return{ nav_lst: ['個(gè)人中心','登錄','注冊(cè)'] } }, //在子組件中接收父組件傳來(lái)的值 template: `<div> <h1>{{nav_lst}}</h1> <h2 style="color: mediumvioletred">{{ff}}</h2> </div>`, props: ['ff'], };
瀏覽器查看,已接收到值,并予以展示
動(dòng)態(tài)傳值案例:
接收方式不變,傳值方式使用v-bind方式
// 父組件往子組件傳值,父組件定義數(shù)據(jù) let App = { data(){ return { name:'景浩' } }, // 在模板中定義屬性實(shí)現(xiàn)靜態(tài)傳值 <Vheader ff="123"></Vheader> 靜態(tài)傳值 template: `<div class="App"> <!-- //靜態(tài)傳值--> <!-- <Vheader ff="123"></Vheader>--> <!--動(dòng)態(tài)傳值,通過(guò)v-bind的方式,變量名前面加冒號(hào)--> <Vheader :ff="name"></Vheader> <Vcontent></Vcontent> </div>`, components: { Vheader, Vcontent } }
瀏覽器查看傳值成功
使用父組件傳遞數(shù)據(jù)給子組件時(shí), 注意一下幾點(diǎn):
1.傳遞數(shù)據(jù)是變量,則需要在屬性左邊添加冒號(hào).
傳遞數(shù)據(jù)是變量,這種數(shù)據(jù)稱(chēng)之為"動(dòng)態(tài)數(shù)據(jù)傳遞"
傳遞數(shù)據(jù)不是變量,這種數(shù)據(jù)稱(chēng)之為"靜態(tài)數(shù)據(jù)傳遞"
2.父組件中修改了數(shù)據(jù),在子組件中會(huì)被同步修改,但是,子組件中的數(shù)據(jù)修改了,是不是影響到父組件中的數(shù)據(jù). 不影響
這種情況,在開(kāi)發(fā)時(shí),也被稱(chēng)為"單向數(shù)據(jù)流",父組件數(shù)據(jù)修改后,子組件數(shù)據(jù)也會(huì)變,但改變子組件的值,父組件數(shù)據(jù)不會(huì)變
2.子組件往父組件傳值
兩步:
a.子組件中使用this.$emit(‘fatherHandler’,val); fatherHandler是父組件中使用子組件的地方添加的綁定自定義事件,
注意,如果fatherHandler報(bào)錯(cuò)了,那么可能是你的vue版本不支持自定義鍵名稱(chēng)fatherHandler中有大寫(xiě)字母,所以我們改成father-handler或者直接就全部小寫(xiě)就可以了
<Vheader @fatherHandler="appFatherHandler"></Vheader>
b.父組件中的methods中寫(xiě)一個(gè)自定義的事件函數(shù):appFatherHandler(val){},在函數(shù)里面使用這個(gè)val,這個(gè)val就是上面子組件傳過(guò)來(lái)的數(shù)據(jù)
案例:比如要將Vheader里面的一個(gè)屬性head_num:80 傳給父組件App,并在里面展示
1、父組件中的操作,首先在父組件中的模板中,從哪個(gè)子組件傳值就在哪個(gè)子組件標(biāo)簽中自定義一個(gè)事件,事件綁定個(gè)方法,不要與系統(tǒng)事件重名
data(){ return { name:'景浩和靈鴿', son_data:'' } }, template: `<div class="App"> //自定義事件 <Vheader @ffunc="receive_data"></Vheader> <Vcontent></Vcontent> <!-- 父組件展示子組件傳來(lái)的值--> <h1>子組件傳來(lái)的值{{son_data}}</h1> </div>`, //父組件定義方法,帶一個(gè)參數(shù),用來(lái)接受子組件傳來(lái)的值 methods:{ receive_data(val){ //在這里將從子組件傳過(guò)來(lái)的值,賦值給父組件中的son_data屬性 this.son_data = val } }
2、子組件中的操作
//在子組件中定義一個(gè)點(diǎn)擊事件,用來(lái)觸發(fā)傳值動(dòng)作 //組件的屬性必須用函數(shù)方式來(lái)寫(xiě) data(){ return{ nav_lst: ['個(gè)人中心','登錄','注冊(cè)'], //將子組件的這個(gè)header_num傳給父組件 header_num: 80 } }, template: `<div> <h1>{{nav_lst}}</h1> <button @click="zouni">chuanzhi</button> </div>`, //用方法定義傳值邏輯,必須使用this.$emit()方法傳值 methods:{ //方法的第一個(gè)參數(shù)是父組件中定義的事件名稱(chēng),第二個(gè)是子組件的屬性 zouni(){ this.$emit('ffunc', this.header_num) } }
未點(diǎn)擊之前,son_data的值為空
點(diǎn)擊觸發(fā)傳值,子組件的值已經(jīng)傳給了父組件
3.平行組件傳值,兄弟組件傳值
什么是平行組件,看圖
平行組件傳值依賴(lài)vue對(duì)象,一般是新建一個(gè)不帶有任何參數(shù)的vue對(duì)象,平行組件都可以往該對(duì)象中存放值,平行組件都可以從該對(duì)象拿值
//平行組件傳值,比如我們從Vheader往Vcontent傳值,先聲明個(gè)vue對(duì)象
let bus = new Vue()
組件1
let Vheader = { //組件的屬性必須用函數(shù)方式來(lái)寫(xiě) data(){ return{ nav_lst: ['個(gè)人中心','登錄','注冊(cè)'], //平行組件傳值 header_num: 100 } }, // template: `<div> <h1>{{nav_lst}}</h1> <button @click="zouni">chuanzhi</button> 通過(guò)點(diǎn)擊觸發(fā)傳值 </div>`, //在加載的時(shí)候,就把屬性值放到對(duì)象bus中,使用created不能傳值 // created(){ // //往公交車(chē)上放值,用$emit() // console.log(1111) // bus.$emit('header_data',this.header_num); // }, methods:{ zouni(){ bus.$emit('header_data',this.header_num); 在加載的時(shí)候,就把屬性值放到對(duì)象bus中,放值用$emit() } } };
組件2:
//平行組件拿值,用$on() let Vcontent = { //組件的屬性必須用函數(shù)方式來(lái)寫(xiě) data(){ return{ content_lst: ['xx', 'oo'], content_num: 200, head_num:'' 這里存放平行組件傳來(lái)的值,沒(méi)傳值時(shí)為空 } }, //組件要有自己的標(biāo)簽,用標(biāo)簽將組件自己的屬性包裹起來(lái) template: `<div> <h1 style="color: seagreen">{{content_lst}}</h1> <h1>平行組件傳來(lái)的值{{head_num}}</h1> </div>`, created() { //以鍵的形式取值,記得使用this的時(shí)候要用箭頭函數(shù)改變指引,指向vue對(duì)象 bus.$on('header_data',val =>{ console.log(val) this.head_num = val }) } };
瀏覽器展示,沒(méi)點(diǎn)擊之前,數(shù)據(jù)為空
點(diǎn)擊之后,就把Vheader組件的header_num 屬性值穿來(lái)過(guò)來(lái)
總結(jié),如上就是vue中常用的各種組件間傳值的方法與案例分享,vue框架使用以及案例剖析,持續(xù)更新中!!!
到此這篇關(guān)于vue中組件間多種傳值方式的文章就介紹到這了,更多相關(guān)vue組件間傳值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vue-resource:jsonp請(qǐng)求百度搜索的接口示例
今天小編就為大家分享一篇vue-resource:jsonp請(qǐng)求百度搜索的接口示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11Vue3使用src動(dòng)態(tài)引入本地圖片的詳細(xì)步驟
這篇文章主要給大家介紹了關(guān)于Vue3使用src動(dòng)態(tài)引入本地圖片的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2022-12-12使用Vue-router二級(jí)路由跳轉(zhuǎn)另一條路由下的子級(jí)
這篇文章主要介紹了使用Vue-router二級(jí)路由跳轉(zhuǎn)另一條路由下的子級(jí)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10vue+canvas實(shí)現(xiàn)炫酷時(shí)鐘效果的倒計(jì)時(shí)插件(已發(fā)布到npm的vue2插件,開(kāi)箱即用)
這篇文章主要介紹了vue+canvas實(shí)現(xiàn)炫酷時(shí)鐘效果的倒計(jì)時(shí)插件(已發(fā)布到npm的vue2插件,開(kāi)箱即用) ,需要的朋友可以參考下2018-11-11Vue+WebSocket頁(yè)面實(shí)時(shí)刷新長(zhǎng)連接的實(shí)現(xiàn)
最近vue項(xiàng)目要做數(shù)據(jù)實(shí)時(shí)刷新,數(shù)據(jù)較大,會(huì)出現(xiàn)卡死情況,所以本文主要介紹了頁(yè)面實(shí)時(shí)刷新長(zhǎng)連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06