詳解Vue中$props、$attrs和$listeners的使用方法
背景
現(xiàn)在我們來(lái)討論一種情況,父組件與孫子組件怎么通信,我們有多少種解決方案?
- 我們使用VueX來(lái)進(jìn)行數(shù)據(jù)管理,但是如果項(xiàng)目中多個(gè)組件共享狀態(tài)比較少,項(xiàng)目比較小,并且全局狀態(tài)比較少,那使用VueX來(lái)實(shí)現(xiàn)該功能,并沒(méi)有發(fā)揮出VueX的威力。
- 使用B來(lái)做中轉(zhuǎn)站,當(dāng)A組件需要把信息傳給C組件時(shí),B接受A組件的信息,然后利用屬性傳給C組件, 這是一種解決方案,但是如果嵌套的組件過(guò)多,會(huì)導(dǎo)致代碼繁瑣,代碼維護(hù)比較困難;如果C中狀態(tài)的改變需要傳遞給A, 使用事件系統(tǒng)一級(jí)級(jí)往上傳遞 。
- 自定義一個(gè)Vue 中央數(shù)據(jù)總線(xiàn),這個(gè)情況適合碰到組件跨級(jí)傳遞消息,但是缺點(diǎn)是 碰到多人合作時(shí),代碼的維護(hù)性較低,代碼可讀性低
一、文檔描述
(1)$props:當(dāng)前組件接收到的 props 對(duì)象。Vue 實(shí)例代理了對(duì)其 props 對(duì)象屬性的訪問(wèn)。
(2)$attrs:包含了父作用域中不作為 prop 被識(shí)別 (且獲取) 的特性綁定 (class 和 style 除外)。
(3)$listeners:包含了父作用域中(不含 .native 修飾器的)v-on事件監(jiān)聽(tīng)器。他可以通過(guò) v-on="listeners"傳入內(nèi)部組件
二、具體使用
1、父組件
<template>
<div>
<div>父親組件</div>
<Child
:foo="foo"
:zoo="zoo"
@handle="handleFun"
>
</Child>
</div>
</template>
<script>
import Child from './Child.vue'
export default {
components: { Child },
data() {
return {
foo: 'foo',
zoo: 'zoo'
}
},
methods: {
// 傳遞事件
handleFun(value) {
this.zoo = value
console.log('孫子組件發(fā)生了點(diǎn)擊事件,我收到了')
}
}
}
</script>2. 兒子組件(Child.vue)
中間層,作為父組件和孫子組件的傳遞中介,在兒子組件中給孫子組件添加v-bind="$attrs",這樣孫子組件才能接收到數(shù)據(jù)。
$attrs是從父組件傳過(guò)來(lái)的,且兒子組件未通過(guò)props接收的數(shù)據(jù),例如zoo
<template>
<div class='child-view'>
<p>兒子組件--{{$props.foo}}與{{foo}}內(nèi)容一樣</p>
<GrandChild v-bind="$attrs" v-on="$listeners"></GrandChild>
</div>
</template>
<script>
import GrandChild from './GrandChild.vue'
export default {
// 繼承所有父組件的內(nèi)容
inheritAttrs: true,
components: { GrandChild },
props: ['foo'],
data() {
return {
}
}
}
</script>3. 孫子組件(GrandChild.vue)
在孫子組件中一定要使用props接收從父組件傳遞過(guò)來(lái)的數(shù)據(jù)
<template>
<div class='grand-child-view'>
<p>孫子組件</p>
<p>傳給孫子組件的數(shù)據(jù):{{zoo}}</p>
<button @click="testFun">點(diǎn)我觸發(fā)事件</button>
</div>
</template>
<script>
export default {
// 不想繼承所有父組件的內(nèi)容,同時(shí)也不在組件根元素dom上顯示屬性
inheritAttrs: false,
// 在本組件中需要接收從父組件傳遞過(guò)來(lái)的數(shù)據(jù),注意props里的參數(shù)名稱(chēng)不能改變,必須和父組件傳遞過(guò)來(lái)的是一樣的
props: ['zoo'],
methods: {
testFun() {
this.$emit('handle', '123')
}
}
}
</script>三、總結(jié)
從上面的代碼,可以看出使用attrs、inheritAttrs屬性 能夠使用簡(jiǎn)潔的代碼,將A組件的數(shù)據(jù)傳遞給C組件,該場(chǎng)景的使用范圍還是挺廣的。
通過(guò)listeners,我們?cè)赽組件上 綁定 v-on=”$listeners”, 在a組件中,監(jiān)聽(tīng)c組件觸發(fā)的事件。就能把c組件發(fā)出的數(shù)據(jù),傳遞給a組件。
到此這篇關(guān)于詳解Vue中$props、$attrs和$listeners的使用方法的文章就介紹到這了,更多相關(guān)Vue $props、$attrs和$listeners內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于Vue3和Plotly.js實(shí)現(xiàn)交互式3D圖
這篇文章主要介紹了基于Vue3和Plotly.js實(shí)現(xiàn)交互式3D圖,本代碼旨在為數(shù)據(jù)可視化提供一個(gè)交互式圖表,允許用戶(hù)動(dòng)態(tài)控制圖表中線(xiàn)條的顏色和可見(jiàn)性,此功能對(duì)于探索大型數(shù)據(jù)集或突出特定數(shù)據(jù)子集非常有用,需要的朋友可以參考下2024-07-07
Vue3集成Element-plus快速搭建頁(yè)面框架的過(guò)程
ElementPlus是一款基于Vue3的UI組件庫(kù),提供了豐富的組件和響應(yīng)式設(shè)計(jì),易于使用和主題定制,在Vue3項(xiàng)目中集成ElementPlus,需要通過(guò)npm安裝并引入組件,主題色可以通過(guò)修改樣式文件進(jìn)行全局設(shè)置,本文介紹Vue3集成Element-plus快速搭建頁(yè)面框架,感興趣的朋友一起看看吧2025-03-03
vue如何實(shí)現(xiàn)對(duì)請(qǐng)求參數(shù)進(jìn)行簽名
這篇文章主要介紹了vue如何實(shí)現(xiàn)對(duì)請(qǐng)求參數(shù)進(jìn)行簽名問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-01-01
Vue2.0 實(shí)現(xiàn)移動(dòng)端圖片上傳功能
本文主要介紹VUE2.0圖片上傳功能的實(shí)現(xiàn)。原理是通過(guò)js控制和input標(biāo)簽的方式完成這一效果,無(wú)需加載其他組件。具體實(shí)例大家大家參考下本文2018-05-05
vuepress打包之后頁(yè)面樣式丟失問(wèn)題的兩種解決方式
這篇文章主要介紹了vuepress打包之后頁(yè)面樣式丟失問(wèn)題的兩種解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

