inheritAttrs期丰、vm.$listeners 群叶、vm.$attrs 詳解

inheritAttrs

組件的根元素是否繼承不被認(rèn)作 props的特性,默認(rèn)true

//父組件
<template>
   <div>
     <child-dom
      :foo="foo"
      :coo="coo"
     >
     </child-dom>
   </div>
</template>
<script>
   import childDom from "../components/Father2-Child";
   export default {
     data() {
        return {
          foo:"Hello, world",
          coo:"Hello,rui"
        }
     },
     components:{childDom},
   }
</script>
//子組件
<template>
   <div>
      <p>foo:{{foo}}</p>
   </div>
</template>
<script>
export default {
 name:'child-dom',
 props:["foo"],
}
</script>

查看DOM結(jié)構(gòu)钝荡,結(jié)構(gòu)如下


因?yàn)樽咏M件中沒有prop為coo這個(gè)屬性盖呼,所以繼承了父組件的特性,如果在子組件的props里接收coo則DOM中就不會(huì)有這個(gè)屬性

在2.4中新增選項(xiàng)inheritAttrs inheritAttrs的默認(rèn)值為true, 將inheritAttrs的值設(shè)為false, 這些默認(rèn)的行為會(huì)禁止掉。

//子組件
<template>
   <div>
      <p>foo:{{foo}}</p>
   </div>
</template>
<script>
export default {
 name:'child-dom',
 props:["foo"],
 inheritAttrs:false,
}
</script>
子組件加了inheritAttrs:false化撕,就不會(huì)繼承父組件的特性了

但是通過實(shí)例屬性vm.$attrs ,可以將這些特性生效,且可以通過v-bind 綁定到子組件的非根元素上约炎。

vm.$attrs

//父組件
<template>
   <div>
     <child-dom
      :foo="foo"
      :coo="coo"
     >
     </child-dom>
   </div>
</template>
<script>
   import childDom from "../components/Father2-Child";
   export default {
     data() {
        return {
          foo:"Hello, world",
          coo:"Hello,rui"
        }
     },
     components:{childDom},
   }
</script>
//子組件
<template>
   <div>
      <p>foo:{{foo}}</p>
      <p>attrs:{{$attrs}}</p>
      <childDomChild v-bind="$attrs"></childDomChild>
   </div>
</template>
<script>
import childDomChild from '../components/Father2-Child-Child';
export default {
 name:'child-dom',
 props:["foo"],
 inheritAttrs:false,
 components:{childDomChild}
}
</script>
//孫子組件
<template>
  <div>
   <p>coo:{{coo}}</p>
  </div>
</template>
<script>
  export default {
    name:'childDomChild',
    props:["coo"],
    inheritAttrs:false
  }
</script>
輸出結(jié)果:子組件和孫子組件通過$attrs獲取到父組件的特性

綜上所述:可以通過$attrs屬性將父組件的數(shù)據(jù)傳遞給子組件植阴、孫子組件

注意:
$attrs僅包含了父作用域中不作為 prop 被識(shí)別的特性 (class 和 style 除外)

那么問題來了,孫子組件的信息怎么同步給父組件呢圾浅?下面我們就來解決這個(gè)問題

vm.$listeners

vue2.4版本新增了$listeners屬性掠手,它是一個(gè)對(duì)象,里面包含了作用在這個(gè)組件上的所有監(jiān)聽器狸捕,有了這個(gè)$listeners屬性喷鸽,你就可以配合 v-on="$listeners"將所有的事件監(jiān)聽器指向這個(gè)組件的某個(gè)特定的子元素。

我們?cè)谧咏M件上 綁定v-on=”$listeners”, 就可以在父組件中監(jiān)聽孫子組件觸發(fā)的事件灸拍,就能把孫子組件發(fā)出的數(shù)據(jù)做祝,傳遞給父組件砾省。

//父組件
<template>
 <div>
    {{coo}}
   <child-dom
    :foo="foo"
    :coo="coo"
     @upRocket="reciveRocket">
   </child-dom>
 </div>
</template>
<script>
 import childDom from "../components/Father2-Child";
 export default {
   name:'demoNo',
   data() {
        return {
            foo:"Hello, world",
            coo:"Hello,rui"
        }
    },
    components:{childDom},
    methods:{
        reciveRocket(ev){
            this.coo = ev;//改變數(shù)據(jù)
            console.log(this.coo)
        }
    }
}
</script>
//子組件
<template>
    <div>
        <p>foo:{{foo}}</p>
        <p>attrs:{{$attrs}}</p>
        <childDomChild v-bind="$attrs" v-on="$listeners"></childDomChild>
    </div>
