Vue 進(jìn)階教程之:幫你徹底理解 v-model 以及在組件上如何使用

Vue 官網(wǎng)教程上關(guān)于 v-model 的講解不是十分的詳細(xì)靡挥,寫這篇文章的目的就是詳細(xì)的剖析一下, 并介紹 Vue 2.2 v-model改進(jìn)的地方舵匾,然后穿插的再說(shuō)點(diǎn) Vue 的小知識(shí)哟绊。

在 Vue 中湿右,有許多方法和 Angular 相似,這主要是因?yàn)?Angular 是 Vue 早期開(kāi)發(fā)的靈感來(lái)源芜抒。然而珍策,Augular 中存在許多問(wèn)題,在 Vue 中已經(jīng)得到解決宅倒。


v-model 用在 input 元素上時(shí)

v-model雖然很像使用了雙向數(shù)據(jù)綁定的 Angular 的 ng-model攘宙,但是 Vue 是單項(xiàng)數(shù)據(jù)流v-model 只是語(yǔ)法糖而已:↓

<input v-model="sth" />
<input :value="sth" @input="sth = $event.target.value" />

第一行的代碼其實(shí)只是第二行的語(yǔ)法糖拐迁,兩行代碼是等價(jià)的蹭劈。

要理解這行代碼,首先你要知道 input 元素本身有個(gè) oninput 事件线召,這是 HTML5 新增加的铺韧,類似 onchange ,每當(dāng)輸入框內(nèi)容發(fā)生變化缓淹,就會(huì)觸發(fā) oninput 哈打,把最新的value賦值給 sth變量。
如果你不知道 $event 是從哪來(lái)的讯壶,那你需要點(diǎn)擊它再?gòu)?fù)習(xí)一下文檔料仗。

我們仔細(xì)觀察語(yǔ)法糖和原始語(yǔ)法那兩行代碼,可以得出一個(gè)結(jié)論

在給 <input /> 元素添加 v-model 屬性時(shí)伏蚊,默認(rèn)會(huì)把 value 作為元素的屬性立轧,把 input 事件作為實(shí)時(shí)傳遞 value 的觸發(fā)事件
(理解上面那句話非常重要,如果沒(méi)有理解躏吊,務(wù)必再把上面的內(nèi)容多看兩遍氛改,多想想,直到理解為止)


當(dāng) v-model 用在組件上時(shí)

v-model 不僅僅能在 inputHTML 原生標(biāo)簽上用颜阐,在 vue 組件上也能使用平窘;下面是一個(gè)和 Vue 官網(wǎng)教程類似的例子:

實(shí)例演示.gif

父組件 price 的初始值是 100,子組件是一個(gè)輸入框凳怨;輸入框的值改變時(shí)瑰艘,能實(shí)時(shí)更新父組件的 price

// 父組件
<template>
<div id="demo">
  <currency-input v-model="price"></currentcy-input>
  <span>{{price}}</span>
</div>
</template>

<script>
export default {
  data() {
    return {
      price: 100,
    }
  }
}
</script>
// 子組件 currency-input
<template>
  <input
    :value="value"
    @input="$emit('input', $event.target.value)"
  />
   <!--為什么這里把 'input' 作為觸發(fā)事件的事件名是鬼?`input` 在哪定義的?-->
</template>

<script>
export default {
  props: {
    value: String,  // 為什么這里要定義 value 屬性紫新,父組件貌似沒(méi)有給子組件傳遞 value 熬邸?
  }
}
</script>

注釋里列了兩個(gè)問(wèn)題芒率,如果你都知道答案囤耳,那么恭喜你真正掌握了 v-model!
如果你沒(méi)明白,那么可以繼續(xù)往下看


我們對(duì)比下下面兩行代碼

<currency-input v-model="price"></currentcy-input>
<currency-input :value="price" @input="price = $event.target.value"></currency-input>

這兩行代碼實(shí)際上沒(méi)有任何區(qū)別偶芍,只不過(guò)第一行是第二行的語(yǔ)法糖而已充择!
現(xiàn)在你知道 valueinput 從哪來(lái)的了吧。與上面總結(jié)的類似:

給組件添加 v-model 屬性時(shí)匪蟀,默認(rèn)會(huì)把value 作為組件的屬性椎麦,把 input作為給組件綁定事件時(shí)的事件名


v-model 的缺點(diǎn)和解決辦法

v-model 應(yīng)用到組件上,會(huì)有一些體驗(yàn)不好的場(chǎng)景材彪。因?yàn)樗J(rèn)會(huì)把 value 作為組件的屬性观挎,把 input作為給組件綁定事件時(shí)的事件名。

// 父組件
<my-button v-model="number"></my-button>
<script>
data() {
  return {
    number: 1,
  }
}
</script>

