最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

vue 2 實(shí)現(xiàn)自定義組件一到多個(gè)v-model雙向數(shù)據(jù)綁定的方法(最新推薦)

 更新時(shí)間:2024年07月25日 10:04:26   作者:噓噓乖乖  
有時(shí)候我們需要對(duì)一個(gè)組件綁定自定義 v-model,以更方便地實(shí)現(xiàn)雙向數(shù)據(jù),例如自定義表單輸入控件,這篇文章主要介紹了vue 2 實(shí)現(xiàn)自定義組件一到多個(gè)v-model雙向數(shù)據(jù)綁定的方法,需要的朋友可以參考下

前言

有時(shí)候我們需要對(duì)一個(gè)組件綁定自定義 v-model,以更方便地實(shí)現(xiàn)雙向數(shù)據(jù),例如自定義表單輸入控件。

甚至有時(shí)候,我們想要實(shí)現(xiàn)綁定多個(gè) “v-model”,也就是多個(gè)“雙向綁定”,例如帶表單輸入的模塊框,想同時(shí)控制模態(tài)框的顯示狀態(tài)與表單的輸入狀態(tài)。好在 vue 3 已經(jīng)實(shí)現(xiàn)了多 v-model,那么在 vue 2 上我們可以如下實(shí)現(xiàn)。

1.單個(gè)“雙向綁定”的實(shí)現(xiàn)

使用 model 實(shí)現(xiàn)

其實(shí) v-model 只是 value + change 的語(yǔ)法糖,監(jiān)聽輸入并觸發(fā)改變,因此只要實(shí)現(xiàn) “監(jiān)聽” + “觸發(fā)” 就可以自定義 v-model 啦。

<!-- 父組件 -->
<template>
    <Child v-model="value" />
</template>
<script>
export default {
  data() {
    return {
      value: ''
    }
  }
}
</script>
<!-- 子組件 -->
<template>
    <input v-model="input" />
</template>
<script>
export default {
  props: {
    value: String,
  },
  model: {
    prop: 'value',        // 指定 v-model 要綁定的參數(shù)叫什么名字,來(lái)自于 props 中定義的參數(shù)
    event: 'change',    // 指定要觸發(fā)的事件名字,將被用于 $emit
  },
  computed: {
    input: {
      // 這里的計(jì)算屬性使用了 getter、setter,可以簡(jiǎn)化代碼
      // 可參見鏈接 https://cn.vuejs.org/v2/guide/computed.html#%E8%AE%A1%E7%AE%97%E5%B1%9E%E6%80%A7%E7%9A%84-setter
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('change', val);    // 觸發(fā)
      }
    }
  }
}
</script>

這樣一來(lái),就實(shí)現(xiàn)了自定義組件的 v-model 實(shí)現(xiàn),重點(diǎn)在于子組件中 model 的聲明和 emit 事件。

2.使用 .sync 實(shí)現(xiàn)

除了上面 model 的方法,其實(shí)還可以通過(guò) sync 來(lái)實(shí)現(xiàn)。同樣也是處理“監(jiān)聽”和“觸發(fā)”就行。

在官方文檔中有寫,https://cn.vuejs.org/v2/guide/components-custom-events.html#sync-修飾符 

用上面相似的例子,可以這樣來(lái)實(shí)現(xiàn):

<!-- 父組件 -->
<template>
    <Child :value.sync="value" />
</template>
<script>
export default {
  data() {
    return {
      value: ''
    }
  }
}
</script>
<!-- 子組件 Child -->
<template>
    <input v-model="input" />
</template>
<script>
export default {
  props: {
    value: String,
  },
  computed: {
    input: {
      get() {
        return this.value;
      },
      set(val) {
        this.$emit('update:value', val);    // 這里的事件名字一定是 'update:' + prop的名字
      }
    }
  }
}
</script>

很顯然,使用這種方法的代碼量比第1種要少,因?yàn)椴挥脤?model 屬性。只是比起 v-model,v-bind:value.sync 的寫法還是不那么“引人注目”

多個(gè)“雙向綁定”的實(shí)現(xiàn)

在 vue 3 出來(lái)之前,我們知道在一個(gè)標(biāo)簽里面最多只能有一個(gè) v-model。但這并不意味著一個(gè)組件只能一次雙向數(shù)據(jù)綁定。

根據(jù)上面 .sync 的方法,我們可以舉一反三,多幾個(gè) update:xxxx 就可以了。

1.分開綁定

下面以一個(gè)帶輸入框的模態(tài)框?yàn)槔?,需求是父組件能夠打開模態(tài)框,子組件在輸入確認(rèn)后能夠關(guān)閉模態(tài)框;子組件能夠輸入,確認(rèn)后能夠?qū)⒅祩鹘o父組件。

<!-- 父組件 -->
<template>
  <!-- 定義了兩個(gè)v-bind:xxx.sync來(lái)實(shí)現(xiàn)兩個(gè)雙向綁定 -->
  <ModalInput :value.sync="value" :show.sync="show" />
</template>
<script>
export default {
  data() {
    return {
      value: '',
      show: false
    }
  }
}
</script>
<!-- 子組件 ModalInput -->
<template>
  <!-- 這里假設(shè)Modal是一個(gè)帶“確認(rèn)”按鈕,點(diǎn)擊觸發(fā)confirm事件,并利用v-model來(lái)控制展示的模態(tài)框 -->
  <Modal v-model="showModal" @confirm="onConfirm">
    <input v-model="input">
  </Modal>
</template>
<script>
export default {
  props: {
    value: String,
    show: Boolean,
  },
  data() {
    return {
      input: ''        // 在這個(gè)例子中,使用 data 來(lái)聲明 input,
                  // 因?yàn)橹挥性邳c(diǎn)擊了“確認(rèn)”按鈕后,才要把值傳給父組件(而不是實(shí)時(shí)傳)
    }
  },
  computed: {
    showModal: {
      get() {
        return this.show;
      },
      set(val) {
        this.$emit('update:show', val);
      }
    }
  },
  methods: {
    onConfirm() {
      this.$emit('update:value', this.input);
      this.showModal = false
    }
  }
}
</script>

2.合并綁定

上面是綁定了兩個(gè)獨(dú)立變量的雙向綁定,按照官方的文檔,我們甚至還可以用 v-bind.sync 來(lái)綁定整個(gè)對(duì)象(的所有成員!)。下面假設(shè)一個(gè)表單組件,同時(shí)收集個(gè)人多個(gè)信息

<!-- 父組件 -->
<template>
  <UserInfoForm v-bind.sync="inputs" />
</template>
<script>
export default {
  data() {
    return {
      inputs: {
        name: '',
        age: 0,
        addr: '',
        phone: ''
      }
    }
  }
}
</script>
<!-- 子組件 UserInfoForm -->
<template>
  <form>
    <input v-model="name">
    <input v-model.number="age">
    <input v-model="addr">
    <input v-model="phone">
  </form>
</template>
<script>
// 與上面例子實(shí)現(xiàn)方式相似,這里省略代碼若干行。。。
// 其實(shí)就是聲明入?yún)?props 有哪些
// 用 computed 來(lái)聲明各個(gè)變量的 getter 和 setter
// getter 返回傳進(jìn)來(lái)的 prop,setter 中觸發(fā) update:xxxx 事件
</script>

到此這篇關(guān)于vue 2 實(shí)現(xiàn)自定義組件一到多個(gè)v-model雙向數(shù)據(jù)綁定的方法(轉(zhuǎn))的文章就介紹到這了,更多相關(guān)vue 2 v-model雙向數(shù)據(jù)綁定內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 對(duì)vue2.0中.vue文件頁(yè)面跳轉(zhuǎn)之.$router.push的用法詳解

    對(duì)vue2.0中.vue文件頁(yè)面跳轉(zhuǎn)之.$router.push的用法詳解

    今天小編就為大家分享一篇對(duì)vue2.0中.vue文件頁(yè)面跳轉(zhuǎn)之.$router.push的用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • vue項(xiàng)目依賴升級(jí)報(bào)錯(cuò)處理方式

    vue項(xiàng)目依賴升級(jí)報(bào)錯(cuò)處理方式

    這篇文章主要介紹了vue項(xiàng)目依賴升級(jí)報(bào)錯(cuò)處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • vue基于element的區(qū)間選擇組件

    vue基于element的區(qū)間選擇組件

    這篇文章主要介紹了vue基于element的區(qū)間選擇組件,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • vue.draggable實(shí)現(xiàn)表格拖拽排序效果

    vue.draggable實(shí)現(xiàn)表格拖拽排序效果

    這篇文章主要為大家詳細(xì)介紹了vue.draggable實(shí)現(xiàn)表格拖拽排序效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • vue-cli 為項(xiàng)目設(shè)置別名的方法

    vue-cli 為項(xiàng)目設(shè)置別名的方法

    這篇文章主要介紹了vue-cli 為項(xiàng)目設(shè)置別名的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • vue2.0全局組件之pdf詳解

    vue2.0全局組件之pdf詳解

    這篇文章主要為大家詳細(xì)紹了vue2.0全局組件之pdf的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決

    vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決

    這篇文章主要介紹了vue使用iview的modal彈窗嵌套modal出現(xiàn)格式錯(cuò)誤的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • vue 獲取到數(shù)據(jù)但卻渲染不到頁(yè)面上的解決方法

    vue 獲取到數(shù)據(jù)但卻渲染不到頁(yè)面上的解決方法

    這篇文章主要介紹了vue 獲取到數(shù)據(jù)但卻渲染不到頁(yè)面上的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • react和vue的事件處理差異詳解

    react和vue的事件處理差異詳解

    這篇文章主要介紹了react和vue的事件處理差異,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-03-03
  • Vue組件之全局組件與局部組件的使用詳解

    Vue組件之全局組件與局部組件的使用詳解

    本篇文章主要介紹了Vue組件之全局組件與局部組件的使用詳解,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10

最新評(píng)論

和林格尔县| 徐州市| 大英县| 石家庄市| 太仆寺旗| 阿鲁科尔沁旗| 农安县| 南汇区| 正定县| 离岛区| 辉南县| 英吉沙县| 顺平县| 贺兰县| 涿州市| 五指山市| 宿松县| 同仁县| 米林县| 铜鼓县| 榆中县| 灌南县| 彭阳县| 东海县| 甘孜县| 安泽县| 翁源县| 昌黎县| 泰兴市| 琼海市| 扬中市| 浦县| 祁门县| 洪雅县| 麦盖提县| 肥东县| 荔浦县| 凌海市| 蚌埠市| 滨州市| 曲麻莱县|