</template>
<script>
import childDomChild from '../components/Father2-Child-Child';
export default {
    name:'child-dom',
    props:["foo"],
    inheritAttrs:false,
    components:{childDomChild}
}
</script>
//孫子組件
<template> 
    <div>
    <p>coo:{{coo}}</p>
    <button @click="startUpRocket">我要發(fā)射火箭</button>
    </div>
</template>
<script>
 export default {
    name:'childDomChild',
    props:['coo'],
    methods:{
        startUpRocket(){
            this.$emit("upRocket",'簡單我的簡單');
        }      
    }
 }
</script>
輸出結(jié)果

點(diǎn)擊“我要發(fā)射火箭”后的結(jié)果

至此,孫子組件向父組件傳遞數(shù)據(jù)的問題也解決了

綜上所述:vm.$attrsvm.$listeners 可以解決“父組件”和“子組件”混槐、“孫子組件”编兄、“曾孫子組件”等后代組件的通訊問題

  • inheritAttrs

默認(rèn)情況下父作用域的不被認(rèn)作 props 的特性綁定 (attribute bindings) 將會(huì)“回退”且作為普通的 HTML 特性應(yīng)用在子組件的根元素上。當(dāng)撰寫包裹一個(gè)目標(biāo)元素或另一個(gè)組件的組件時(shí)声登,這可能不會(huì)總是符合預(yù)期行為狠鸳。通過設(shè)置 inheritAttrs 為 false,這些默認(rèn)行為將會(huì)被去掉悯嗓。而通過 (同樣是 2.4 新增的) 實(shí)例屬性 $attrs 可以讓這些特性生效件舵,且可以通過 v-bind 顯性的綁定到非根元素上。

注意:這個(gè)選項(xiàng)不影響 class 和 style 綁定脯厨。

  • vm.$attrs

包含了父作用域中不作為 prop 被識(shí)別的特性綁定 (class 和 style 除外)铅祸。當(dāng)一個(gè)組件沒有聲明任何 prop 時(shí),這里會(huì)包含所有父作用域的綁定 (class 和 style 除外)俄认,并且可以通過 v-bind="$attrs" 傳入內(nèi)部組件——在創(chuàng)建多級(jí)的組件時(shí)非常有用个少。

  • vm.$listeners

包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監(jiān)聽器。它可以通過 v-on="$listeners"傳入內(nèi)部組件——在創(chuàng)建更高層次的組件時(shí)非常有用眯杏。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末夜焦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子岂贩,更是在濱河造成了極大的恐慌茫经,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異豁护,居然都是意外死亡歪泳,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門荤傲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人颈渊,你說我怎么就攤上這事遂黍。” “怎么了俊嗽?”我有些...
    開封第一講書人閱讀 164,133評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵雾家,是天一觀的道長。 經(jīng)常有香客問我绍豁,道長芯咧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮敬飒,結(jié)果婚禮上邪铲,老公的妹妹穿的比我還像新娘。我一直安慰自己驶拱,他們只是感情好霜浴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,585評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蓝纲,像睡著了一般阴孟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上税迷,一...
    開封第一講書人閱讀 51,462評(píng)論 1 302
  • 那天永丝,我揣著相機(jī)與錄音,去河邊找鬼箭养。 笑死慕嚷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的毕泌。 我是一名探鬼主播喝检,決...
    沈念sama閱讀 40,262評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼撼泛!你這毒婦竟也來了挠说?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤愿题,失蹤者是張志新(化名)和其女友劉穎损俭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體潘酗,經(jīng)...
    沈念sama閱讀 45,587評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杆兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,792評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仔夺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琐脏。...
    茶點(diǎn)故事閱讀 39,919評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缸兔,靈堂內(nèi)的尸體忽然破棺而出日裙,到底是詐尸還是另有隱情,我是刑警寧澤灶体,帶...
    沈念sama閱讀 35,635評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站掐暮,受9級(jí)特大地震影響蝎抽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,237評(píng)論 3 329
  • 文/蒙蒙 一樟结、第九天 我趴在偏房一處隱蔽的房頂上張望养交。 院中可真熱鬧,春花似錦瓢宦、人聲如沸碎连。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鱼辙。三九已至,卻和暖如春玫镐,著一層夾襖步出監(jiān)牢的瞬間倒戏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評(píng)論 1 269
  • 我被黑心中介騙來泰國打工恐似, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杜跷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,048評(píng)論 3 370
  • 正文 我出身青樓矫夷,卻偏偏與公主長得像葛闷,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子双藕,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,864評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容