新聞中心
怎么深入了解vue2中的 v-model以及讓組件支持該語(yǔ)法,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
十載的日照網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。營(yíng)銷型網(wǎng)站的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整日照建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“日照網(wǎng)站設(shè)計(jì)”,“日照網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
一、v-model
的本質(zhì)是語(yǔ)法糖。
『
v-model
本質(zhì)上不過(guò)是語(yǔ)法糖。它負(fù)責(zé)監(jiān)聽用戶的輸入事件以更新數(shù)據(jù),并對(duì)一些極端場(chǎng)景進(jìn)行一些特殊處理?!?-- 官方文檔?!鞠嚓P(guān)推薦:vue.js教程】
什么是語(yǔ)法糖?
語(yǔ)法糖,簡(jiǎn)單來(lái)說(shuō)就是『便捷寫法』。
在大部分情況下, v-model="foo"
等價(jià)于 :value="foo"
加上 @input="foo = $event"
;
沒錯(cuò),在大部分情況下如此。
但也有例外:
vue2
給組件提供了model
屬性,可以讓用戶自定義傳值的prop名和更新值的事件名。這個(gè)暫且略過(guò),第四節(jié)會(huì)細(xì)說(shuō)。對(duì)于原生
html
原生元素,vue
干了大量『臟活兒』,目的是為了能讓我們忽視html
在api上的差異性。以下元素的左右兩種寫法是等價(jià)的:textarea
元素:
select
下拉框:
input type='radio'
單選框:
input type='checkbox'
多選框:
在編程思想上,這種幫助使用者『隱藏細(xì)節(jié)』的方式叫封裝。
二、v-model 僅僅是語(yǔ)法糖嗎?(冷知識(shí))
v-model
不僅僅是語(yǔ)法糖,它還有副作用。
副作用如下:如果 v-model
綁定的是響應(yīng)式對(duì)象上某個(gè)不存在的屬性,那么 vue
會(huì)悄悄地增加這個(gè)屬性,并讓它響應(yīng)式。
舉個(gè)例子,看下面的代碼:
// template中:// script中: export default { data() { return { user: { name: '公眾號(hào): 前端要摸魚', } } } }
響應(yīng)式數(shù)據(jù)中沒有定義 user.tel
屬性,但是 template
里卻用 v-model
綁定了 user.tel
,猜一猜當(dāng)你輸入時(shí)會(huì)發(fā)生什么?
看效果:
揭曉答案吧:user
上會(huì)新增 tel
屬性,并且 tel
這個(gè)屬性還是響應(yīng)式的。
這就是『副作用』帶來(lái)的效果,你學(xué)會(huì)了嗎?
三、 v-model
是雙向綁定還是單向數(shù)據(jù)流?
2.1 v-model
是雙向綁定嗎?
是,官方說(shuō)是。
『你可以用 v-model 指令在表單 、
及
元素上創(chuàng)建雙向數(shù)據(jù)綁定?!?—— vue2官方文檔
2.2 那 v-model
是單向數(shù)據(jù)流嗎?
是的,它甚至是單向數(shù)據(jù)流的典型范式。
雖然官方?jīng)]有明確表示這點(diǎn),但我們可以捋一捋兩者的關(guān)系。
什么是單項(xiàng)數(shù)據(jù)流?
子組件不能改變父組件傳遞給它的 prop
屬性,推薦的做法是它拋出事件,通知父組件自行改變綁定的值。
v-model
的做法是怎樣的?
v-model
做法完全符合單項(xiàng)數(shù)據(jù)流。甚至于,它給出了一種在命名和事件定義上的規(guī)范。
眾所周知 .sync
修飾符是單向數(shù)據(jù)流的另一個(gè)典型范式。
『?jiǎn)蜗驍?shù)據(jù)流』總結(jié)起來(lái)其實(shí)也就8個(gè)字:『數(shù)據(jù)向下,事件向上』。
四、如何讓你開發(fā)的組件支持 v-model
雖然不想說(shuō),但這確實(shí)是高頻面試題。
在定義 vue
組件時(shí),你可以提供一個(gè) model
屬性,用來(lái)定義該組件以何種方式支持 v-model
。
model
屬性本身是有默認(rèn)值的,如下:
// 默認(rèn)的 model 屬性 export default { model: { prop: 'value', event: 'input' } }
也就是說(shuō),如果你不定義 model
屬性,或者你按照當(dāng)面方法定義屬性,當(dāng)其他人使用你的自定義組件時(shí),v-model="foo"
就完全等價(jià)于 :value="foo"
加上 @input="foo = $event"
。
如果把 model
屬性進(jìn)行一些改裝,如下:
// 默認(rèn)的 model 屬性 export default { model: { prop: 'ame', event: 'zard' } }
那么,v-model="foo"
就等價(jià)于 :ame="foo"
加上 @zard="foo = $event"
。
沒錯(cuò),就是這么容易,讓我們看個(gè)例子。
先定義一個(gè)自定義組件:
我們是TI{{ ame }}冠軍加 減
然后我們?cè)诟附M件中使用該組件:
// template中// script中 export default { data() { return { ti: 8 } } }
看看效果:
讓你的組件支持 v-model
就這么容易。
五、demo和源碼
獲取源碼請(qǐng)?jiān)L問(wèn)github
https://github.com/zhangshichun/blog-vue2-demos/tree/master/src/views/about-v-model
關(guān)于怎么深入了解vue2中的 v-model以及讓組件支持該語(yǔ)法問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
當(dāng)前名稱:怎么深入了解vue2中的v-model以及讓組件支持該語(yǔ)法
瀏覽地址:http://www.dlmjj.cn/article/poodgp.html