摘要:依賴(lài)收集觀察數(shù)據(jù)添加到中編譯為抽象語(yǔ)法樹(shù)這里要簡(jiǎn)單得多獲取設(shè)置為根節(jié)點(diǎn),傳入的指令名指令對(duì)應(yīng)指令所屬實(shí)例指令對(duì)應(yīng)值綁定屬性值
Document
class MyVue { constructor(options) { this.$options = options; this.$el = document.querySelector(options.el); this.$data = options.data; this.$methods = options.methods; this._binding = {}; // 依賴(lài)收集 this._observe(this.$data); // 觀察data數(shù)據(jù)添加到Watcher中 this._compile(this.$el); // 編譯為抽象語(yǔ)法樹(shù)AST 這里要簡(jiǎn)單得多 } _observe(obj) { for (let key in obj) { if (obj.hasOwnProperty(key)) { this._binding[key] = { _directives: [] }; console.log("this._binding[key]", this._binding[key]); let value = obj[key]; if (typeof value === "object") { this._observe(value); } let binding = this._binding[key]; Object.defineProperty(this.$data, key, { enumerable: true, configurable: true, get() { console.log(`${key}獲取${value}`); return value; }, set(newVal) { console.log(`${key}設(shè)置${newVal}`); if (value !== newVal) { value = newVal; binding._directives.forEach(item => item.update()); } } }); } } } _compile(root) { // root為根節(jié)點(diǎn),傳入的el let _this = this; let nodes = root.children; for (let i = 0; i < nodes.length; i++) { let node = nodes[i]; if (node.children.length) { this._compile(node); } if (node.hasAttribute("v-click")) { node.onclick = (function () { let attrVal = nodes[i].getAttribute("v-click"); return _this.$methods[attrVal].bind(_this.$data); })(); } if ( node.hasAttribute("v-model") && (node.tagName === "INPUT" || node.tagName === "TEXTAREA") ) { node.addEventListener( "input", (function (key) { let attrVal = nodes[i].getAttribute("v-model"); _this._binding[attrVal]._directives.push( new Watcher("input", node, _this, attrVal, "value") ); return function () { _this.$data[attrVal] = nodes[key].value; }; })(i) ); } if (node.hasAttribute("v-bind")) { let attrVal = nodes[i].getAttribute("v-bind"); _this._binding[attrVal]._directives.push( new Watcher("text", node, _this, attrVal, "innerHTML") ); } } } } class Watcher { constructor(name, el, vm, exp, attr) { this.name = name; // 指令名 this.el = el; // 指令對(duì)應(yīng)dom this.vm = vm; // 指令所屬實(shí)例 this.exp = exp; // 指令對(duì)應(yīng)值 this.attr = attr; // 綁定屬性值 this.update(); } update() { this.el[this.attr] = this.vm.$data[this.exp]; } } var app = new MyVue({ el: "#app", data: { number: 0 }, methods: { increment() { this.number++; } } });
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/103078.html
摘要:上一篇寫(xiě)了實(shí)現(xiàn)框架的一些基本概念本篇用代碼來(lái)實(shí)現(xiàn)一個(gè)完整的框架思考假設(shè)有如下代碼,里面的會(huì)和試圖中的一一映射,修改的值,會(huì)直接引起試圖中對(duì)應(yīng)數(shù)據(jù)的變化如何實(shí)現(xiàn)上述呢回想下這篇講的觀察者模式和數(shù)據(jù)監(jiān)聽(tīng)主題是什么觀察者是什么觀察者何時(shí)訂閱主題主 上一篇寫(xiě)了實(shí)現(xiàn) MVVM 框架的一些基本概念 本篇用代碼來(lái)實(shí)現(xiàn)一個(gè)完整的 MVVM 框架 思考 假設(shè)有如下代碼,data里面的name會(huì)和試圖中的...
摘要:小白一枚,一直使用的是,想要多了解一些其它的框架,正好最近越來(lái)越火熱,上的數(shù)已經(jīng)超過(guò)了。框架理解說(shuō)起這個(gè)模型,就不得不說(shuō)框架。函數(shù)表示創(chuàng)建一個(gè)文本節(jié)點(diǎn),函數(shù)表示創(chuàng)建一個(gè)數(shù)組。 小白一枚,一直使用的是React,想要多了解一些其它的框架,正好最近Vue越來(lái)越火熱,Github上的Star數(shù)已經(jīng)超過(guò)了React。而其背后蘊(yùn)含的MVVM框架思想也一直跟React的組件化開(kāi)發(fā)思想并駕齊驅(qū),在這...
摘要:在前端頁(yè)面中,把用純對(duì)象表示,負(fù)責(zé)顯示,兩者做到了最大化的分離把和關(guān)聯(lián)起來(lái)的就是。了解了思想后,自己用原生實(shí)現(xiàn)一個(gè)框架。注意數(shù)據(jù)描述符和存儲(chǔ)描述符不能同時(shí)存在,否則會(huì)報(bào)錯(cuò)報(bào)錯(cuò)數(shù)據(jù)攔截使用來(lái)實(shí)現(xiàn)數(shù)據(jù)攔截,從而實(shí)現(xiàn)數(shù)據(jù)監(jiān)聽(tīng)。 在前端頁(yè)面中,把 Model 用純 JS 對(duì)象表示,View 負(fù)責(zé)顯示,兩者做到了最大化的分離 把 Model 和 View 關(guān)聯(lián)起來(lái)的就是 ViewModel。Vi...
摘要:框架的誕生以上便是一個(gè)簡(jiǎn)短精簡(jiǎn)的風(fēng)格的學(xué)生信息的示例。至此,一個(gè)精簡(jiǎn)的框架其實(shí)已經(jīng)出來(lái)了什么你確定不是在開(kāi)玩笑一個(gè)只有十行的框架請(qǐng)記住框架是對(duì)如何組織代碼和整個(gè)項(xiàng)目如何通用運(yùn)作的抽象。 前言 MVVM模式相信做前端的人都不陌生,去網(wǎng)上搜MVVM,會(huì)出現(xiàn)一大堆關(guān)于MVVM模式的博文,但是這些博文大多都只是用圖片和文字來(lái)進(jìn)行抽象的概念講解,對(duì)于剛接觸MVVM模式的新手來(lái)說(shuō),這些概念雖然能夠...
摘要:為了將對(duì)象和視圖綁定在一起,我們需要設(shè)置一個(gè)回調(diào)函數(shù),當(dāng)對(duì)象的屬性發(fā)生改變時(shí)發(fā)送一個(gè)更新視圖的通知。下面是值發(fā)生變化的時(shí)候調(diào)用的回調(diào)函數(shù),當(dāng)然現(xiàn)在我們可以使用更簡(jiǎn)單的進(jìn)行數(shù)據(jù)的監(jiān)聽(tīng),這在我們后面的將會(huì)講到。 MVC MVC是一種設(shè)計(jì)模式,它將應(yīng)用劃分為3個(gè)部分:數(shù)據(jù)(模型)、展示層(視圖)和用戶(hù)交互層。結(jié)合一下下圖,更能理解三者之間的關(guān)系。showImg(https://segment...
閱讀 3385·2021-11-24 09:38
閱讀 1385·2021-11-22 15:08
閱讀 1454·2021-09-29 09:35
閱讀 475·2021-09-02 15:11
閱讀 1304·2019-08-30 12:55
閱讀 384·2019-08-29 17:16
閱讀 492·2019-08-29 11:30
閱讀 415·2019-08-26 13:23