摘要:執(zhí)行的時(shí)候,會(huì)綁定上下文對(duì)象為組件實(shí)例于是中的就能取到組件實(shí)例本身,的代碼塊頂層作用域就綁定為了組件實(shí)例于是內(nèi)部變量的訪問(wèn),就會(huì)首先訪問(wèn)到組件實(shí)例上。其中的獲取,就會(huì)先從組件實(shí)例上獲取,相當(dāng)于。
寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟
專(zhuān)注 Vue 源碼分享,文章分為白話(huà)版和 源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧
研究基于 Vue版本 【2.5.17】
如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或者 拉到 下面關(guān)注公眾號(hào)也可以吧
【Vue原理】VModel - 白話(huà)版
說(shuō)到 Vue,感覺(jué)第一印象就是雙向綁定,所以v-model鍵值是Vue印象的半壁江山啊,這么重要的東西,你好歹要知道是怎么實(shí)現(xiàn)的吧
我們今天就來(lái)講解雙向綁定的工作原理,你應(yīng)該知道,雙向綁定就是通過(guò)綁定 dom 事件來(lái)實(shí)現(xiàn)的,可是,怎么綁定的事件,綁定什么事件?
首先,雙向綁定,我個(gè)人認(rèn)為應(yīng)該分為 初始化綁定 和 雙向更新 兩part。
初始化綁定,就是初始化時(shí)給表單元素綁定值,綁定事件,為雙向更新做準(zhǔn)備
雙向更新,就是任意一邊變化,同時(shí)能讓另一個(gè)邊更新
雙向更新那是后話(huà),只有一開(kāi)始時(shí)成功執(zhí)行綁定操作才會(huì)有之后 雙向更新這個(gè)東西,所以,今天按順序來(lái)了解兩個(gè)part,從四個(gè)問(wèn)題開(kāi)始
1、v-model 怎么給表單綁定數(shù)據(jù)
2、v-model 綁定什么事件
3、v-model 怎么綁定事件
4、v-model 如何進(jìn)行雙向更新
TIP
v-model 還可以用在 自定義組件上,但是很明顯,這次我們先不講這一塊,而是先將正常的表單使用
先看結(jié)論我們先以 input text 類(lèi)型講解,對(duì)于其他的表單元素,流程都差不多,只是中間涉及的內(nèi)容不同。所以就先講個(gè)例子,然后具體在源碼版全部一起說(shuō)
1、怎么賦值?v-model 綁定的數(shù)據(jù)賦值給表單元素的 value 屬性
2、怎么綁定事件?解析不同表單元素,配置相應(yīng)的事件名和事件回調(diào),在插入dom之前,addEventListener 綁定上事件
3、怎么雙綁?外部變化,觸發(fā)事件回調(diào),event.target.value 賦值給model綁定的數(shù)據(jù);內(nèi)部變化,修改表單元素屬性 value
看完結(jié)論,有點(diǎn)懵?我們來(lái)看看具體的內(nèi)容,結(jié)果導(dǎo)向來(lái)進(jìn)行學(xué)習(xí)
下面的講解以下面這個(gè)為例
v-model 怎么給表單綁定數(shù)據(jù)獲取值流程
首先,上面例子解析后的渲染函數(shù)是下面這樣(已簡(jiǎn)化,只保留表單值相關(guān))
(function(){ with(this){ return _c("div",[ _c("input", domProps:{"value":name} ) ]) } })
1、這個(gè)渲染函數(shù)是沒(méi)有執(zhí)行的 匿名函數(shù)。執(zhí)行的時(shí)候,會(huì)綁定上下文對(duì)象為 組件實(shí)例
2、于是 with(this) 中的 this 就能取到 組件實(shí)例本身,with 的代碼塊 頂層作用域 就綁定為了 組件實(shí)例
3、于是 with 內(nèi)部變量的訪問(wèn),就會(huì)首先訪問(wèn)到 組件實(shí)例上。其中 name 的 獲取,就會(huì)先從 組件實(shí)例上獲取,相當(dāng)于 vm.name。賦值完成后,domProps 就是下面這樣
{ domProps:{value:111} }
4、上面的 value 是 v-model 解析成的原生屬性,保存在屬于該節(jié)點(diǎn) input 的 domProps 對(duì)象存儲(chǔ)器中
綁定值流程
創(chuàng)建dom input 之后,插入dom input 之前,遍歷該 input 的 domProps ,逐個(gè)添加給 input dom
簡(jiǎn)化后的代碼像下面這樣進(jìn)行賦值
for(var i in domProps){ input[i]=domProps[i] }
其中給節(jié)點(diǎn)賦值就是這樣
input.value = 111v-model 綁定什么事件
不同的表單元素使用v-model,會(huì)綁定不同的 事件
change 事件
select,checkbox,radio
input 事件
這是默認(rèn)事件,當(dāng)不是上面三種表單元素時(shí),會(huì)解析成 input 事件
比如 text、number 等 input 元素和 textarea
TIP
實(shí)際上關(guān)于 input 和 textarea 綁定的事件遠(yuǎn)不止 input 一個(gè)事件,但是涉及內(nèi)容太多,打算放在源碼版說(shuō)明,這里先簡(jiǎn)單默認(rèn)是 input 事件
v-model 怎么綁定事件上面例子解析成下面的渲染函數(shù)(已簡(jiǎn)化,只保留事件相關(guān))
with(this) { return _c("div", [ _c("input", { on: { "input": function($event) { name = $event.target.value } } } )]) }
解析事件流程
1解析不同表單元素,配置不同的事件
2拼裝 事件回調(diào)函數(shù),不同表單元素,回調(diào)不一樣
3把 事件名和拼裝回調(diào) 配套 保存給相應(yīng)的表單元素的 on 事件存儲(chǔ)器
什么時(shí)候綁定事件
生成 input dom 之后,插入input dom 之前
怎么綁
使用之前保存的 事件名和 事件回調(diào),給 input dom 像下面這樣綁定上事件
input.addEventListener("input",function($event) { name = $event.target.value })v-model 如何進(jìn)行雙向更新
雙向,指的是 外部和內(nèi)部
外部變化:用戶(hù)手動(dòng)改變表單值,輸入或者選擇
內(nèi)部變化:從內(nèi)部修改綁定值
內(nèi)部變化
1、v-model 綁定了 name ,name 會(huì)收集到 本組件的 watcher
a. 下面渲染函數(shù)執(zhí)行時(shí),會(huì)綁定本身組件實(shí)例為上下文對(duì)象
b. name 訪問(wèn)的是 組件實(shí)例的 name
c. name 此時(shí)便收集到了 當(dāng)前正在渲染的組件實(shí)例,當(dāng)前渲染的實(shí)例是自己,于是收集到了自身的 watcher
(function(){ with(this){ return _c("div",[_c("input", domProps:{"value":(name)}) ]) } })
如果你不懂 收集 watcher 什么意思,建議看下我的另一篇文章
【Vue原理】響應(yīng)式原理 - 白話(huà)版
2、內(nèi)部修改 name 變化,通知收集器內(nèi)的 watcher 更新,所以本組件會(huì)更新,上面的渲染函數(shù)重新執(zhí)行,便 重新從實(shí)例讀取 name
3、重新給 input dom 的 value 賦值,于是 頁(yè)面就更新了
怎么賦值?那是回到第一個(gè)問(wèn)題了,兄弟
外部變化
手動(dòng)改變表單,事件觸發(fā),執(zhí)行事件回調(diào)(下面這個(gè)),更新組件數(shù)據(jù) name
function($event) { name = $event.target.value }
更新內(nèi)部數(shù)據(jù)流程
1、當(dāng)事件觸發(fā)的時(shí)候,會(huì)把 表單的值 賦值給 name
2、name 是從 組件實(shí)例上訪問(wèn)的
3、所以這次賦值會(huì) 直接改變組件實(shí)例的 name
回調(diào)怎么賦值給組件實(shí)例的name
一開(kāi)始不懂,所以不理解,也沒(méi)查到,寫(xiě)了個(gè)例子,大概理解了意思
1、因?yàn)槭录卣{(diào) 在 with 里面聲明
2、于是事件回調(diào)的 作用域鏈最頂層 就加上了一層 with 綁定的作用域
3、就算事件回調(diào)不在 with 中執(zhí)行,事件回調(diào)中的 變量訪問(wèn),也會(huì)先訪問(wèn)之前 with 綁定過(guò)的作用域,因?yàn)樽饔糜蜴湹淖铐攲?/p>
with舉栗子
var name=22 var a={name:"a"} with(a){ var fn=function(){ console.log(name) } } fn()
你認(rèn)為 fn 執(zhí)行的時(shí)候,會(huì)打印出什么呢?行了,給你看結(jié)果了
好吧,再一次深刻認(rèn)識(shí)到一個(gè)知識(shí)點(diǎn),with 綁定作用域原來(lái)這么強(qiáng),離開(kāi)with執(zhí)行,還是先訪問(wèn)他的作用域,脫離不出魔爪啊,強(qiáng)盜作用域
回來(lái)總結(jié)!
于是當(dāng)事件回調(diào)執(zhí)行的時(shí)候,會(huì) 直接賦值 給 組件實(shí)例的name,這樣便通過(guò)外部改變了內(nèi)部數(shù)據(jù)
TIP
外部變化,本來(lái)可能會(huì)存在一種情況
a、手動(dòng)修改表單后, 回調(diào)內(nèi)會(huì)更新組件的值
b、組件的值更新之后,會(huì)通知組件更新,組件更新時(shí),便又會(huì)重新把input 賦值一遍
非常多余的一步操作,所以這里,Vue做一個(gè)判斷,判斷舊值和 新值是否相等,不等才更新,關(guān)于舊值,會(huì)保存在 dom 的 _value 屬性
總結(jié)v-model 三要素
1、綁定屬性
2、綁定事件
3、屬性+事件組合完成雙向更新
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/105204.html
摘要:寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注源碼分享,文章分為白話(huà)版和源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理源碼版之詳解今天我們來(lái)看看處 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注 Vue 源碼分享,文章分為白話(huà)版和 源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 ...
摘要:因?yàn)槭ソ裹c(diǎn)之后被強(qiáng)制更新了一波嗯,這就是的作用,把頁(yè)面上的顯示值也過(guò)濾一遍 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注 Vue 源碼分享,文章分為白話(huà)版和 源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【2.5.17】 如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或者 拉到 下面關(guān)注公眾號(hào)也可以吧 【Vue原理】VModel - 源碼版之input詳...
摘要:首先,兄弟,容我先說(shuō)幾句涉及源碼很多,篇幅很長(zhǎng),我都已經(jīng)分了上下三篇了,依然這么長(zhǎng),但是其實(shí)內(nèi)容都差不多一樣,但是我還是毫無(wú)保留地給你了。 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注 Vue 源碼分享,文章分為白話(huà)版和 源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【2.5.17】 如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊 下面鏈接 或者 拉到 下面關(guān)注公眾號(hào)也...
摘要:寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注源碼分享,文章分為白話(huà)版和源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于版本如果你覺(jué)得排版難看,請(qǐng)點(diǎn)擊下面鏈接或者拉到下面關(guān)注公眾號(hào)也可以吧原理源碼版之節(jié)點(diǎn)數(shù)據(jù)拼接上一篇我們 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟 專(zhuān)注 Vue 源碼分享,文章分為白話(huà)版和 源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究...
摘要:所以我今后打算把每一個(gè)內(nèi)容分成白話(huà)版和源碼版。有什么錯(cuò)誤的地方,感謝大家能夠指出響應(yīng)式系統(tǒng)我們都知道,只要在實(shí)例中聲明過(guò)的數(shù)據(jù),那么這個(gè)數(shù)據(jù)就是響應(yīng)式的。什么是響應(yīng)式,也即是說(shuō),數(shù)據(jù)發(fā)生改變的時(shí)候,視圖會(huì)重新渲染,匹配更新為最新的值。 寫(xiě)文章不容易,點(diǎn)個(gè)贊唄兄弟專(zhuān)注 Vue 源碼分享,文章分為白話(huà)版和 源碼版,白話(huà)版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 V...
閱讀 3229·2021-11-11 16:55
閱讀 2490·2021-10-13 09:39
閱讀 2424·2021-09-13 10:27
閱讀 2163·2019-08-30 15:55
閱讀 3088·2019-08-30 15:54
閱讀 3133·2019-08-29 16:34
閱讀 1827·2019-08-29 12:41
閱讀 1072·2019-08-29 11:33