vue數據監聽原理


用簡單代碼模擬vue數據監聽原理

// 核心數據響應式方法
function defineReactive(obj,key,val){
    // val可能還是個對象,需要遞歸一下
    objserve(val)
    Object.defineProperty(obj,key,{
        get(){
            return val
        },
        set(newVal){
            if(newVal !== val){
                val = newVal
                // 如果改變的是個對象,還需要調用一下
                objserve(newVal)
                console.log('set', newVal);
                // 在這里已經監聽到了數據的變化,后續可以做一些更新視圖的操作
            }
        }
    })
}
// 如果一個對象有多個屬性,循環調用defineReactive,傳入每一個值去進行監聽
function objserve(obj){
    // 判斷obj類型
    if(Object.prototype.toString.call(obj)!=="[object Object]"){
        return
    }
    Object.keys(obj).forEach(key =>defineReactive(obj,key,obj[key]))
}
// 如果給對象增加新的屬性,是監聽不到變化的,那么需要用set方法傳入新對象,調用defineReactive手動監聽一下
function set(obj,key,val){
    defineReactive(obj,key,val)
}
const obj = {foo:'foo',baz:{a:1}};
objserve(obj)
obj.foo = '2222'
obj.baz.a = '3333'
obj.baz = {a:10} 
obj.baz.a = 100
set(obj,"dong",'dong')
obj.dong = "dong1"

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM