摘要:原文博客地址如何理解如何實(shí)現(xiàn)是否解讀過(guò)的源碼與框架的區(qū)別實(shí)現(xiàn)實(shí)現(xiàn)獨(dú)立初始化實(shí)例兩者的區(qū)別數(shù)據(jù)和視圖的分離,解耦開(kāi)放封閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉在中在代碼中操作視圖和數(shù)據(jù),混在一塊了以數(shù)據(jù)驅(qū)動(dòng)視圖,只關(guān)心數(shù)據(jù)變化,
原文博客地址:https://finget.github.io/2018/05/31/mvvm-vue/MVVM
如何理解 MVVM
如何實(shí)現(xiàn) MVVM
是否解讀過(guò) Vue 的源碼
Jquery 與 框架的區(qū)別 jquery 實(shí)現(xiàn) todo-listvue 實(shí)現(xiàn) todo-list
兩者的區(qū)別
- {{item}}
數(shù)據(jù)和視圖的分離,解耦(開(kāi)放封閉原則,對(duì)擴(kuò)展開(kāi)放,對(duì)修改封閉)
在jQuery中在jQuery代碼中操作視圖和數(shù)據(jù),混在一塊了
以數(shù)據(jù)驅(qū)動(dòng)視圖,只關(guān)心數(shù)據(jù)變化,DOM操作被封裝
只改數(shù)據(jù),視圖自動(dòng)更新
MVVM的理解MVC (Model View Controller)
MVVM (Model View ViewModel)
View 通過(guò) 事件綁定 (DOM Listeners) 操作Model; Model通過(guò) 數(shù)據(jù)綁定 (Data Bindings)操作View。Vue 三要素
響應(yīng)式: Vue 如何監(jiān)聽(tīng)到 data 的每個(gè)屬性變化?
模板引擎: Vue 的模板如何被解析,指令如何處理?
渲染:Vue 的模板如何被渲染成Html?
Vue中如何實(shí)現(xiàn)響應(yīng)式 什么是響應(yīng)式修改 data 屬性之后, Vue 立刻監(jiān)聽(tīng)到
data 屬性被代理到 vm上
var vm = new Vue({ el: "#app", data: { name: "zhangsan", age: 20 } }) // vm.name = "zhangsan" // vm.age = "20"Object.defineProperty,Vue核心函數(shù)
var obj = { name: "zhangsan", age: 25 } console.log(obj.name); // 獲取屬性的時(shí)候,如何監(jiān)聽(tīng) obj.age = 26; // 賦值屬性的時(shí)候,如何監(jiān)聽(tīng)
上面是無(wú)法監(jiān)聽(tīng)對(duì)象的屬性的訪問(wèn)以及賦值操作的,直接就產(chǎn)生了操作的結(jié)果。
var obj = {} var _name = "shangsan" Object.defineProperty(obj, "name", { get: function () { console.log("get", _name) // 監(jiān)聽(tīng) return _name }, set: function (newVal) { console.log("set", newVal) // 監(jiān)聽(tīng) _name = newVal } }) console.log(obj.name); // 可以監(jiān)聽(tīng)到 obj.name = "lisi"; // 可以監(jiān)聽(tīng)到Vue 中何如解析模板 模板是什么
- {{item}}
本質(zhì): 字符串
有邏輯, 如 v-if v-for 等
與 html 標(biāo)簽格式很像,但有很大區(qū)別(html是靜態(tài)的,模板是動(dòng)態(tài)的)
最終還要轉(zhuǎn)換為 html 來(lái)顯示
模板最終必須轉(zhuǎn)換成 JS 代碼
有邏輯(v-if v-for 等),必須用JS才能實(shí)現(xiàn)(圖靈完備)
因此,模板最重要轉(zhuǎn)成一個(gè)JS函數(shù)(render函數(shù))
render函數(shù)var obj = { name: "zhangsan", age: 20, getAddress: function () { alert("beijing") } } // 不使用with function fn() { alert(obj.name) alert(obj.age) obj.getAddress() } fn() // 使用with function fn1() { with(obj) { alert(age) alert(name) getAddress() } } fn1()
{{price}}
模板將變成下面這個(gè)樣子:
function render() { with(this) { // this 就是 vm return _c( "div", { attrs: {"id": "app"} }, [ _c("p", [_v(_s(price))]) ] ) } }
在vue源碼里alert render 函數(shù)
以上面vue實(shí)現(xiàn)的todolist為例:
with(this){ // this 就是 vm return _c( // _c創(chuàng)建一個(gè)標(biāo)簽 "div", { attrs:{"id":"app"} }, [ _c( "div", [ _c( "input", { directives:[ { name:"model", rawName:"v-model", value:(title), expression:"title" } ], domProps:{ "value":(title) }, on:{ "input":function($event){ if($event.target.composing)return; title=$event.target.value } } } ), _v(" "), _c( "button", { on:{ "click":add } }, [_v("submit")] ) ] ), _v(" "), _c("div", [ _c( "ul", _l((list),function(item){return _c("li",[_v(_s(item))])}) // _l 解析 v-for 循環(huán) ) ] ) ] ) }
可以先看一下virtualDom
vm._c 其實(shí)相當(dāng)于 snabbdom 中的 h 函數(shù)
render 函數(shù)執(zhí)行之后,返回的是 vnode
updateComponent 中實(shí)現(xiàn)了 vdom 的 patch
頁(yè)面首次渲染 執(zhí)行updateComponent
data 中每次修改屬性, 執(zhí)行 updateComponent
第一步: 解析模板成render函數(shù)
with 的用法
模板中的所有信息都被render函數(shù)包含
模板中用到的data中的屬性,都變成了js變量
模板中的v-model v-if v-on 都變成了 js邏輯
render 函數(shù)返回 vnode
第二部: 響應(yīng)式開(kāi)始監(jiān)聽(tīng)
Object.defineProperty
將 data 的屬性代理到 vm 上
第三步: 首次渲染,顯示頁(yè)面,且綁定依賴
第四步: data 屬性變化,觸發(fā) rerender
最后創(chuàng)建了一個(gè)前端學(xué)習(xí)交流群,感興趣的朋友,一起來(lái)嗨呀!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/99542.html
摘要:原文博客地址另一篇轉(zhuǎn)載的從初級(jí)往高級(jí)走系列原型定義原型是對(duì)象的一個(gè)屬性,它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先。 原文博客地址:https://finget.github.io/2018/09/13/proto/另一篇轉(zhuǎn)載的JavaScript從初級(jí)往高級(jí)走系列————prototype 原型 定義: 原型是function對(duì)象的一個(gè)屬性,它定義了構(gòu)造函數(shù)制造出的對(duì)象的公共祖先。通...
摘要:之所以是單線程,取決于它的實(shí)際使用,例如不可能同添加一個(gè)和刪除這個(gè),所以它只能是單線程的。所以,這個(gè)新標(biāo)準(zhǔn)并沒(méi)有改變單線程的本質(zhì)。 原文博客地址:https://finget.github.io/2018/05/21/async/ 異步 什么是單線程,和異步有什么關(guān)系 什么是event-loop 是否用過(guò)jQuery的Deferred Promise的基本使用和原理 介紹一下asyn...
摘要:當(dāng)中的一些元素需要更新屬性,而這些屬性只是影響元素的外觀,風(fēng)格,而不會(huì)影響布局的,比如。則就叫稱為重繪。 原文博客地址:https://finget.github.io/2018/05/22/virtualDom/ 什么是虛擬DOM 用JS模擬DOM結(jié)構(gòu) DOM變化的對(duì)比,放在JS層來(lái)做(圖靈完備語(yǔ)言) 提高重繪性能 重繪和回流 頁(yè)面渲染過(guò)程:showImg(https://seg...
摘要:采用二八定律,主要涉及常用且重要的部分。對(duì)象是當(dāng)前模塊的導(dǎo)出對(duì)象,用于導(dǎo)出模塊公有方法和屬性。箭頭函數(shù)函數(shù)箭頭函數(shù)把去掉,在與之間加上當(dāng)我們使用箭頭函數(shù)時(shí),函數(shù)體內(nèi)的對(duì)象,就是定義時(shí)所在的對(duì)象,而不是使用時(shí)所在的對(duì)象。 ES6 原文博客地址:https://finget.github.io/2018/05/10/javascript-es6/ 現(xiàn)在基本上開(kāi)發(fā)中都在使用ES6,瀏覽器環(huán)境...
摘要:程序員到底是不是吃青春飯首先要明白什么是青春飯,青春飯的標(biāo)記是什么你這個(gè)行業(yè)或者是職業(yè)強(qiáng)調(diào)的是體力還是經(jīng)驗(yàn)和人脈如果你這個(gè)行業(yè)強(qiáng)調(diào)的是體力的話,那么這就是青春飯,比如快遞員工地搬磚人員等等。 ...
閱讀 1252·2021-09-01 10:30
閱讀 2126·2021-07-23 10:38
閱讀 901·2019-08-29 15:06
閱讀 3159·2019-08-29 13:53
閱讀 3281·2019-08-26 11:54
閱讀 1834·2019-08-26 11:38
閱讀 2376·2019-08-26 10:29
閱讀 3132·2019-08-23 18:15