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