vue 使用 v-model 雙向綁定父子組件的值遇見的問題及解決方案
場景
今天在使用 v-model
進行組件雙向數(shù)據(jù)綁定的時候遇到了一個奇怪的問題,網(wǎng)頁本身運行正常,瀏覽器一直出現(xiàn)警告信息。
[Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being mutated: "value"
引發(fā)這個警告的是一個自定義組件 RxSelect
Vue.component("RxSelect", { model: { prop: "value", event: "change", }, props: { value: [Number, String], map: Map, }, template: ` <select v-model="value" @change="$emit('change', value)" > <option v-for="[k,v] in map" :value="k" :key="k" >{{v}}</option> </select> `, });
吾輩使用的代碼看起來代碼貌似沒什么問題?
<main id="app"> 當前選擇的性別是: {{map.get(sex)}} <div> <rx-select :map="map" v-model="sex" /> </div> </main>
JavaScript 代碼
new Vue({ el: "#app", data: { map: new Map().set(1, "保密").set(2, "男").set(3, "女"), sex: "", }, });
經(jīng)測試,程序本身運行正常,父子組件的傳值也沒什么問題,雙向數(shù)據(jù)綁定確實生效了,然而瀏覽器就是一直報錯。
嘗試解決
吾輩找到一種方式
- 為需要雙向綁定的變量在組件內(nèi)部
data
聲明一個變量innerValue
,并初始化為value
- 在
select
上使用v-model
綁定這個變量innerValue
- 監(jiān)聽
value
的變化,在父組件中value
變化時修改innerValue
的值 - 監(jiān)聽
innerValue
的變化,在變化時使用this.$emit('change', val)
告訴父組件需要更新value
的值
Vue.component("RxSelect", { model: { prop: "value", event: "change", }, props: { value: [Number, String], map: Map, }, data() { return { innerValue: this.value, }; }, watch: { value(val) { this.innerValue = val; }, innerValue(val) { this.$emit("change", val); }, }, template: ` <select v-model="innerValue"> <option v-for="[k,v] in map" :value="k" :key="k" >{{v}}</option> </select> `, });
使用代碼完全一樣,然而組件 RxSelect
的代碼卻多了許多。。。
解決
一種更優(yōu)雅的方式是使用 computed
計算屬性以及其的 get/set
,代碼增加的程度還是可以接受的
Vue.component("RxSelect", { model: { prop: "value", event: "change", }, props: { value: [Number, String], map: Map, }, computed: { innerValue: { get() { return this.value; }, set(val) { this.$emit("change", val); }, }, }, template: ` <select v-model="innerValue"> <option v-for="[k,v] in map" :value="k" :key="k" >{{v}}</option> </select> `, });
以上就是vue 使用 v-model 雙向綁定父子組件的值遇見的問題及解決方案的詳細內(nèi)容,更多關(guān)于vue 使用 v-model 雙向綁定父子組件的值的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Element-ui設(shè)置el-table表頭全選框隱藏或禁用
這篇文章主要給大家介紹了關(guān)于Element-ui設(shè)置el-table表頭全選框隱藏或禁用的相關(guān)資料,文中手把手教你實現(xiàn)el-table實現(xiàn)跨表格禁用選項,需要的朋友可以參考下2023-07-07vue-cli-service?build?自定義參數(shù)方式
這篇文章主要介紹了vue-cli-service?build?自定義參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10vue使用jsonp抓取qq音樂數(shù)據(jù)的方法
這篇文章主要介紹了vue使用jsonp抓取qq音樂數(shù)據(jù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06Vue3中的極致防抖/節(jié)流詳解(附常見方式防抖/節(jié)流)
在JavaScript中函數(shù)的防抖和節(jié)流不是什么新鮮話題,這篇文章主要給大家介紹了關(guān)于Vue3中極致防抖/節(jié)流的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02