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">
當(dāng)前選擇的性別是: {{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-07
vue-cli-service?build?自定義參數(shù)方式
這篇文章主要介紹了vue-cli-service?build?自定義參數(shù)方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-10-10
vue使用jsonp抓取qq音樂數(shù)據(jù)的方法
這篇文章主要介紹了vue使用jsonp抓取qq音樂數(shù)據(jù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-06-06
Vue3中的極致防抖/節(jié)流詳解(附常見方式防抖/節(jié)流)
在JavaScript中函數(shù)的防抖和節(jié)流不是什么新鮮話題,這篇文章主要給大家介紹了關(guān)于Vue3中極致防抖/節(jié)流的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-02-02