// 子組件
<template>
  <button @click="add">點(diǎn)擊按鈕自增 1</button>
</template>

<script>
export default {
  props: {
    value: Number, //  屬性名必須是 value
  },

  methods: {
    add() {
      this.$emit('input', this.value + 1) // 事件名必須是 input
    },
  }
}
</script>

有時(shí)間我們不想用 value 當(dāng)做默認(rèn)的屬性名段化,也不想把 input 當(dāng)做事件名嘁捷。能不能自定義呢?


在 Vue 2.2 及以上版本显熏,你可以在定義組件時(shí)通過(guò) model 選項(xiàng)的方式來(lái)定制 prop/event:↓

// 父組件
<my-button v-model="number"></my-button>
<script>
data() {
  return {
    number: 1,
  }
}
</script>

// 子組件
<template>
  <button @click="add">點(diǎn)擊按鈕自增 1</button>
</template>

<script>
export default {
  model: {
    prop: 'num', // 自定義屬性名
    event: 'addNum' // 自定義事件名
  },
  props: {
    num: Number,
  },

  methods: {
    add() {
      this.$emit('addNum', this.num + 1)
    },
  }
}
</script>

看到這里我相信你肯定理解了 Vue 的 v-model雄嚣,文中如有錯(cuò)誤,歡迎在評(píng)論中指出佃延,謝謝现诀。
碼字辛苦,文章如對(duì)您有幫助履肃,麻煩支持點(diǎn)贊~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末仔沿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子尺棋,更是在濱河造成了極大的恐慌封锉,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件膘螟,死亡現(xiàn)場(chǎng)離奇詭異成福,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荆残,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門奴艾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人内斯,你說(shuō)我怎么就攤上這事蕴潦∠裉洌” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵潭苞,是天一觀的道長(zhǎng)忽冻。 經(jīng)常有香客問(wèn)我,道長(zhǎng)此疹,這世上最難降的妖魔是什么僧诚? 我笑而不...
    開(kāi)封第一講書人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮蝗碎,結(jié)果婚禮上湖笨,老公的妹妹穿的比我還像新娘。我一直安慰自己衍菱,他們只是感情好赶么,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布肩豁。 她就那樣靜靜地躺著脊串,像睡著了一般。 火紅的嫁衣襯著肌膚如雪清钥。 梳的紋絲不亂的頭發(fā)上琼锋,一...
    開(kāi)封第一講書人閱讀 51,146評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音祟昭,去河邊找鬼缕坎。 笑死,一個(gè)胖子當(dāng)著我的面吹牛篡悟,可吹牛的內(nèi)容都是我干的谜叹。 我是一名探鬼主播,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搬葬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼荷腊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起急凰,我...
    開(kāi)封第一講書人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤女仰,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后抡锈,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疾忍,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年床三,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了一罩。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撇簿,死狀恐怖聂渊,靈堂內(nèi)的尸體忽然破棺而出推汽,到底是詐尸還是另有隱情,我是刑警寧澤歧沪,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布歹撒,位于F島的核電站,受9級(jí)特大地震影響诊胞,放射性物質(zhì)發(fā)生泄漏暖夭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一撵孤、第九天 我趴在偏房一處隱蔽的房頂上張望迈着。 院中可真熱鬧,春花似錦邪码、人聲如沸裕菠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)奴潘。三九已至,卻和暖如春影钉,著一層夾襖步出監(jiān)牢的瞬間画髓,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工平委, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奈虾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓廉赔,卻偏偏與公主長(zhǎng)得像肉微,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蜡塌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容碉纳,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,048評(píng)論 0 29
  • 下載安裝搭建環(huán)境 可以選npm安裝岗照,或者簡(jiǎn)單下載一個(gè)開(kāi)發(fā)版的vue.js文件 瀏覽器打開(kāi)加載有vue的文檔時(shí)村象,控制...
    冥冥2017閱讀 6,037評(píng)論 0 42
  • 1.安裝 可以簡(jiǎn)單地在頁(yè)面引入Vue.js作為獨(dú)立版本,Vue即被注冊(cè)為全局變量攒至,可以在頁(yè)面使用了厚者。 如果希望搭建...
    Awey閱讀 11,014評(píng)論 4 129
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)迫吐,斷路器膀篮,智...
    卡卡羅2017閱讀 134,651評(píng)論 18 139
  • 有沒(méi)有那么一個(gè)人,會(huì)讓你覺(jué)得好久不見(jiàn)鳖擒,加倍想念? 1 對(duì)不起烫止,我好像又想你了蒋荚,此刻是凌晨一點(diǎn),絲毫沒(méi)有睡意馆蠕。 說(shuō)好...
    木月十閱讀 713評(píng)論 9 29