vue双向数据绑定原理

Vue.js 的双向数据绑定通过数据劫持结合发布-订阅模式实现,利用 `Object.defineProperty()` 监听并控制属性。Observer负责数据监听,Compile解析元素指令,Watcher作为它们之间的桥梁。`Object.defineProperty()` 用于在对象上定义或修改属性,设置可读、可写、可枚举、可配置等特性,以及get和set方法。文章还提供了学习资源和Vue2/3的双向绑定学习资料。
摘要由CSDN通过智能技术生成

在这里插入图片描述

vue双向数据绑定原理

vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。

1、实现一个数据监听器 Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者

2、实现一个指令解析器 Compile,对每个元素节点的指令进行扫描和解析,根据指令模板替换数据,以及绑定相应的更新函数

3、实现一个 Watcher,作为连接 Observer 和 Compile 的桥梁,能够订阅并收到每个属性变动的通知,执行指令绑定的相应回调函数,从而更新视图
在这里插入图片描述

vue双向数据绑定核心是:Object.defineProperty()

Object.defineProperty() 的理解(为对象添加属性)

1、语法:

Object.defineProperty(object, propName, descriptor)

2、作用:

Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

备注:应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。

3、参数(三个):
  • object 对象,目标对象(要定义属性的对象)
  • propName 属性名 , 添加的属性的名 ,类型:String,(要定义或修改的属性的名称)
  • descriptor 属性描述 属性的特性,类型:Object,(要定义或修改的属性描述符。(这个参数是一个对象))
  • 代码示例:
    var obj = { b:"123" };
    console.log(obj);
    Object.defineProperty(obj, "a", {
    	value: 37, //属性的值
        writable: true, //是否可以被修改
        enumerable: true, //是否可以被枚举
        configurable: true //是否可以被删除
    });
    // 控制台输出
    for (let i in Object.keys(obj)) {
        console.log(i);
    }
    obj.a = "36";
    console.log(obj);   // {a: 37}

注: writable enumerable configurable默认值都是falsevalue不给值的情况下是undefined

    var Book = {}
    var name = '';
    Object.defineProperty(Book, 'name', {
    	set: function (value) {  // value指当前给赋的值
         	name = value;
            console.log('你取了一个书名叫做' + value);
        },
       	get: function () {
        	return '《' + name + '》'
      	}
    })
    
    Book.name = 'vue';  // 你取了一个书名叫做vue权威指南
    console.log(Book.name);  // 《vue权威指南》
4、返回值

返回被操作的对象,即返回 obj 参数

5、同样,可以设置各种类型的属性

  • 设置可写权限
  • 设置可枚举权限
  • 设置可删除权限

6、Object.defineProperty方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象

  • value:设置属性的值
  • writable:值是否可以重写。true | false
  • enumerable:目标属性是否可以被枚举。true | false
  • configurable:目标属性是否可以被删除或是否可以再次修改特性 true | false
  • set:目标属性设置值的方法
  • get:目标属性获取值的方法

1、Object.defineProperty() 学习地址

学习参考地址

2、vue2数据双向绑定学习

3、vue3数据双向绑定

4、Vue双向数据绑定原理解析及代码实现

5、教师整理参考

Vue的双向数据绑定原理(极简版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值