props屬性
與 非props屬性
這是兩個很是簡單的概念,可是卻很是重要,只有理解了他們,會更有利於咱們理解inheritAttrs
和 $attrs
。html
非props屬性官方解釋是:一個非 prop 特性是指傳向一個組件,可是該組件並無相應 prop 定義的特性。
dom
例如:假設我定義了一個組件child-comp
以下:ui
<template> <div id="child-comp"> <div>{{ foo }}</div> <div>{{ coo }}</div> </div> </template> <script> export default { name: 'child-comp', props: ['foo', 'coo'],//propps屬性 data() { return { } }, } </script>
而後父組件調用的時候:spa
<template> <child-comp :foo='param_a' :coo='param_b'></child-comp> </template> <script> import ChildComp from './child-comp' export default { components: { ChildComp }, data() { return { param_a: 'aaa', param_b: 'bbb' } } } </script>
結論:在調用子組件child-comp
的時候,咱們傳遞過去的屬性foo
、coo
,由於在組件child-comp
中已經經過props
屬性定義了,因此叫props
屬性;若是未定義,例如:child-comp
的props
中只定義了foo
屬性,那麼傳遞過去的coo
就是非props屬性
了。
非props屬性
的特色:會在組件根(dom)節點上添加html
屬性。code
假設:咱們把調用child-comp
組件的代碼改成:component
<child-comp :foo='param_a' :coo='param_b' :doo="'xxxxxx'"></child-comp>
其實只是多傳遞了一個參數:doo="'xxxxxx'"
,由於未在子組件child-comp
中定義,因此是非props屬性
,當咱們f12
查看生成的html
時,會看到以下:htm
inheritAttrs
屬性以及做用在咱們知道了props屬性
和非props屬性
的前提下,inheritAttrs
屬性就很是好理解了。blog
結論:當一個組件設置了inheritAttrs: false
後(默認爲true),那麼該組件的非props屬性
將不會在組件根節點上生成html屬性。
例如上面的例子中,雖然傳遞了非props屬性
:doo
,可是若是你把組件child-comp
的屬性inheritAttrs
設爲false
,那麼你將看到以下情景:事件
$attrs
屬性及其做用$attrs
其實就是非props屬性
的集合,假設調用子組件代碼以下:圖片
<child-comp :foo='param_a' :coo='param_b' :doo="'xxxxxx'"></child-comp>
而子組件只定義了props
屬性foo
,那麼,在child-comp
使用$attrs
就至關於獲取到了coo
、doo
這兩個非props屬性
了:
<template> <div id="child-comp"> <div>{{ foo }}</div> <div>{{ $attrs }}</div> </div> </template> <script> export default { inheritAttrs: false, name: 'child-comp', props: ['foo'],//propps屬性 } </script>
$listeners
屬性及其做用$attrs
和$listeners
實際上是很是相似的,前者表示組件的非props屬性
的集合,而$listeners
則表示全部傳遞過來的事件的集合
。
這在跨組件深層次傳遞數據和綁定事件很是有用。
假設一個場景:咱們有三個組件,引用關係是a組件
引用b組件
,b組件
引用c組件
,咱們須要把a組件
中的數據傳遞到c組件
中,而c組件
經過$emit
把數據回傳到a組件
,這就是前面說的——a引用b,b引用c,按照之前的作法,咱們須要在b中定義一些和b無關的屬性和事件方法,這嚴重污染了b組件,顯然很不理想。用了$attrs
和 $listeners
,那麼b組件就很是簡單了:
<b-comp v-bind="$attrs" v-on="$listeners"></b-comp>