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應用
子組件定義的屬性名必須為 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ù)到子組件的幾種情況
- 傳遞的是基礎數(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:'我是基礎數(shù)據(jù)類型',
? ? ? ? objectType:{value:'我是引用類型'},
? ? ? ? usePrimary:false
? ? }
?}變量 usePrimary 用于控制子組件 input 的v-model引用的類型 當值為true 時表示v-model的類型為 基礎數(shù)據(jù)類型,當值為false 時表示v-model是引用類型即(Object,Array)
結果展示
當prop的類型為基礎數(shù)據(jù)類型時(usePrimary 為 true)
控制臺會報錯??!

當prop的類型為引用類型時(usePrimary 為 false)
控制臺沒有任何錯誤信息?。。?img alt="" src="http://img.jbzj.com/file_images/article/202210/2022101811063920.gif" />
結論
- 當傳給子組件的Prop為基本數(shù)據(jù)類型是(Number,String)在子組件中修改Prop控制臺會報錯 prop的值不會改變
- 當傳給子組件的Prop為引用時(Object,Array)在子組件中修改Prop的屬性不會報錯且值可以改變
當然不建議在子組件中直接修改Prop的值,因為這樣會破壞單一數(shù)據(jù)流,可能會導致數(shù)據(jù)的變化無法追蹤。
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解Vue-cli3 項目在安卓低版本系統(tǒng)和IE上白屏問題解決
這篇文章主要介紹了Vue-cli3 項目在安卓低版本系統(tǒng)和 IE 上白屏問題解決,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04
Vue2.0父組件與子組件之間的事件發(fā)射與接收實例代碼
這篇文章主要介紹了Vue2.0父組件與子組件之間的事件發(fā)射與接收實例代碼,需要的朋友可以參考下2017-09-09
Vue條件循環(huán)判斷+計算屬性+綁定樣式v-bind的實例
今天小編就為大家分享一篇Vue條件循環(huán)判斷+計算屬性+綁定樣式v-bind的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-09-09

