国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript之實現一個簡單的Vue

Gilbertat / 1804人閱讀

摘要:的使用相信大家都很熟練了,使用起來簡單。但是大部分人不知道其內部的原理是怎么樣的,今天我們就來一起實現一個簡單的實現之前我們得先看一下的實現,因為主要是通過數據劫持來實現的,通過來完成數據的讀取和更新。

vue的使用相信大家都很熟練了,使用起來簡單。但是大部分人不知道其內部的原理是怎么樣的,今天我們就來一起實現一個簡單的vue

Object.defineProperty()

實現之前我們得先看一下Object.defineProperty的實現,因為vue主要是通過數據劫持來實現的,通過getset來完成數據的讀取和更新。

var obj = {name:"wclimb"}
var age = 24
Object.defineProperty(obj,"age",{
    enumerable: true, // 可枚舉
    configurable: false, // 不能再define
    get () {
        return age
    },
    set (newVal) {
        console.log("我改變了",age +" -> "+newVal);
        age = newVal
    }
})

> obj.age
> 24

> obj.age = 25;
> 我改變了 24 -> 25
> 25

從上面可以看到通過get獲取數據,通過set監聽到數據變化執行相應操作,還是不明白的話可以去看看Object.defineProperty文檔。

流程圖

html代碼結構

{{form}}
js調用
    new Vue({
        el: "#wrap",
        data:{
            form: "這是form的值",
            test: "我是粗體",
        },
        methods:{
            changeValue(){
                console.log(this.form)
                this.form = "值被我改變了,氣不氣?"
            }
        }
    })
Vue結構
    class Vue{
        constructor(){}
        proxyData(){}
        observer(){}
        compile(){}
        compileText(){}
    }
    class Watcher{
        constructor(){}
        update(){}
    }

Vue constructor 構造函數主要是數據的初始化

proxyData 數據代理

observer 劫持監聽所有數據

compile 解析dom

compileText 解析dom里處理純雙花括號的操作

Watcher 更新視圖操作

Vue constructor 初始化
    class Vue{
        constructor(options = {}){
            this.$el = document.querySelector(options.el);
            let data = this.data = options.data; 
            // 代理data,使其能直接this.xxx的方式訪問data,正常的話需要this.data.xxx
            Object.keys(data).forEach((key)=> {
                this.proxyData(key);
            });
            this.methods = options.methods // 事件方法
            this.watcherTask = {}; // 需要監聽的任務列表
            this.observer(data); // 初始化劫持監聽所有數據
            this.compile(this.$el); // 解析dom
        }
    }

上面主要是初始化操作,針對傳過來的數據進行處理

proxyData 代理data
class Vue{
        constructor(options = {}){
            ......
        }
        proxyData(key){
            let that = this;
            Object.defineProperty(that, key, {
                configurable: false,
                enumerable: true,
                get () {
                    return that.data[key];
                },
                set (newVal) {
                    that.data[key] = newVal;
                }
            });
        }
    }

上面主要是代理data到最上層,this.xxx的方式直接訪問data

observer 劫持監聽
class Vue{
        constructor(options = {}){
            ......
        }
        proxyData(key){
            ......
        }
        observer(data){
            let that = this
            Object.keys(data).forEach(key=>{
                let value = data[key]
                this.watcherTask[key] = []
                Object.defineProperty(data,key,{
                    configurable: false,
                    enumerable: true,
                    get(){
                        return value
                    },
                    set(newValue){
                        if(newValue !== value){
                            value = newValue
                            that.watcherTask[key].forEach(task => {
                                task.update()
                            })
                        }
                    }
                })
            })
        }
    }

同樣是使用Object.defineProperty來監聽數據,初始化需要訂閱的數據。
把需要訂閱的數據到pushwatcherTask里,等到時候需要更新的時候就可以批量更新數據了。

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/97706.html

相關文章

  • 個人分享--web前端學習資源分享

    摘要:前言月份開始出沒社區,現在差不多月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了一般來說,差不多到了轉正的時候,會進行總結或者分享會議那么今天我就把看過的一些學習資源主要是博客,博文推薦分享給大家。 1.前言 6月份開始出沒社區,現在差不多9月了,按照工作的說法,就是差不多過了三個月的試用期,準備轉正了!一般來說,差不多到了轉正的時候,會進行總結或者分享會議!那么今天我就...

    sherlock221 評論0 收藏0
  • 2017年3月份前端資源分享

    平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進擊的 Promise Effective JavaScript leeheys blog -...

    ermaoL 評論0 收藏0
  • 2017年3月份前端資源分享

    平日學習接觸過的網站積累,以每月的形式發布。2017年以前看這個網址:http://www.kancloud.cn/jsfron... 03月份前端資源分享 1. Javascript 175453545 Redux compose and middleware 源碼分析 深入 Promise(二)——進擊的 Promise Effective JavaScript leeheys blog -...

    kamushin233 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<