您好,登錄后才能下訂單哦!
這篇文章主要介紹了在vue中使用v-model 雙向綁定父子組件時需要注意哪些問題,此處通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下:
Vue是一套用于構建用戶界面的漸進式JavaScript框架,Vue與其它大型框架的區別是,使用Vue可以自底向上逐層應用,其核心庫只關注視圖層,方便與第三方庫和項目整合,且使用Vue可以采用單文件組件和Vue生態系統支持的庫開發復雜的單頁應用。
[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"
引發這個警告的是一個自定義組件 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
監聽 value
的變化,在父組件中 value
變化時修改 innerValue
的值
監聽 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
的代碼卻多了許多。。。
一種更優雅的方式是使用 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 雙向綁定父子組件時需要注意哪些問題的內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。