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