Vue組件高級(jí)通訊之$attrs與$listeners
$attrs和$listeners
我們都知道父子組件的通信可以使用props和$emit
的方式,但是如果進(jìn)行父子組件和孫子組件的通訊使用props和$emit
的話就比較復(fù)雜了,需要層層傳遞。而,$attrs和$listeners
就減少了子組件的代碼。它打通了父組件和孫組件之間的阻礙。
$attrs
官方介紹:
當(dāng)父組件傳數(shù)據(jù)給子組件的時(shí)候,如果子組件的props
沒(méi)有進(jìn)行接收,那數(shù)據(jù)就會(huì)被收集到子組件的$attrs里面
,在子組件上使用v-bind="$attrs"
可以直接將值傳給當(dāng)前組件的子組件(也就是孫組件),即使是v-model依舊可以傳遞。
默認(rèn)情況下父作用域的不被認(rèn)作props的attribute綁定 (attribute bindings)
將會(huì)“回退”且作為普通的 HTML attribute 應(yīng)用在子組件的根元素上。
當(dāng)撰寫包裹一個(gè)目標(biāo)元素或另一個(gè)組件的組件時(shí),這可能不會(huì)總是符合預(yù)期行為。
通過(guò)設(shè)置 inheritAttrs 到 false,這些默認(rèn)行為將會(huì)被去掉。
而通過(guò) (同樣是 2.4 新增的) 實(shí)例 property $attrs 可以讓這些attribute生效,
且可以通過(guò) v-bind 顯性的綁定到非根元素上。
$listeners
官方介紹:
舉例
父組件
<template> <div class="app"> <h3>我是爺爺組件</h3> <Parent :data1="data1" :data2="data2" :data3="data3" @fun1="fun1" @fun2="fun2"></Parent> </div> </template> <script> import Parent from './components/Parent.vue' export default { name: "App", components: { Parent }, data() { return { data1: '數(shù)據(jù)1', data2: '數(shù)據(jù)2', data3: '數(shù)據(jù)3' } }, methods: { fun1(val) { console.log('通過(guò)子組件觸發(fā)', val); }, fun2(val) { console.log('通過(guò)子組件觸發(fā)', val); } } } </script>
子組件
<template> <div class="parent"> <h3>我是父組件</h3> <Son v-bind="$attrs" v-on="$listeners"></Son> </div> </template> <script> import Son from './Son' export default { //禁用將數(shù)據(jù)顯示在組件根元素的默認(rèn)操作 inheritAttrs: false, name: 'Parent', props: { data1: { type: String, default: '' } }, components: { Son }, created() { console.log(this.$attrs, this.$listeners, 'this.$attrs,this.$listeners'); //data2: "數(shù)據(jù)2", data3: "數(shù)據(jù)3",fun1, fun2 }, } </script>
孫組件
<template> <div class="son"> <h3>我是子組件</h3> 這是爺爺?shù)臄?shù)據(jù){{user}} <br> 這是自己的數(shù)據(jù){{myUser}}<br> <button @click="toParent">傳遞數(shù)據(jù)給父組件</button> </div> </template> <script> import Son from './Son' export default { name: 'Son', components: { Son }, props: { //接收父組件的數(shù)據(jù) data2: { type: String, default: '' }, data3: { type: String, default: '' } }, created() { console.log(this.data2, this.data3, '$attrs'); }, methods: { toParent() { //觸發(fā)父組件的方法 this.$emit('fun1', '我是孫組件數(shù)據(jù)') } } } </script>
以上就是Vue組件高級(jí)通訊之$attrs與$listeners的詳細(xì)內(nèi)容,更多關(guān)于Vue組件通訊$attrs $listeners的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
基于Vue2實(shí)現(xiàn)移動(dòng)端圖片上傳、壓縮、拖拽排序、拖拽刪除功能
這篇文章主要介紹了基于Vue2實(shí)現(xiàn)移動(dòng)端圖片上傳、壓縮、拖拽排序、拖拽刪除功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01vue在IIS服務(wù)器部署后路由無(wú)法跳轉(zhuǎn)
在IIS服務(wù)器上部署Vue項(xiàng)目時(shí),可能會(huì)遇到路由無(wú)法正常跳轉(zhuǎn)的問(wèn)題,解決方法有兩種,下面就來(lái)具體介紹一下解決方法,感興趣的可以了解一下2024-10-10vue模態(tài)框?qū)崿F(xiàn)動(dòng)態(tài)錨點(diǎn)
這篇文章主要為大家詳細(xì)介紹了vue模態(tài)框?qū)崿F(xiàn)動(dòng)態(tài)錨點(diǎn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-07-07vue3組件的v-model:value與v-model的區(qū)別解析
在Vue3中,v-model和v-model:value都是用于實(shí)現(xiàn)雙向數(shù)據(jù)綁定的語(yǔ)法糖,但v-model:value提供了更顯式和靈活的綁定方式,允許你明確指定綁定的屬性名和事件名,它們的主要區(qū)別在于默認(rèn)行為、靈活性、多模型綁定和使用場(chǎng)景,感興趣的朋友一起看看吧2025-02-02vue使用eventBus遇到數(shù)據(jù)不更新的問(wèn)題及解決
這篇文章主要介紹了vue使用eventBus遇到數(shù)據(jù)不更新的問(wèn)題及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08vue實(shí)現(xiàn)移動(dòng)端省市區(qū)選擇
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)移動(dòng)端省市區(qū)選擇,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09Electron主進(jìn)程(Main?Process)與渲染進(jìn)程(Renderer?Process)通信詳解
這篇文章主要介紹了Electron主進(jìn)程(Main?Process)與渲染進(jìn)程(Renderer?Process)通信,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-03-03Vue如何動(dòng)態(tài)修改el-table的某列數(shù)據(jù)
這篇文章主要介紹了Vue如何動(dòng)態(tài)修改el-table的某列數(shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04