91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

在vue中使用v-model 雙向綁定父子組件時需要注意哪些問題

發布時間:2021-03-01 15:02:30 來源:億速云 閱讀:271 作者:戴恩恩 欄目:開發技術

這篇文章主要介紹了在vue中使用v-model 雙向綁定父子組件時需要注意哪些問題,此處通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考價值,需要的朋友可以參考下:

vue是什么軟件

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: "",
 },
});

經測試,程序本身運行正常,父子組件的傳值也沒什么問題,雙向數據綁定確實生效了,然而瀏覽器就是一直報錯。

嘗試解決

吾輩找到一種方式

  1. 為需要雙向綁定的變量在組件內部 data 聲明一個變量 innerValue,并初始化為 value

  2. select 上使用 v-model綁定這個變量 innerValue

  3. 監聽 value 的變化,在父組件中 value 變化時修改 innerValue 的值

  4. 監聽 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 雙向綁定父子組件時需要注意哪些問題的內容請搜索億速云以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持億速云!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

克什克腾旗| 普陀区| 垦利县| 西乡县| 宁津县| 商丘市| 廉江市| 宜黄县| 浦江县| 南皮县| 沙田区| 清新县| 中西区| 秭归县| 仙游县| 秦安县| 普兰店市| 宁强县| 兴化市| 深圳市| 太谷县| 乐安县| 黔江区| 巴南区| 安仁县| 安岳县| 邛崃市| 醴陵市| 惠来县| 类乌齐县| 新平| 密山市| 友谊县| 宁明县| 靖边县| 松潘县| 嘉鱼县| 杭锦后旗| 鹤峰县| 大城县| 鄂温|