淺談Vue2.4.0 $attrs與inheritAttrs的具體使用
vue父子組件之間的傳值我們都知道使用props和emit,但是祖孫之間的傳值在以前,我們都需要子輩作為中間人,當(dāng)祖輩有值要傳遞給孫輩時(shí),需要子輩作為中間人把值傳遞給孫輩,當(dāng)孫輩想要改變祖輩的值時(shí),需要先emit子輩的方法,然后子輩再emit父輩的方法從而改變祖輩的值,如果是多級組件嵌套的話,那么祖孫輩之間傳值,就會變得非常的繁瑣,為了解決這個(gè)需求,vue2.4版本產(chǎn)生了$attrs,$listeners,inheritAttrs這三個(gè)屬性。
vm.$attrs
vm.$attrs
2.4.0 新增,類型:{ [key: string]: string },只讀
詳細(xì):
包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。當(dāng)一個(gè)組件沒有聲明任何 prop 時(shí),這里會包含所有父作用域的綁定 (class 和 style 除外),并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件——在創(chuàng)建高級別的組件時(shí)非常有用。
使用介紹
從官方介紹我們可以得出 $attrs 應(yīng)用于父子傳值場景下,子組件通過 $attrs 可以訪問父組件傳過來的所有屬性,但需要注意的是如果父組件所傳的屬性中有在子組件 props 中有過聲明,那么該屬性不會出現(xiàn)在 $attrs 對象中。
上示例
<template> <div> <p>我是父組件</p> <test name="tom" :age="12" :id="12345" class="child" style="color: red" /> </div> </template> <script> export default { components: { test: { template: ` <div> <p>我是子組件</p> <test2 v-bind="$attrs" s1="sss" s2="sss" /> </div>`, props: ["name"], created() { console.log(this.$attrs); // {age: 12, id: 12345} }, components: { test2: { template: `<p>我是孫子組件</p>`, props: ["age", "s1"], created() { console.log(this.$attrs); // {s2: "sss", id: 12345} } } } } } }; </script>
首先可以看到父組件傳給子組件傳了 name、age、id、class、style 五個(gè)屬性,其中 name 屬性在子組件 props 中聲明,又因?yàn)?class 和 style 屬性會被 $attrs 除外,最終在子組件打印的 $attrs 輸出了 {age: 12, id: 12345}
接著,子組件把自己的 $attrs 對象傳給了孫子組件,同時(shí)又給孫子組件傳了 s1、s2 兩個(gè)屬性,孫子組件在自己的屬性 props 中聲明了 age 、s1 兩個(gè)屬性,最終打印輸出 {s2: "sss", id: 12345} 可以看到,孫子組件的 $attrs 合并了從父組件和子組件傳來的屬性,并把 props 中聲明的屬性除外
至此 $attrs 的介紹結(jié)束,下面開始介紹 inheritAttrs
inheritAttrs
inheritAttrs
2.4.0 新增,類型:boolean,默認(rèn)值:true
詳細(xì):
默認(rèn)情況下父作用域的不被認(rèn)作 props 的特性綁定 (attribute bindings) 將會“回退”且作為普通的 HTML 特性應(yīng)用在子組件的根元素上。當(dāng)撰寫包裹一個(gè)目標(biāo)元素或另一個(gè)組件的組件時(shí),這可能不會總是符合預(yù)期行為。通過設(shè)置 inheritAttrs 到 false,這些默認(rèn)行為將會被去掉。而通過 (同樣是 2.4 新增的) 實(shí)例屬性 $attrs 可以讓這些特性生效,且可以通過 v-bind 顯性的綁定到非根元素上。
注意:這個(gè)選項(xiàng)不影響 class 和 style 綁定。
使用介紹
官方的解釋看上去很唬人,其實(shí)默認(rèn)情況就是把 $attrs 對象上沒在子組件 props 中聲明的屬性加在子組件的根 html 標(biāo)簽上
上示例
<template> <div> <p>我是父組件</p> <test name="tom" age="12" class="child" style="color: red" /> </div> </template> <script> export default { components: { test: { template: `<p>我是子組件</p>`, props: ["name"], inheritAttrs: true, // 默認(rèn)為 true created() { console.log(this.$attrs); // {age: "12"} } } } }; </script>
可以看到父組件傳給子組件傳了 name、age 兩個(gè)屬性,其中 name 屬性在子組件 props 中聲明,以上代碼瀏覽器解析后
<div> <p data-v-469af010>我是父組件</p> <p data-v-469af010 age="12" class="child" style="color: red;">我是子組件</p> </div>
可以看到?jīng)]有在子組件 props 中聲明的 age 屬性被寫到了標(biāo)簽里,如果你不希望這樣,則可以把子組件中的 inheritAttrs 設(shè)為 false,解析后的結(jié)果如下
<div> <p data-v-469af010>我是父組件</p> <p data-v-469af010 class="child" style="color: red;">我是子組件</p> </div>
可以看到標(biāo)簽中的屬性消失了,同時(shí)可以看到 class、style 屬性不受影響
至此 inheritAttrs 的介紹結(jié)束
到此這篇關(guān)于淺談Vue2.4.0 $attrs與inheritAttrs的具體使用的文章就介紹到這了,更多相關(guān)Vue2.4.0 $attrs與inheritAttrs內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vuex實(shí)現(xiàn)登錄狀態(tài)的存儲,未登錄狀態(tài)不允許瀏覽的方法
下面小編就為大家分享一篇vuex實(shí)現(xiàn)登錄狀態(tài)的存儲,未登錄狀態(tài)不允許瀏覽的方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-03-03vue中Form 表單的 resetFields() 失效原因及問題解決
在Vue項(xiàng)目中,使用formRef.value.resetFields()方法重置表單時(shí)可能遇到不起作用的問題,下面就來介紹一下如何解決,感興趣的可以了解一下2024-09-09Vue使用Echarts實(shí)現(xiàn)橫向柱狀圖,并通過WebSocket即時(shí)通訊更新
這篇文章主要介紹了Vue使用Echarts實(shí)現(xiàn)橫向柱狀圖,并通過WebSocket即時(shí)通訊更新方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03vue項(xiàng)目中的支付功能實(shí)現(xiàn)(微信支付和支付寶支付)
本文主要介紹了vue項(xiàng)目中的支付功能實(shí)現(xiàn)(微信支付和支付寶支付),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Vue?Electron實(shí)現(xiàn)輸入法自動刷字?jǐn)?shù)功能詳解
這篇文章主要介紹了Vue?Electron實(shí)現(xiàn)輸入法自動刷字?jǐn)?shù)功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12vue實(shí)現(xiàn)滾動鼠標(biāo)滾輪切換頁面
這篇文章主要為大家詳細(xì)介紹了vue實(shí)現(xiàn)滾動鼠標(biāo)滾輪切換頁面,類似于縱向走馬燈,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12Vue中this.$router.push參數(shù)獲取方法
下面小編就為大家分享一篇Vue中this.$router.push參數(shù)獲取方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02vue實(shí)現(xiàn)畫筆回放canvas轉(zhuǎn)視頻播放功能
這篇文章主要介紹了vue實(shí)現(xiàn)畫筆回放,canvas轉(zhuǎn)視頻播放功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01