一起學習理解vue源碼
根據vue的官網介紹,可以得知vue是mvvm框架,且是響應式的。為了更深入了理解其內涵,本人以及理解實現了一個簡單的mvvm學習的demo。以下分享給大家,歡迎大家一起討論。
一、mvvm至少包含的內容
指令集合,如:text、model等
資料模型,與視圖互動的資料
元件的支援:也就是部分html程式碼的動態更新
二、我的實作
#1. 變數的定義與watch的實作
var directives = {}; //指令集合var vNodes = new Array(); //解析的Dom集合var dataModel = { name:"name", title: "title"}; //数据Modelvar Watch = { isInit: false, watchs: new Array(), run: function(newValue, expOrfn){ var self = this;if(!self.isInit){ expOrfn.call(vModel); }this.watchs.map(function(data,index){ data.nodes.map(function(d,i){if(self.isInit){ d.directive.init(newValue, d, data); //绑定初始化值, 以及初始化一些事件}else{ d.directive.update(newValue, d, data); //只更新值,此时run的调用来值value-set } }); }); self.watchs = []; }, push:function(watch){this.watchs.push(watch); } } //任务管理
說明:
Watch的push方法,用於依賴的添加,然後run來執行所以依賴,執行完成後,需要清理當前依賴的集合。在vue中依賴的收集是在dep中完成的,而watch提供的任務管理(不知道理解是否正確)
2. 指令的定義
directives.text = { init: function(value, vNode){ vNode.elm.textContent = value; }, update: function(value, vNode){ vNode.elm.textContent = value; } }//需要响应事件的怎么办directives.model ={ init: function(value, vNode, _watch){ vNode.elm.value = value; //判断自己发生的改变,不应该再改变自己 vNode.elm.addEventListener('keyup',function(evt){ vNode.model[_watch.key] = vNode.elm.value; }); }, update:function(){ } }
說明:
#由於是demo學習範例,所以只定義了簡單的text和model兩個指定,text:用於資料的顯示,而model用於input(輸入框)的回應
3. vModel的產生
//转换vModel,暂支持一级var properties = Object.getOwnPropertyNames(dataModel);var vModel = {}, formSetting = false;for( var index in properties){ (function refreshData(_index){var key = properties[_index];var property = Object.getOwnPropertyDescriptor(dataModel, key);var setter = property.set;var getter = property.get;var _val = property.value;var _getter = function(){var val = getter ? getter.call(vModel) : _val;//收集依赖,与watch要分开 Watch.push({ key: key, nodes: vNodes.filter(function(data,index){return data.modelKey == key ? true : false; }), getter: _getter });return val; }; Object.defineProperty(vModel, key, { configurable: true, enumerable: true, set: function(value){if(setter){ setter.call(vModel, value); } //处理依赖 Watch.run(value, _getter);//this.value = value; }, get: _getter }) })(index); }
說明:
vModel是根據dataModel產生的,也就是自訂了每個屬性的get和set方法,在es6中也可以用proxy實作(是否說對了)。
在屬性set的時候,會先呼叫get方法來收集依賴。方便值改變後,能將所影響的內容都修改掉。
4. 解析dom為vNode
//解析vNodesvar app = document.getElementById('app'); app.childNodes.forEach(function(data,index){if(data.nodeType != 1) return;var hv = data.getAttribute('data-hv');var hvs = hv.split(','); hvs.forEach(function(item,row){var keyValue = item.split(':'); //vNode对象上一定要有model,这是方便vNode相应时候的找vModel vNodes.push({ directive: directives[keyValue[0]], modelKey: keyValue[1], model: vModel, elm: data }); }); });
說明:
這裡說解析為vNode很牽強,因為此只是收集了dom上data-hv指定的指令,並將對就的指令、元素、vModel等組成一個物件儲存在vNodes中,以供vModel各屬性的get方法收集依賴時引用。
5. 第一次初始化
//调用所有的get一次Watch.isInit = true;var _keys = Object.getOwnPropertyNames(vModel); _keys.map(function(key,data){var data = vModel[key]; Watch.run(data); }); Watch.isInit = false;
#說明:
將初始化的vModel的值渲染到Dom上,這裡是主動執行每個的get,然後執行watch.run方法。
此處設計與實現本人感覺與vue的思路不對,如有高人看見,麻煩提點與指引。
6. 被解析的dom
<div id="app"><span data-hv="text:title"></span><span data-hv="text:title"></span><input data-hv="model:title" /></div>
以上是一起學習理解vue源碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Python是一種高階程式語言,具有簡單易學、易讀易寫等特點,在軟體開發領域中得到了廣泛的應用。然而,由於Python的開源特性,原始碼很容易被他人輕易獲取,這就為軟體原始碼保護帶來了一些挑戰。因此,在實際應用中,我們常常需要採取一些方法來保護Python原始碼,確保其安全性。在軟體原始碼保護中,有多種針對Python的應用實務可供選擇。以下將介紹幾種常見

PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? PHP是一種伺服器端腳本語言,通常用於開發動態網頁。當PHP檔案在伺服器上被要求時,伺服器會解釋執行其中的PHP程式碼,並將最終的HTML內容傳送到瀏覽器以供顯示。然而,有時我們希望在瀏覽器中直接展示PHP檔案的原始碼,而不是被執行。本文將介紹如何在瀏覽器中顯示PHP程式碼的源碼,而不被解釋執行。在PHP中,可以使

可以使用瀏覽器的開發者工具來查看網站的源代碼,在Google Chrome瀏覽器中:1、開啟Chrome 瀏覽器,造訪要查看原始碼的網站;2、右鍵點選網頁上的任何位置,然後選擇「檢查」或按下快速鍵Ctrl + Shift + I開啟開發者工具;3、在開發者工具的頂部功能表列中,選擇「Elements」標籤;4、看到網站的HTML 和CSS 程式碼即可。

vue能顯示原始碼,vue查看看原始碼的方法是:1、透過「git clone https://github.com/vuejs/vue.git」取得vue;2、透過「npm i」安裝依賴;3、透過「 npm i -g rollup」安裝rollup;4、修改dev腳本;5、偵錯原始碼即可。

透過理解Golang框架原始碼,開發者可以掌握語言精髓和擴展框架功能。首先,取得原始碼並熟悉其目錄結構。其次,閱讀程式碼、追蹤執行流程和理解依賴關係。實戰案例展示如何應用這些知識:建立自訂中間件並擴展路由系統。最佳實踐包括逐步學習、避免盲目複製貼上、利用工具和參考線上資源。

idea檢視tomcat原始碼的步驟:1、下載Tomcat原始碼;2、在IDEA中匯入Tomcat原始碼;3、檢視Tomcat原始碼;4、理解Tomcat的工作原理;5、注意事項;6、持續學習和更新;7、使用工具和插件;8、參與社區和貢獻。詳細介紹:1、下載Tomcat原始碼,可以從Apache Tomcat的官方網站上下載原始碼包,通常這些原始碼包是以ZIP或TAR格式等等。

本文探讨了Go框架的源码解析和优化。源码结构包括四个主要包,涉及核心框架逻辑、请求上下文、数据绑定和响应渲染。优化技巧包括:1.使用路由树优化路由处理,以显著提高路由查找速度。2.使用中间件进行缓存和压缩,以减少服务器负载和响应时间。3.避免在回调中执行耗时操作,以保持高响应性。4.启用日志记录和分析慢请求,以便识别性能瓶颈。5.定期更新框架版本,以利用最新的性能改进。

理解HTTP狀態碼404的意思及應對策略HTTP是一種用於傳輸超文本的協議,它使用狀態碼來表示伺服器對請求的回應狀態。其中,狀態碼404是最常見的一種,它代表了「找不到」(NotFound)的意思。當我們在瀏覽器中造訪一個網頁或要求一個資源時,如果伺服器無法找到所要求的資源,就會回傳404狀態碼。 404狀態碼的意義是告訴客戶端,無法找到所要求的資源。這
