Vue 子組件更新props中的屬性值問(wèn)題
Vue子組件更新props的屬性值
在子組件中更新props中的屬性值,并且更新到父組件,有兩種實(shí)現(xiàn)方式:.sync 和 自定義v-model
.sync屬性
父組件在給子組件傳值時(shí),屬性名后需要加修飾符.sync,格式 :子組件props屬性名.sync
父組件
<template> <div id="app"> ? ? // 注意點(diǎn)一、: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的屬性值,同時(shí)更新父組件中中valueChild的屬性值 ? ? ? ? ? ? ?this.$emit('update:show', false); ? ? ? ? } ? ? } } </script>
v-model應(yīng)用
子組件定義的屬性名必須為 value
父組件向上彈射事件給子組件時(shí),事件名必須為 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: { ? ? ?// 注意點(diǎn)一、屬性名必須為value ? ? ? value: { type: Boolean, default: false} ? ? } , ? ? methods: { ? ? ? ? eventOpt() { ? ? ? ? ? ? // 注意二、事件名必須為input ? ? ? ? ? ? // 更改prop中的屬性show的屬性值,同時(shí)更新父組件中中valueChild的屬性值 ? ? ? ? ? ? ?this.$emit('input', false); ? ? ? ? } ? ? } } </script>
比較
v-model 子組件只能更改props中的一個(gè)屬性值value;
.sync 子組件可以更改props中的多個(gè)屬性值;
Vue子組件中修改Props的幾種情況
首先列舉平常使用Vue 父組件傳遞數(shù)據(jù)到子組件的幾種情況
- 傳遞的是基礎(chǔ)數(shù)據(jù)類(lèi)型(Number,Boolean,String)
- 傳遞的是引用類(lèi)型(Object,Array)
針對(duì)以上幾種情況再逐一進(jìn)行分析
1.首先定義一個(gè)子組件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ù)類(lèi)型', ? ? ? ? objectType:{value:'我是引用類(lèi)型'}, ? ? ? ? usePrimary:false ? ? } ?}
變量 usePrimary 用于控制子組件 input 的v-model引用的類(lèi)型 當(dāng)值為true 時(shí)表示v-model的類(lèi)型為 基礎(chǔ)數(shù)據(jù)類(lèi)型,當(dāng)值為false 時(shí)表示v-model是引用類(lèi)型即(Object,Array)
結(jié)果展示
當(dāng)prop的類(lèi)型為基礎(chǔ)數(shù)據(jù)類(lèi)型時(shí)(usePrimary 為 true)
控制臺(tái)會(huì)報(bào)錯(cuò)?。?/p>
當(dāng)prop的類(lèi)型為引用類(lèi)型時(shí)(usePrimary 為 false)
控制臺(tái)沒(méi)有任何錯(cuò)誤信息?。?!
結(jié)論
- 當(dāng)傳給子組件的Prop為基本數(shù)據(jù)類(lèi)型是(Number,String)在子組件中修改Prop控制臺(tái)會(huì)報(bào)錯(cuò) prop的值不會(huì)改變
- 當(dāng)傳給子組件的Prop為引用時(shí)(Object,Array)在子組件中修改Prop的屬性不會(huì)報(bào)錯(cuò)且值可以改變
當(dāng)然不建議在子組件中直接修改Prop的值,因?yàn)檫@樣會(huì)破壞單一數(shù)據(jù)流,可能會(huì)導(dǎo)致數(shù)據(jù)的變化無(wú)法追蹤。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Vue-element中el-input輸入卡頓問(wèn)題的解決
這篇文章主要介紹了Vue-element中el-input輸入卡頓問(wèn)題的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04vue-cli實(shí)現(xiàn)多頁(yè)面多路由的示例代碼
本篇文章主要介紹了vue-cli實(shí)現(xiàn)多頁(yè)面多路由的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01詳解Vue-cli3 項(xiàng)目在安卓低版本系統(tǒng)和IE上白屏問(wèn)題解決
這篇文章主要介紹了Vue-cli3 項(xiàng)目在安卓低版本系統(tǒng)和 IE 上白屏問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04Vue2.0父組件與子組件之間的事件發(fā)射與接收實(shí)例代碼
這篇文章主要介紹了Vue2.0父組件與子組件之間的事件發(fā)射與接收實(shí)例代碼,需要的朋友可以參考下2017-09-09解決Vue 給mapState中定義的屬性賦值報(bào)錯(cuò)的問(wèn)題
這篇文章主要介紹了解決Vue 給mapState中定義的屬性賦值報(bào)錯(cuò)的問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Vue條件循環(huán)判斷+計(jì)算屬性+綁定樣式v-bind的實(shí)例
今天小編就為大家分享一篇Vue條件循環(huán)判斷+計(jì)算屬性+綁定樣式v-bind的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-09-09詳解如何優(yōu)雅運(yùn)用Vue中的KeepAlive組件
在Vue中,KeepAlive組件是一種特殊的組件,用于緩存已經(jīng)渲染過(guò)的組件實(shí)例,本文主要為大家詳細(xì)介紹了KeepAlive組件的用法,需要的小伙伴可以參考下2023-09-09