vue 使用 v-model 雙向綁定父子組件的值遇見的問題及解決方案
場景
今天在使用 v-model 進行組件雙向數據綁定的時候遇到了一個奇怪的問題,網頁本身運行正常,瀏覽器一直出現警告信息。
[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: "",
},
});
經測試,程序本身運行正常,父子組件的傳值也沒什么問題,雙向數據綁定確實生效了,然而瀏覽器就是一直報錯。
嘗試解決
吾輩找到一種方式
- 為需要雙向綁定的變量在組件內部
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 雙向綁定父子組件的值遇見的問題及解決方案的詳細內容,更多關于vue 使用 v-model 雙向綁定父子組件的值的資料請關注腳本之家其它相關文章!
相關文章
vue中改變選中當前項的顯示隱藏或者狀態(tài)的實現方法
下面小編就為大家分享一篇vue中改變選中當前項的顯示隱藏或者狀態(tài)的實現方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-02-02
Vue3+Ant?design?實現Select下拉框一鍵全選/清空功能
在做后臺管理系統項目的時候,產品增加了一個在Select選擇器中添加一鍵全選和清空的功能,他又不讓在外部增加按鈕,其實如果說在外部增加按鈕實現全選或者清空的話,功能比較簡單的,下面給大家分享Vue3+Ant?design?實現Select下拉框一鍵全選/清空功能,需要的朋友可以參考下2024-05-05
Vue中ElementUI結合transform使用時如何修復el-select彈框定位不準確問題
這篇文章主要介紹了Vue中ElementUI結合transform使用時如何修復el-select彈框定位不準確問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-01-01

