vue中的$props


轉載  https://blog.csdn.net/viewyu12345/article/details/84031295

 

接觸一個東西,在技術上我們的一般思路是:這是個啥?怎么使用?有何存在意義?

本質探索
$props:當前組件接收到的 props 對象。Vue 實例代理了對其 props 對象屬性的訪問。

$attrs:包含了父作用域中不作為 prop 被識別 (且獲取) 的特性綁定 (class 和 style 除外)。

$listeners:包含了父作用域中的 (不含 .native 修飾器的) v-on 事件監聽器。它可以通過 v-on="$listeners" 傳入內部組件——在創建更高層次的組件時非常有用。

vuejs API

通過舉個例子來聊聊。下面有一個子組件和一個父組件,引入就不詳細了,寫上template模板。

//childrenProp.vue(子組件)
<template>
<label>
<input v-on:input="$emit('input', $event.target.value)">
</label>
</template>
// 父組件
<template>
<div>
<chidrenProp
v-model="username"
label="pyc"
value="12"
class="username-input"
placeholder="Enter your username">
</chidrenProp>
</div>
</template>
在childrenProp.vue組件中,我們來打印一下:

 

從上面打印的結果總結:

beforeCreate執行的時候,props還沒有之執行,也就是undefined,但是$attrs和$listeners已經有了。

我們在mounted中打印一下實例看看:

 

 

 這三個屬性就很明了結合官方解釋理解一下。

注意:上面我們在父組件中明明沒有綁定input事件,但是截圖看$listeners里面出現了input屬性,通過實踐發現,是v-model引起的。也就是默認就有這個input事件,這樣才能動態改動值。

繼承原生屬性
比如上面的例子,input輸入框。我們有很多的原生屬性,比如:name、placeholder、disabled等等。我們如果都定義在props顯示接收,未免太過繁瑣。所以官網出現了:v-bind="$props"這樣的操作。v-bind

如果父組件傳遞很多的原生屬性,那么我們在子組件中直接可以:

//good
<input v-bind="$props">

//bad
//而不是下面這樣,如果很多的屬性就特別繁瑣
<input :name="name" :placeholder="placeholder" :disabled="disabled">
繼承自定義組件的屬性
用於多級組件嵌套需要傳遞數據的時候,如果僅僅是傳遞數據,使用vuex就有點大材小用。

我們就可以直接使用上面的v-bind的方法,將值傳遞過去。具體參見 嵌套組件傳遞數據,$attrs

inheritAttrs屬性
默認為true,繼承所有的父組件屬性(除props的特定綁定)作為普通的HTML特性應用在子組件的根元素上,如果你不希望組件的根元素繼承特性設置inheritAttrs: false,但是class屬性會繼承。

上面的組件childrenProp.vue,我們在不設置inheritAttrs屬性也就是默認為true的時候,看看DOM渲染。

 

那么如果設置為false呢?

 

結合定義,就很清楚了解了。

自己也在學習中,就比如$props屬性也是新增2.2.0新增的。一起學習交流吧

參考:
https://zhuanlan.zhihu.com/p/25623356

https://github.com/jkchao/blog/issues/15

官網API
————————————————
版權聲明:本文為CSDN博主「雨中暢游」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/viewyu12345/article/details/84031295

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM