Vue中props的詳解
看一下官方文檔:
組件實例的作用域是孤立的。這意味著不能 (也不應(yīng)該) 在子組件的模板內(nèi)直接引用父組件的數(shù)據(jù)。父組件的數(shù)據(jù)需要通過 prop 才能下發(fā)到子組件中。
也就是props是子組件訪問父組件數(shù)據(jù)的唯一接口。
詳細一點解釋就是:
一個組件可以直接在模板里面渲染data里面的數(shù)據(jù)(雙大括號)。
子組件不能直接在模板里面渲染父元素的數(shù)據(jù)。
如果子組件想要引用父元素的數(shù)據(jù),那么就在prop里面聲明一個變量(比如a),這個變量就可以引用父元素的數(shù)據(jù)。然后在模板里渲染這個變量(前面的a),這時候渲染出來的就是父元素里面的數(shù)據(jù)。
1. 基本用法
圖1-props
<div id="app1"> <!-- hello引用父元素的hello,它也可以引用message,greet,world等 --> <child :hello='hello'></child> </div> <script> var com1 = Vue.component('child',{ // 聲明在prop中的變量可以引用父元素的數(shù)據(jù) props:['hello'], // 這里渲染props中聲明的那個hello template:'<div><p>{{ hello }}</p></div>', }) var app1 = new Vue ({ el: '#app1', data: { greet: { hello:'hello,', world: 'world', }, message: 'message1', } }) </script>
2. camelCase vs. kebab-case:js中用駝峰式命名,在html中替換成短橫線分隔式命名
<!-- 在 HTML 中使用 kebab-case --> <child my-message="hello!"></child> <script> Vue.component('child', { // 在 JavaScript 中使用 camelCase props: ['myMessage'], template: '<span>{{ myMessage }}</span>' }) </script>
3.單向數(shù)據(jù)流: props是單向綁定的
當(dāng)父組件的屬性變化時,將傳導(dǎo)給子組件,但是反過來不會。
每次父組件更新時,子組件的所有 prop 都會更新為最新值。
不要在子組件內(nèi)部改變 prop。如果你這么做了,Vue 會在控制臺給出警告。
在兩種情況下,我們很容易忍不住想去修改 prop 中數(shù)據(jù):
- Prop 作為初始值傳入后,子組件想把它當(dāng)作局部數(shù)據(jù)來用;
- Prop 作為原始數(shù)據(jù)傳入,由子組件處理成其它數(shù)據(jù)輸出。
對這兩種情況,正確的應(yīng)對方式是:
定義一個局部變量,并用 prop 的值初始化它:
props: ['initialCounter'], data: function () { return { counter: this.initialCounter } }
定義一個計算屬性,處理 prop 的值并返回:
props: ['size'], computed: { normalizedSize: function () { return this.size.trim().toLowerCase() } }
注意在 JavaScript 中對象和數(shù)組是引用類型,指向同一個內(nèi)存空間,如果 prop 是一個對象或數(shù)組,在子組件內(nèi)部改變它會影響父組件的狀態(tài)。
舉個例子:
<div id="app3"> <my-component :object='object'></my-component> </div> <script src="http://vuejs.org/js/vue.min.js"></script> <script> // var mycom = Vue.component('my-component', { //添加一個input改變子組件的childOject,那么父元素的object也會被改變,但是Vue沒有報錯! template: '<p>{{ object.name }} is {{ object.age }} years old.<br><input v-model="childObject.name" type="text"></p>', props: ['object','school'], data: function () { // 子組件的childObject 和 父組件的object 指向同一個對象 return { childObject: this.object } } }); var app3 = new Vue({ el: '#app3', data: { object:{ name: 'Xueying', age: '21', }, school:'SCUT', }, }) </script>
圖2-改變childObject.name,object.name也改變
圖3-控制臺輸出app3.object.name
4. props驗證
可以為prop指定驗證規(guī)則,如果傳入的數(shù)據(jù)不符合要求,Vue會發(fā)出警告。
具體驗證規(guī)則見官方文檔:Prop驗證規(guī)則
5. $parent
$parent 也可以用來訪問父組件的數(shù)據(jù)。
而且子組件可以通過$parent 來直接修改父組件的數(shù)據(jù),不會報錯!
可以使用props的時候,盡量使用props顯式地傳遞數(shù)據(jù)(可以很清楚很快速地看出子組件引用了父組件的哪些數(shù)據(jù))。
另外在一方面,直接在子組件中修改父組件的數(shù)據(jù)是很糟糕的做法,props單向數(shù)據(jù)流就沒有這種顧慮了。
以上所述是小編給大家介紹的Vue中props的詳解詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Mint UI組件庫CheckList使用及踩坑總結(jié)
這篇文章主要介紹了Mint UI組件庫CheckList使用及踩坑總結(jié),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12詳解Vue.js iview實現(xiàn)樹形權(quán)限表(可擴展表)
這篇文章主要介紹了詳解Vue.js iview實現(xiàn)樹形權(quán)限表(可擴展表),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-09-09Vue?3?使用moment設(shè)置顯示時間格式的問題及解決方法
在Vue?3中,因為過濾器(filter)已經(jīng)被廢棄,取而代之的是全局方法(global?method),本文給大家介紹Vue?3?使用moment設(shè)置顯示時間格式的問題及解決方法,感興趣的朋友一起看看吧2023-12-12vue項目打包后,由于html被緩存導(dǎo)致出現(xiàn)白屏的處理方案
這篇文章主要介紹了vue項目打包后,由于html被緩存導(dǎo)致出現(xiàn)白屏的處理方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03vue如何修改data中的obj數(shù)據(jù)的屬性
這篇文章主要介紹了vue如何修改data中的obj數(shù)據(jù)的屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08