v-model

今天在做項(xiàng)目的時(shí)候發(fā)現(xiàn)有一個(gè)語(yǔ)法糖v-model,我們嘗試著用來(lái)簡(jiǎn)化我們的代碼

v-model是一個(gè)指令,限制在<input>、<select>、<textarea>、components中使用,修飾符.lazy(取代 input 監(jiān)聽(tīng) change 事件)、.number(輸入字符串轉(zhuǎn)為有效的數(shù)字)、.trim(輸入首尾空格過(guò)濾)。接下來(lái)我們就來(lái)分析 v-model 的實(shí)現(xiàn)原理。我們知道Vue的核心特性之一是雙向綁定,vue的響應(yīng)式原理是實(shí)現(xiàn)了數(shù)據(jù)->視圖,接下來(lái)我們要學(xué)習(xí) 視圖->數(shù)據(jù)的原理。
一個(gè)組件上的 v-model 默認(rèn)會(huì)利用名為 value 的 prop 和名為 input 的事件,比如我項(xiàng)目中出現(xiàn)的這個(gè)

  <input type="text" :value="x"
                   @input="x=$event.target.value"
                   placeholder="在這里輸入備注">

ts

<script lang='ts'>
  import {Component} from 'vue-property-decorator';
  import Vue from 'vue';

  @Component
  export default class Notes extends Vue {
    x = '';
    value=''
  }
</script>

可以簡(jiǎn)寫(xiě)成

 <label class="notes">
            <span class="name">備注</span>
            <input type="text" v-model="x"
                   placeholder="在這里輸入備注">

ts

<script lang='ts'>
  import {Component} from 'vue-property-decorator';
  import Vue from 'vue';

  @Component
  export default class Notes extends Vue {
    x = '';
  }
</script>

少了巨多,這里就是利用v-model自動(dòng)利用名為 valueprop 和名為 input的事件,使得當(dāng)Notes觸發(fā)一個(gè)$event.target.value 事件并附帶一個(gè)新的值的時(shí)候,視圖里的input的值會(huì)改變,而且這個(gè)x的屬性將會(huì)被更新。

v-model的好處還不止于此,像單選框、復(fù)選框等類(lèi)型的輸入控件可能會(huì)將 value attribute 用于不同的目的。model 選項(xiàng)可以用來(lái)避免這樣的沖突:舉個(gè)簡(jiǎn)單的例子,這是vue文檔的例子

Vue.component('base-checkbox', {
  model: {
    prop: 'checked',
    event: 'change'
  },
  props: {
    checked: Boolean
  },
  template: `
    <input
      type="checkbox"
      v-bind:checked="checked"
      v-on:change="$emit('change', $event.target.checked)"
    >
  `
})

現(xiàn)在在這個(gè)組件上使用 v-model 的時(shí)候:

<base-checkbox v-model="lovingVue"></base-checkbox>

這里的 lovingVue 的值將會(huì)傳入這個(gè)名為 checked 的 prop。同時(shí)當(dāng) <base-checkbox> 觸發(fā)一個(gè) change 事件并附帶一個(gè)新的值的時(shí)候,這個(gè) lovingVue 的屬性將會(huì)被更新。

注意你仍然需要在組件的 props 選項(xiàng)里聲明 checked 這個(gè) prop。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 目標(biāo):1、了解v-model的本質(zhì)。2、了解v-model的實(shí)現(xiàn)原理。 我們知道Vue的核心特性之一是雙向綁定,v...
    LoveBugs_King閱讀 222,785評(píng)論 3 38
  • v-model是什么? v-model是vue給我們提供的一個(gè)內(nèi)置指令(多用于表單組件的“雙向數(shù)據(jù)綁定”),而內(nèi)置...
    FTD止水閱讀 3,637評(píng)論 0 0
  • 前段時(shí)間出來(lái)面試,有一個(gè)面試?yán)蠋焼?wèn)我v-model是什么,我回答說(shuō)其實(shí)是組件里props中的value的值和往父組...
    烏羅閱讀 1,360評(píng)論 0 4
  • 1. v-model 的原理 我們?cè)?vue 項(xiàng)目中主要使用 v-model指令在表單 、 及 元素上創(chuàng)...
    PingerL閱讀 124評(píng)論 0 0
  • 在 vue 開(kāi)發(fā)開(kāi)發(fā)中, v-model 是一個(gè)非常常用的屬性. 常規(guī)模式下,我們給定當(dāng)前組件的某個(gè) data 屬...
    人話(huà)博客閱讀 1,564評(píng)論 0 50

友情鏈接更多精彩內(nèi)容