vue2 vs vue3 v-model 的語法糖

<input v-model="str" />

// 等同于 

<input :value="str" @input="str = $event.target.value" />

通過上面的代碼脑融,我們可以分析得出转锈,也就是說:<font color=red> v-model="str" 是 :value="str" @input="str = $event.target.value" 的縮寫焚虱。</font>

解釋:

$event 指代當前觸發(fā)的事件對象。

$event.target 指代當前觸發(fā)的事件對象的dom

$event.target.value 就是當前dom的value值

在@input方法中镀岛,value => str

在:value中:str => value

如此,形成了一個閉環(huán)兼都,也就是所說的數(shù)據(jù)的雙向綁定。

自定義組件怎么實現(xiàn)v-model

<my-component v-model="price"></my-component>

我們可以根據(jù)規(guī)則來拆解

<my-component :value="price" @input="price = $event.target.value"></my-component>

那么我們在還原組件的封裝

<template>
  <div>
    <input type="text" :value="value" @input="$emit('input', $event.target.value)">
  </div>
</template>
<script>
export default {
 props: {
    value: String
  }
 }
 </script>

看到上面的代碼或許你就恍然大悟了稽寒,他又回到了扮碧,我們之前學過的 父子組件的來回傳值。

細心的同學可能會發(fā)現(xiàn)杏糙,我們 props 里面的值是 value 那我能不能隨便定義一個變量呢慎王?還有 $emit()里面?zhèn)魅氲氖录凳莍nput我能不能也隨便定義一個事件呢?

當我們在一個自定義組件上使用v-model并不能實現(xiàn)雙向綁定宏侍,因為自定的組件并沒有默認的value和input事件赖淤,在使用時,我們需要按照上面那樣顯式的去聲明定義這些東西谅河。這時咱旱,model選項就派上用場了,在定義組件的時候旧蛾,指定prop的值和監(jiān)聽的事件莽龟。
組件的用法是不變的,子組件可以這么寫

<template>
  <div>
    <input type="text" :value="xxxx" @input="$emit('xxxx', $event.target.value)">
  </div>
</template>

<script>
export default {
    model:{
        prop:'xxxx',
        event:'xxxx' // 代表自定義的事件名稱
    }

    props: {
        xxxx: String // 代表自定義的變量名稱
     }
}
</script>

這就是vue 的 model 選項的作用锨天。

以上是vue2.0的v-model語法糖講解,vue3.0是怎么用的呢剃毒?

其實vue3的v-model跟vue2的使用區(qū)別不大病袄,只是跟vue2的 <font color=red>sync</font> 修飾符進行了合并,所以在vue3中就移除了 <font color=red>sync</font> 修飾符赘阀。下面我們看看怎么在 <font color=red>composition api</font>
中怎么寫 <font color=red>v-model</font>

// 自定義一個TestModel組件
<template>
 <div>
   <input type="text" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)" />
 </div>
</template>

<script>
export default {
 props: {
   modelValue: {
     type: String
   }
 }
}
</script>

在vue3中默認的不在是value 而是modelValue

然后在其他頁面使用

<template>
  <h1>vue3中使用v-model {{msg}}</h1>
  <testModel v-model="msg"></testModel>
  <!-- 等同于下面語法 默認傳入一個modelValue 然后子組件接收這個modelValue -->
 <testModel :modelValue="msg" @update:modelValue="msg = $event"></testModel>
</template>

<script>
import { ref } from 'vue';
import testModel from './TestModel.vue';
export default {
  components: {
    testModel
  },
  setup(){
    const msg = ref('')
    return { msg }
  },
}
</script>

有的小伙伴可能有疑問益缠,如果我不想用 modelValue 怎么辦呢?當然也可以寫成其他的名字

// 父組件
<template>
  <h1>vue3中使用v-model {{msg}}</h1>
  <testModel v-model:msg="msg"></testModel>
</template>

子組件接收的props就要改成msg了

// 子組件
<template>
  <div>
    <input type="text" :value="msg" @input="$emit('update:msg', $event.target.value)" />
  </div>
</template>

<script>
export default {
  props: {
    msg: {
      type: String
    }
  }
}
</script>

當然提到雙向綁定基公,你可能第一時間就會想到表單元素幅慌,雙向綁定不一定是表單元素,你可以定義各種各樣的組件轰豆,比如通過click事件改變父組件的值

// 父組件
<template>
  <div>{{count}}</div>
  <testModel v-model:count="count"></testModel>
</template>

<script>
export default {
  components: {
    testModel
  },
  setup(){
    const count = ref(0)
    return { count }
  }
}
</script>



// 子組件
<template>
  <!-- 一定是+1 不是+=1 或者++ 否則vue會觸發(fā)一個不讓子組件直接改變props的警告 -->
  <div @click="$emit('update:count', count + 1)">click me count + 1胰伍!</div>
</template>

<script>
export default {
  props: {
    count: {
      type: Number
    }
  }
}
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酸休,隨后出現(xiàn)的幾起案子骂租,更是在濱河造成了極大的恐慌,老刑警劉巖斑司,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渗饮,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機互站,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進店門私蕾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人胡桃,你說我怎么就攤上這事是目。” “怎么了标捺?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵懊纳,是天一觀的道長。 經(jīng)常有香客問我亡容,道長嗤疯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任闺兢,我火速辦了婚禮茂缚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘屋谭。我一直安慰自己脚囊,他們只是感情好,可當我...
    茶點故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布桐磁。 她就那樣靜靜地躺著悔耘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪我擂。 梳的紋絲不亂的頭發(fā)上衬以,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天,我揣著相機與錄音校摩,去河邊找鬼看峻。 笑死,一個胖子當著我的面吹牛衙吩,可吹牛的內(nèi)容都是我干的互妓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坤塞,長吁一口氣:“原來是場噩夢啊……” “哼冯勉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起尺锚,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤珠闰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后瘫辩,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伏嗜,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡坛悉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了承绸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片裸影。...
    茶點故事閱讀 39,785評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖军熏,靈堂內(nèi)的尸體忽然破棺而出轩猩,到底是詐尸還是另有隱情,我是刑警寧澤荡澎,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布均践,位于F島的核電站,受9級特大地震影響摩幔,放射性物質(zhì)發(fā)生泄漏彤委。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一或衡、第九天 我趴在偏房一處隱蔽的房頂上張望焦影。 院中可真熱鬧,春花似錦封断、人聲如沸斯辰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽彬呻。三九已至,卻和暖如春回梧,著一層夾襖步出監(jiān)牢的瞬間废岂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工狱意, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人拯欧。 一個月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓详囤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親镐作。 傳聞我的和親對象是個殘疾皇子藏姐,可洞房花燭夜當晚...
    茶點故事閱讀 44,713評論 2 354

推薦閱讀更多精彩內(nèi)容