zoukankan      html  css  js  c++  java
  • 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"
  • 相关阅读:
    Admin添加字段
    django admin基础
    user_admin
    admin 模块功能
    todolist项目
    Django进阶项目
    Django进阶
    bolg项目
    EL&jstl
    模拟用户登录,内含验证码验证和request等操作
  • 原文地址:https://www.cnblogs.com/panda-programmer/p/13252194.html
Copyright © 2011-2022 走看看