目錄
一、mvvm至少包含的內容
二、我的實作
#1. 變數的定義與watch的實作
2. 指令的定義
3. vModel的產生
4. 解析dom為vNode
5. 第一次初始化
6. 被解析的dom
首頁 web前端 js教程 一起學習理解vue源碼

一起學習理解vue源碼

Jun 26, 2017 am 09:50 AM
原始碼 理解

      根據vue的官網介紹,可以得知vue是mvvm框架,且是響應式的。為了更深入了理解其內涵,本人以及理解實現了一個簡單的mvvm學習的demo。以下分享給大家,歡迎大家一起討論。

一、mvvm至少包含的內容

  1. 指令集合,如:text、model等

  2. 資料模型,與視圖互動的資料

  3. 元件的支援:也就是部分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);
    }
} //任务管理
登入後複製

說明:

  1. 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(){

    }   
}
登入後複製

說明:

  1. #由於是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);
}
登入後複製

說明:

  1. vModel是根據dataModel產生的,也就是自訂了每個屬性的get和set方法,在es6中也可以用proxy實作(是否說對了)。

  2. 在屬性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
        });
    });
});
登入後複製

說明:

  1. 這裡說解析為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;
登入後複製

#說明:

  1. 將初始化的vModel的值渲染到Dom上,這裡是主動執行每個的get,然後執行watch.run方法。

  2. 此處設計與實現本人感覺與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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1677
14
CakePHP 教程
1431
52
Laravel 教程
1334
25
PHP教程
1280
29
C# 教程
1257
24
Python在軟體原始碼保護的應用實踐 Python在軟體原始碼保護的應用實踐 Jun 29, 2023 am 11:20 AM

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

PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? PHP程式碼在瀏覽器中如何顯示原始碼而不被解釋執行? Mar 11, 2024 am 10:54 AM

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

網站線上看原始碼 網站線上看原始碼 Jan 10, 2024 pm 03:31 PM

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

vue能顯示原始碼嗎 vue能顯示原始碼嗎 Jan 05, 2023 pm 03:17 PM

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框架原始碼學習與應用全面指南 golang框架原始碼學習與應用全面指南 Jun 01, 2024 pm 10:31 PM

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

idea如何查看tomcat的源碼 idea如何查看tomcat的源碼 Jan 25, 2024 pm 02:01 PM

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

golang框架原始碼解析與最佳化 golang框架原始碼解析與最佳化 Jun 02, 2024 pm 04:54 PM

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

解讀HTTP狀態碼404並制定對應的解決方案 解讀HTTP狀態碼404並制定對應的解決方案 Feb 18, 2024 pm 04:44 PM

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

See all articles