vue2.x 的数据响应式原理

vue2.x 的数据响应式原理

现在 vue 3.x 已经出来,面试常问的问题就是 vue2.x 的数据响应式原理?

1、原理
        // 开发 vue 项目的时候,都是提前把响应式数据放到了 data 配置中
        /*
         data(){
             return {
                 name:'ddg'
                 age:20
             }
         }
        */
        // 一般情况下,响应式数据都是提前写好的,并且对象的属性有很多个,一般不会只有一个
        let data = {
            name: 'ddg',
            age: 20,
            job: '正在找'
        }
        // 要求 :  把上面的数据,变成 set get 形式
        Object.keys(data).forEach((key) => {
            // key 代表 data 的 所有属性的属性名
            console.log(key);
            console.log(data[key]);
            observe(data, key, data[key])
        })
        /**
         * @description: 循环遍历,给data中的每一个属性都加上 Object.defineProperty 
         * @param  {*} 
         * @return {*}
         * @Author: 呆呆狗
         * @Date: 2021-05-07 17:12:30
         * @LastEditTime: Do not edit
         * @LastEditors: 呆呆狗
         * @param {*} data 要处理的对象
         * @param {*} key 要处理的对象属性名
         * @param {*} value 要处理的对象属性名对应的初始值
         */
        function observe(data, key, value) {
            /* 
            1、函数定义形参相当于在内部中,声明了和形参对应的变量 并且初始化为 undefined
            2、函数调用传入实参的时候,相当于给内部声明好的变量做了赋值操作
            3、observe函数 调用完毕后,本来应该内部所有的变量都会回收,但是如果内部有其他函数,引用了 变量,则不会被回收
            4、Object.defineProperty 其实 也是 一个函数。所以变量并不会销毁,而是常驻内存
            5、由于闭包的特性,每一格传入下来的 value 都会常驻内存,相当于我们 一开始用的 中间变量,目的就是 为了  set 和 get 的联动

            */
            // let data = data
            // let key = 'name'
            // let value = 'ddg'
            Object.defineProperty(data, key, {
                set(newValue) {
                    value = newValue
                    console.log('你设置了属性  ', key);
                },
                get() {
                    console.log('你访问了属性  ', key);
                    return value
                }
            })
        }

        /* 
        1、实现数据响应式的方法有两个,一个就是 Object.defineProperty  方法 和 Proxy 对象代理
        2、vue 2.x 中,只要放到了 data 里的数据,不管层级多深,不管你用到还是用不到,都会进行递归响应式处理,,,如非必要,尽量不要添加太多的冗余数据在 data中
        3、vue3.x 解决了 数据响应式处理的无端性能消耗,使用的手段就是 Proxy 劫持对象整体 + 惰性处理(用到了 进行响应式转换)
        
        */
2、面试回答的时候注意的点
  1. Object.defineProperty 方法
  2. 数据劫持
  3. 发布订阅者模式
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值