Vue 子組件更新props中的屬性值問題
Vue子組件更新props的屬性值
在子組件中更新props中的屬性值,并且更新到父組件,有兩種實現(xiàn)方式:.sync 和 自定義v-model
.sync屬性
父組件在給子組件傳值時,屬性名后需要加修飾符.sync,格式 :子組件props屬性名.sync
父組件
<template> <div id="app"> ? ? // 注意點一、:show后跟修飾符.sync ? ? // 等同于<my-componen :show="valueChild" @update:show="val => valueChild= val" /> ? ? <my-component :show.sync='valueChild' /> </div> </template> <script> export default { ? ? data(): { ? ? ? ? return {valueChild: false} ? ? } } </script>
子組件
<template> ? ? <h3>{{show}}</h3> ? ? <button @click="eventOpt">子組件事件</button> </template> <script> export default { ? ?props: { ? ? ? ?show: { type: Boolean, default: false} ? ? } , ? ? methods: { ? ? ? ? eventOpt() { ? ? ? ? ? ? // 注意二、事件名必須為update:屬性名 ? ? ? ? ? ? // 更改prop中的屬性show的屬性值,同時更新父組件中中valueChild的屬性值 ? ? ? ? ? ? ?this.$emit('update:show', false); ? ? ? ? } ? ? } } </script>
v-model應(yīng)用
子組件定義的屬性名必須為 value
父組件向上彈射事件給子組件時,事件名必須為 input
父組件
<template> <div id="app"> ? ?// 等同于<my-componen :value="valueChild" @input="val => valueChild= val" /> ? ? <my-component :value='valueChild' /> </div> </template> <script> export default { ? ? data(): { ? ? ? ? return {valueChild: false} ? ? } } </script>
子組件
<template> ? ? <h3>{{show}}</h3> ? ? <button @click="eventOpt">子組件事件</button> </template> <script> export default { ? ?props: { ? ? ?// 注意點一、屬性名必須為value ? ? ? value: { type: Boolean, default: false} ? ? } , ? ? methods: { ? ? ? ? eventOpt() { ? ? ? ? ? ? // 注意二、事件名必須為input ? ? ? ? ? ? // 更改prop中的屬性show的屬性值,同時更新父組件中中valueChild的屬性值 ? ? ? ? ? ? ?this.$emit('input', false); ? ? ? ? } ? ? } } </script>
比較
v-model 子組件只能更改props中的一個屬性值value;
.sync 子組件可以更改props中的多個屬性值;
Vue子組件中修改Props的幾種情況
首先列舉平常使用Vue 父組件傳遞數(shù)據(jù)到子組件的幾種情況
- 傳遞的是基礎(chǔ)數(shù)據(jù)類型(Number,Boolean,String)
- 傳遞的是引用類型(Object,Array)
針對以上幾種情況再逐一進行分析
1.首先定義一個子組件ChildComponent
<template> ? ? <div> ? ? ? ? 我是子組件 ? ? ? ? <input v-if="usePrimary" v-model="primaryType"/> ? ? ? ? <input v-else v-model="objectType.value"/> ? ? </div> </template>
props:{ ? ? ? ? primaryType:{ ? ? ? ? ? ? type:String, ? ? ? ? ? ? default:'' ? ? ? ? }, ? ? ? ? usePrimary:{ ? ? ? ? ? ? type:Boolean, ? ? ? ? ? ? default:true ? ? ? ? }, ? ? ? ? objectType:{ ? ? ? ? ? ? type:Object ? ? ? ? } ? ? }
2.然后在父組件中賦值
<child-component? ? ? class="child-component" ? ? :primaryType="primaryType" ? ? :object-type="objectType" ? ? :use-primary="usePrimary" ></child-component>
data(){ ? ?return{ ? ? ? ? primaryType:'我是基礎(chǔ)數(shù)據(jù)類型', ? ? ? ? objectType:{value:'我是引用類型'}, ? ? ? ? usePrimary:false ? ? } ?}
變量 usePrimary 用于控制子組件 input 的v-model引用的類型 當(dāng)值為true 時表示v-model的類型為 基礎(chǔ)數(shù)據(jù)類型,當(dāng)值為false 時表示v-model是引用類型即(Object,Array)
結(jié)果展示
當(dāng)prop的類型為基礎(chǔ)數(shù)據(jù)類型時(usePrimary 為 true)
控制臺會報錯!!
當(dāng)prop的類型為引用類型時(usePrimary 為 false)
控制臺沒有任何錯誤信息!??!
結(jié)論
- 當(dāng)傳給子組件的Prop為基本數(shù)據(jù)類型是(Number,String)在子組件中修改Prop控制臺會報錯 prop的值不會改變
- 當(dāng)傳給子組件的Prop為引用時(Object,Array)在子組件中修改Prop的屬性不會報錯且值可以改變
當(dāng)然不建議在子組件中直接修改Prop的值,因為這樣會破壞單一數(shù)據(jù)流,可能會導(dǎo)致數(shù)據(jù)的變化無法追蹤。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Vue-cli3 項目在安卓低版本系統(tǒng)和IE上白屏問題解決
這篇文章主要介紹了Vue-cli3 項目在安卓低版本系統(tǒng)和 IE 上白屏問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04Vue2.0父組件與子組件之間的事件發(fā)射與接收實例代碼
這篇文章主要介紹了Vue2.0父組件與子組件之間的事件發(fā)射與接收實例代碼,需要的朋友可以參考下2017-09-09Vue條件循環(huán)判斷+計算屬性+綁定樣式v-bind的實例
今天小編就為大家分享一篇Vue條件循環(huán)判斷+計算屬性+綁定樣式v-bind的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09