搞懂Vue响应式原理——监听对象

Posted Kali

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了搞懂Vue响应式原理——监听对象相关的知识,希望对你有一定的参考价值。

源代码如下:

        //1、第一步 将数据列入跟踪 使用Object.defineProperty()
        let defineReactive = function (data) {
            if(!data || typeof data != \'object\') return  
            Object.keys(data).forEach(key => {
                    let value = data[key]
                    defineReactive(value)  //如果value还是对象,则对该对象递归继续使用defineReactive方法,实现深度绑定
                    Object.defineProperty(data, key, { //使用该方法监听对象属性的变化
                        enumerable: true,
                        configurable: true,
                        get: function () {
                            console.log(value,\'get method\')
                            return value
                        },
                        set: function (newValue) {
                            console.log(value,\'set method\')
                            if (value === newValue) return
                            value = newValue
                        }
                    })
            })
        }
        let obj = {
            a:3,
            b:5,
            c:{
                c1:7
            }
        }
        defineReactive(obj)
        // console.log(obj.a);
        console.log(obj.c.c1) //返回值为7,调用前输出7 "get method"
        // obj.a = 30
        obj.c.c1 = 70 // 输出7 "set method"
        // console.log(obj.a);
        console.log(obj.c.c1) //返回值为70,调用前输出70 "get method"

可以看到,在修改或者调用obj对象的属性时,相应操作已经被监听到并输出提示信息。此时我们已经完成对该对象的监听,并使用递归,在其属性值仍是对象时继续深入监听。核心是使用Object.defineProperty来监听对象属性的获取和修改。

以上是关于搞懂Vue响应式原理——监听对象的主要内容,如果未能解决你的问题,请参考以下文章

Proxy(vue响应式原理:数据侦测--数据劫持和数据代理)

通过Proxy和Reflect实现vue的响应式原理

vue3响应式模式设计原理

Vue 原理综合知识点

Part3-5-3 Vue.js 3.0 响应式系统原理

vue数据监听原理