Vue 模拟源码实现响应式原理——实现observer.js(第2部分)

33 篇文章 0 订阅
本文详细介绍了Vue中的Observer类如何实现数据劫持,将data中的属性转换为响应式数据,通过getter/setter确保数据变化时能触发更新。Observer不仅处理原始数据,还递归处理对象属性,确保深层数据变化也被监听。当属性值被赋为新对象时,Observer同样会转换新对象的属性。Observer在Vue的响应式系统中起着核心作用。
摘要由CSDN通过智能技术生成

实现Vue响应式原理 之 observer.js部分

结构介绍

Vue 整体结构

Observer功能

Observer作用是数据劫持,也就是监听data中属性的变化并做出处理。

1.负责把 data 选项中的属性转换成响应式数据(getter/setter)
2.data 中的某个属性也是对象,把该属性转换成响应式数据
3.数据变化发送通知(结合观察者模式来实现)

Observer结构

在这里插入图片描述

代码实现

observer.js

// 负责数据劫持
// 把 $data 中的成员转换成 getter/setter
class Observer {
    constructor(data) {
        this.walk(data)
    }
    // 1. 判断数据是否是对象,如果不是对象返回,如果是空值,也返回
    // 1.1. 如果是对象,遍历对象的所有属性,设置为 getter/setter
    walk(data) {
        if (!data || typeof data !== 'object') {
            return
        }
        // 2. 遍历 data 的所有成员
        Object.keys(data).forEach(key => {
            this.defineReactive(data, key, data[key])
        })
    }
    // 定义响应式成员
    defineReactive(data, key, val) {
        const that = this
        // 如果 val 是对象,继续设置它下面的成员为响应式数据
        this.walk(val)
        Object.defineProperty(data, key, {
            configurable: true,
            enumerable: true,
            get() {
                return val // return val而不是data[key],因为returndata[key]会触发get方法,发生死递归,造成堆栈溢出 
            },
            set(newValue) {
                if (newValue === val) {
                    return
                }
                // 如果 newValue 是对象,设置 newValue 的成员为响应式
                that.walk(newValue) // set 内部的this指向data对象
                val = newValue
            }
        })
    }
}
总结

Observer对象的核心作用是把data中的属性都转化为响应式数据,也就是getter/setter
如果data中的某个属性是对象,那么也会把这个对象中的属性转化为响应式数据
如果data中的某个属性重新赋值为一个新对象时,那么也会把这个对象中的属性转化为响应式数据
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值