版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
第Vue如何解決兄弟組件之間傳值問題目錄解決兄弟組件之間傳值問題bus可以通過兩種方式來實現(xiàn)各類組件間傳值方法(父子、兄弟、頁級)父子關(guān)系組件兄弟關(guān)系組件頁級關(guān)系組件
解決兄弟組件之間傳值問題
vue中父組件向子組件傳遞參數(shù)時,可以通過prop來傳遞參數(shù),prop可以是數(shù)組形式,也可以是對象格式,子向父組件傳遞參數(shù)時,通過$emit來傳遞,$emit(方法名,傳參),來實現(xiàn)子組件和父組件數(shù)據(jù)交互,但是在父組件中,有好多個子組件,這些子組件怎么樣來進行數(shù)據(jù)通訊呢?
有的同學(xué)會立馬想到vuex,答案是:可以的,但是會不會大材小用?在項目中,只是個別組件需要用到通訊,我們是不會優(yōu)先考慮vuex來解決的。
下面我們可以使用一個特別好用的方法來實現(xiàn)兄弟組件之間數(shù)據(jù)通訊
bus.js顧名思義巴士,所有人都可以上車,不管你在哪里,不管你是什么組件,我都可以開車過去接你。
bus可以通過兩種方式來實現(xiàn)
1.通過創(chuàng)建.js文件局部方式來實現(xiàn),在需要用到的組件中引入,然后調(diào)用它即可
在項目的utils文件中創(chuàng)建一個js文件,在正常的項目種,會用utils來存放哪些共用的js文件,這些js文件是一些常用的方法或例如這個bus
//bus.js
importVuefrom'vue';
exportdefaultnewVue();
接下來,哪個組件需要發(fā)車你就在哪里import給它建立一個發(fā)車點
//在vue組件中引入
importbusfrom"../../utils/bus";
然后這里我們在vue的實例中的methods函數(shù)中定義一個方法來觸發(fā)這個bus發(fā)車
methods:{
busFun(data){
//通過$emit來觸發(fā)方法,參數(shù)1是定義方法名,參數(shù)2是你要發(fā)送的數(shù)據(jù)
bus.$emit('name',data)
},
}
這里千萬要注意了,若你使用多個bus那么參數(shù)1命名千萬別重復(fù),否則其他組件會出現(xiàn)無故上車的情況,這個bus中可以給無數(shù)個組件使用,但是命名不能重復(fù),除非你創(chuàng)建多個bus。
接下來我們就看看這輛巴士有哪個組件要上車。
同樣,如果其他組件要上車,我們必須要在這個組件中設(shè)立一個車站,不然巴士不知道要在哪里接這個組件。
//這個組件需要上車,我們先設(shè)立一個車站
importbusfrom"../../utils/bus";
設(shè)立車站后,我們就需要通過bus.$on來觸發(fā),也就是上車的技能
created(){
bus.$on('name',(data)={
console.log(data,'上車成功');
})
},
//打卡
beforeDestroy(){
bus.$off('name');
},
這里會有同學(xué)會疑惑,為什么上車后需要打卡???
我們先說從上往下說吧,首先我們必須要在vue的created鉤子函數(shù)中來觸發(fā)這個bus,在頁面還沒加載的時候我們先觸發(fā)它然后拿到數(shù)據(jù),在created中執(zhí)行,我們可以避免很多坑,例如觸發(fā)bus無法拿到數(shù)據(jù)等問題(想了解的同學(xué)去問度娘,這里就不說明了)。
然后我們每次觸發(fā)這個bus的時候,我們必須在整個生命周期走完的時候?qū)⑦@個bus給移除掉。
簡單粗暴的說,就是我們每個組件上車的時候,我們必須要給它打卡掉,讓后面的bus知道這個組件已經(jīng)上車了,不需要在這里等待,接到就開走,頭都不回的那種。
執(zhí)行beforeDestroy來銷毀這個bus方法,是避免方法冗余,若不清除這個方法,那將會出現(xiàn)多個bus觸發(fā),每次都會將這輛bus停留在這個vue的生命周期中,打開控制臺你會發(fā)現(xiàn)有好多輛bus在這里停留,因為我們每次觸發(fā)bus時,就會開一輛巴士出來,而不是這輛巴士一直重復(fù)開的原因。
2.接下來我們就說一下第二種方式
//我們在main.js中用常量創(chuàng)建一個bus,然后將它放入Vue實例的原型對象中。
constbus=newVue()
Vtotype.$bus=bus;
然后我們就可以在全局通過this.$bus來開巴士了(#滑稽)。接下來只要開穩(wěn)就可以為所欲為了。
created(){
this.$bus.$on('name',(data)={
console.log(data,'上車成功');
})
},
//打卡
beforeDestroy(){
this.$bus.$off('name');
},
最后別忘了給乘客打卡哦!
各類組件間傳值方法(父子、兄弟、頁級)
熟悉vue各類關(guān)系的組件之間傳值方法會令開發(fā)更加得心應(yīng)手,下面將對父子、兄弟、頁級組件之間的傳值作淺談。
父子關(guān)系組件
-父向子組件傳值
父組件向子組件傳值通常是利用props屬性。首先,在子組件里定義一個props值用來接收父組件數(shù)據(jù);然后調(diào)用子組件并v-bind綁定這個props值=父組件的data值。
父組件代碼:
template
div
HelloWorld:newMsg="msg"/
//綁定子組件newMsg(props值)=父組件msg(data值)
/div
/template
script
importHelloWorldfrom"@/components/HelloWorld.vue";
exportdefault{
name:"Home",
data(){
return{msg:'WelcometoVue.js'}//父組件數(shù)據(jù)msg
components:{HelloWorld}
/script
子組件代碼:
template
div
h1{{newMsg}}/h1
//直接調(diào)用newMsg,顯示“WelcometoVue.js”
/div
/template
script
exportdefault{
name:"HelloWorld",
props:{newMsg:String}
//為子組件定義newMsg(props值)接收父組件msg
//或者props:['newMsg']
/script
-子向父組件傳值
子組件向父組件傳值有兩種方式:
1.利用$emit()方法。首先在子組件中用$emit()向上傳遞一個自定義事件并附帶想要傳遞的數(shù)據(jù);然后在父組件v-on監(jiān)聽這個自定義事件并自動接收到數(shù)據(jù);最后在響應(yīng)該事件的方法中進行數(shù)據(jù)操作。
子組件代碼:
script
exportdefault{
name:"HelloWorld",
data(){
return{msg:"WelcometoVue"}//data值,即將向上傳遞的值
created(){
this.$emit('change',this.msg)//向上傳遞自定義事件change和data值。這里我調(diào)用created生命周期函數(shù)觸發(fā)$emit()
/script
父組件代碼:
template
div
HelloWorld@change="handle"http:///監(jiān)聽到子組件傳遞來的事件并響應(yīng)handle方法
span{{newMsg}}/span
//直接調(diào)用newMsg,顯示“WelcometoVue”
/div
/template
script
importHelloWorldfrom"@/components/HelloWorld.vue";
exportdefault{
name:"Home",
data(){
return{newMsg:""}
methods:{
handle(msg){
//定義handle方法,將自動接收到的msg值給了自己的newMsg
this.newMsg=msg
}
components:{HelloWorld}
/script
2.利用ref屬性。ref是vue提供的內(nèi)部屬性,它其實相當(dāng)于類似idclass的標(biāo)識。首先在子組件上定義ref值(例:ref=son);然后在父組件中用this.\$refs.son即可獲取到son這個ref的組件,進行操作。
子組件代碼:
script
exportdefault{
name:"HelloWorld",
data(){
return{msg:"WelcometoVue"}
//即將向父傳遞的data值
/script
父組件代碼:
template
div
HelloWorldref="son"/
//在子組件上定義一個ref名為"son"
/div
/template
script
importHelloWorldfrom"@/components/HelloWorld.vue";
exportdefault{
name:"Home",
mounted(){
console.log(this.$refs.son.msg)
//獲取到ref名為"son"的子組件內(nèi)msg數(shù)據(jù),在控制臺顯示“WelcometoVue”
components:{HelloWorld}
/script
兄弟關(guān)系組件
兄弟組件間的傳值方式我稱為總線轉(zhuǎn)送。原理很簡單,利用父組件作為總線去轉(zhuǎn)送數(shù)據(jù)。首先,用上述講到的ref屬性或$emit()將組件A的數(shù)據(jù)向上傳遞給父組件;再由父組件通過props屬性向下傳值到組件B。
組件A代碼:
template
divclickme/div
/template
script
exportdefault{
name:"HelloWorld",
data(){
return{helloMsg:"WelcometoVue"}//即將傳送的數(shù)據(jù)helloMsg
/script
組件B代碼:
template
div
{{hiMsg}}
//直接調(diào)用hiMsg,顯示“WelcometoVue”
/div
/template
script
exportdefault{
name:"Hi",
props:{hiMsg:String}//用來接收父組件傳值的props屬性hiMsg
/script
父組件代碼:
template
div
HelloWorldref="son"@click.native="change"/HelloWorld//定義ref屬性接收組件A傳來的數(shù)據(jù);點擊組件A觸發(fā)change()
Hi:hiMsg="msg"/Hi
//綁定組件B的hiMsg=msg,將數(shù)據(jù)轉(zhuǎn)發(fā)給組件B
/div
/template
script
importHelloWorldfrom"@/components/HelloWorld.vue";
importHifrom"@/components/Hi.vue";
exportdefault{
name:"Home",
data(){
return{msg:""}
methods:{
change(){
returnthis.msg=this.$refs.son.helloMsg//將組件A傳來的helloMsg賦予this.msg
}
components:{HelloWorld,Hi}
/script
頁級關(guān)系組件
在vuecli3.0以后,項目結(jié)構(gòu)對組件級別作了明確的區(qū)別:入口組件(App)-頁級組件(View)-零件組件(Component)。一般在開發(fā)中我們也會盡量按照這種結(jié)構(gòu)去劃分模塊,但頁級組件沒有父組件,如果說頁級組件之間需要傳值,那就不能用總線轉(zhuǎn)送的方法了。
vuex:這是官方提供的一個插件,可稱為狀態(tài)管理倉庫,用來管理項目中需要跨頁共享反復(fù)調(diào)用的狀態(tài)(狀態(tài)你可
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 校園食品安全管理制度
- 罕見腫瘤的腫瘤異質(zhì)性分析
- 2026天津中醫(yī)藥大學(xué)招聘58人備考題庫及參考答案詳解一套
- 2026廣東廣州大學(xué)招聘事業(yè)編制輔導(dǎo)員12人備考題庫(第一次)及答案詳解一套
- 2026天津市武清區(qū)“一區(qū)五園”面向社會招聘國企工作人員24人備考題庫及完整答案詳解
- 2026華東交通大學(xué)海外優(yōu)青項目全球引才備考題庫(含答案詳解)
- 同興會計事務(wù)所財務(wù)制度
- 佛協(xié)財務(wù)制度細(xì)則
- 汽車美容快修財務(wù)制度
- 農(nóng)村村委財務(wù)制度
- 2025-2026學(xué)年北京市昌平區(qū)高三(上期)期末考試英語試卷(含答案)
- 交通運輸安全檢查與處理規(guī)范(標(biāo)準(zhǔn)版)
- UCL介紹教學(xué)課件
- 扁鵲凹凸脈法課件
- 2026年開封大學(xué)單招職業(yè)適應(yīng)性測試題庫及完整答案詳解1套
- 北京市2025北京市體育設(shè)施管理中心應(yīng)屆畢業(yè)生招聘2人筆試歷年參考題庫典型考點附帶答案詳解(3卷合一)2套試卷
- 建筑施工現(xiàn)場材料采購流程
- DB31∕T 1234-2020 城市森林碳匯計量監(jiān)測技術(shù)規(guī)程
- 園林綠化施工工藝及注意事項
- 2025年高中語文必修上冊《登泰山記》文言文對比閱讀訓(xùn)練(含答案)
- 2025年金蝶AI蒼穹平臺新一代企業(yè)級AI平臺報告-
評論
0/150
提交評論