Vue中的v-model理解

官方文檔講的比較模糊,自己通過(guò)例子進(jìn)行理解煮岁。

v-model是語(yǔ)法糖

首先明確一點(diǎn),v-model僅僅是語(yǔ)法糖。

        <input
                type="text"
                v-model="something">
        <!--等價(jià)于-->
        <input
                type="text"
                v-bind:value="something"
                v-on:input="something = $event.target.value">

還要理解$emit的用法:

vm.$emit(event,[...args])

觸發(fā)當(dāng)前實(shí)例上的事件匠楚。附加參數(shù)都會(huì)傳給監(jiān)聽器回調(diào)。

v-model在 普通input上

一定要明確在給 <input /> 元素添加 v-model 屬性時(shí)厂财,默認(rèn)會(huì)把 value 作為元素的屬性芋簿,然后把 'input' 事件作為實(shí)時(shí)傳遞 value 的觸發(fā)事件(具體參考語(yǔ)法糖的解釋)

v-model用在組件上

這里是一個(gè)自定義組件currency-input,父組件的 price 的初始值是 100,更改子組件的值能實(shí)時(shí)更新父組件的 price

html:

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

js:

Vue.component('currency-input', {
 template: `
  <span>
   <input
    ref="input"
    :value="value"
    <!--為什么這里把 'input' 作為觸發(fā)事件的事件名璃饱?`input` 在哪定義的与斤?-->
    @input="$emit('input', $event.target.value)"
   >
  </span>
 `,
 props: ['value'],// 為什么這里要用 value 屬性,value在哪里定義的荚恶?貌似沒找到傲么?
})

var demo = new Vue({
 el: '#demo',
 data: {
  price: 100,
 }
})

這里的js代碼谒撼,props中接受了value食寡,但是在組件中<currency-input v-model="price"></currentcy-input>并沒有傳入value,而且在input中是監(jiān)聽了input事件廓潜,但是并沒有在父組件中定義input抵皱。

要理解這個(gè),就要回到語(yǔ)法糖的問(wèn)題上茉帅,
<currency-input v-model="price"></currentcy-input>
本質(zhì)上等價(jià)于:
<currency-input :value="price" @input="price = arguments[0]"></currency-input>
所以可以看到value和input了

理解v-model在組件中的實(shí)現(xiàn)叨叙,給組件添加 v-model 屬性時(shí),默認(rèn)會(huì)把 value 作為組件的屬性堪澎,然后把 'input' 值作為給組件綁定事件時(shí)的事件名

代碼分析

所以這里在js中@input="$emit('input', $event.target.value)" 子組件在監(jiān)聽input事件發(fā)生的時(shí)候(即@input),向父組件傳遞了input($emit中的input)事件擂错,并且傳遞了當(dāng)前子組件的price值。

而在父組件中樱蛤,監(jiān)聽了自定義事件input钮呀,當(dāng)自定義事件input觸發(fā)后剑鞍,將當(dāng)前父組件自身的price值改為子組件中$emit上來(lái)的值($event.target.value 是作為$emit傳遞的參數(shù),所以是arguments[0])

v-model存在的問(wèn)題

對(duì)于復(fù)選框或者單選框的常見組件時(shí)爽醋,由于v-model默認(rèn)傳的是value蚁署,不是checked,觸發(fā)事件也不是oninput而是onchange

  • 對(duì)于單純的input type='checkbox'
    <input type="checkbox" :checked="status" @change="status = $event.target.checked" />
  • 當(dāng)用到組件上時(shí):
<my-checkbox v-model="foo"></my-checkbox>

Vue.component('my-checkbox', {
 tempalte: `<input 
        type="checkbox"
        @change="$emit('input', $event.target.checked)"
        :checked="value"
       />`
 props: ['value'],
})

這個(gè)時(shí)候需要Vue的model選項(xiàng)
model選項(xiàng)可以指定當(dāng)前的事件類型和傳入的props

所以可以通過(guò)這么改進(jìn):

<my-checkbox v-model="foo"></my-checkbox>

Vue.component('my-checkbox', {
 tempalte: `<input 
        type="checkbox"
        <!--這里就不用 input 了蚂四,而是 balabala-->
        @change="$emit('balabala', $event.target.checked)"
        :checked="value"
       />`
 props: ['checked'], //這里就不用 value 了光戈,而是 checked
 model: { // model選項(xiàng)來(lái)指定
  prop: 'checked',
  event: 'balabala'
 },
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市遂赠,隨后出現(xiàn)的幾起案子久妆,更是在濱河造成了極大的恐慌,老刑警劉巖跷睦,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件筷弦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡抑诸,警方通過(guò)查閱死者的電腦和手機(jī)烂琴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)蜕乡,“玉大人奸绷,你說(shuō)我怎么就攤上這事∫煜#” “怎么了健盒?”我有些...
    開封第一講書人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)称簿。 經(jīng)常有香客問(wèn)我扣癣,道長(zhǎng),這世上最難降的妖魔是什么憨降? 我笑而不...
    開封第一講書人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任父虑,我火速辦了婚禮,結(jié)果婚禮上授药,老公的妹妹穿的比我還像新娘士嚎。我一直安慰自己,他們只是感情好悔叽,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開白布莱衩。 她就那樣靜靜地躺著,像睡著了一般娇澎。 火紅的嫁衣襯著肌膚如雪笨蚁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,807評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音括细,去河邊找鬼伪很。 笑死,一個(gè)胖子當(dāng)著我的面吹牛奋单,可吹牛的內(nèi)容都是我干的锉试。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼览濒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呆盖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起匾七,我...
    開封第一講書人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤絮短,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后昨忆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡杉允,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年邑贴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叔磷。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拢驾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出改基,到底是詐尸還是另有隱情繁疤,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布秕狰,位于F島的核電站稠腊,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏鸣哀。R本人自食惡果不足惜架忌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望我衬。 院中可真熱鬧叹放,春花似錦、人聲如沸挠羔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)破加。三九已至俱恶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速那。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工俐银, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人端仰。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓捶惜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親荔烧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吱七,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • 下載安裝搭建環(huán)境 可以選npm安裝,或者簡(jiǎn)單下載一個(gè)開發(fā)版的vue.js文件 瀏覽器打開加載有vue的文檔時(shí)鹤竭,控制...
    冥冥2017閱讀 6,052評(píng)論 0 42
  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容踊餐,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,052評(píng)論 0 29
  • 模板語(yǔ)法 插值 Vue 2 提供了 v-once 指令進(jìn)行一次插值臀稚,替代了 Vue 1 的 {{ * msg }}...
    云之外閱讀 658評(píng)論 0 3
  • vue.js是什么 是一套構(gòu)建用戶界面的漸進(jìn)式框架 vue應(yīng)用組成 一個(gè) Vue 應(yīng)用由一個(gè)通過(guò)new Vue創(chuàng)建...
    多多醬_DuoDuo_閱讀 1,034評(píng)論 0 2
  • 上個(gè)星期沒更新吝岭,作為補(bǔ)償,這星期更新兩篇吧寺。 同人就不更新了窜管,大家請(qǐng)諒解。 玲回到了家稚机,心潮澎湃幕帆,她可以預(yù)感到...
    匿名12閱讀 408評(píng)論 0 0