Vue双向绑定原理

Vue双向绑定原理vue的双向绑定原理:vue数据的双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。其核心就是通过obj.defineProperty()方法来实现数据的劫持,在数据变化时发布消息给订阅者,触发相应的监听回调。也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;简单介绍一下Object.defineProperty()方法:1、Object.defineProperty(obj,prop,descriptor),这个语法内有三个参数,分别为obj(要定

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

vue的双向绑定原理:

vue数据的双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。其核心就是通过Object.defineProperty()方法设置set和get函数来实现数据的劫持,在数据变化时发布消息给订阅者,触发相应的监听回调。也就是说数据和视图同步,数据发生变化,视图跟着变化,视图变化,数据也随之发生改变;

简单介绍一下Object.defineProperty()方法:

1、Object.defineProperty(obj, prop, descriptor) ,这个语法内有三个参数,分别为 obj (要定义其上属性的对象); prop (要定义或修改的属性); descriptor (具体的改变方法)
2、简单地说,就是用这个方法来定义一个值。当调用时我们使用了它里面的get方法。当给这个属性赋值时,就调用了它里面的set方法;

下面展示一个简单的例子


var obj = { 
   }
Object.defineProperty(obj,'prototypeName',{ 
   
	get: function() { 
    
		console.log("调用了get") 
	},
	set: function(newValue) { 
   
		console.log("调用了set,新值是"+newValue)  
	}
})

obj.prototypeName    // 调用了get
obj.prototypeName = 'hello'   // 调用了set,新值是hello

实现过程:

先附上一张网图
请添加图片描述

首先再vue初始化的时候,就对data数据进行了劫持监听,其中就是监听器 Observe,用来监听所有属性。
若有属性发生变化就需要告诉订阅者Watcher看是否需要更新。
因为订阅者Watcher有多个,所以需要一个消息订阅器 Dep 来专门收集这些订阅者,在监听器Observe和订阅者Watcher之间进行统一管理。
还需要有一个指令解析器 Compile ,对每个节点元素进行扫描解析,将相关的指令(如 v-model,v-on …)对应初始化成一个订阅者Watcher,并替换模板数据或者绑定相应函数
当订阅者Watcher接收到相应属性的变化通知,就会执行对应的更新函数,从而去更新视图。

  1. 实现一个监听器Observer,用来劫持并监听所有属性,如果有变动的,就通知订阅者
  2. 实现一个订阅者Watcher,每个Watcher都绑定一个更新函数,Watcher可以收到属性的变化通知并执行相应的函数,从而更新视图
  3. 实现一个消息订阅器 Dep ,主要收集订阅者,当 Observe监听到发生变化,就通知Dep 再去通知Watcher去触发更新。
  4. 实现一个解析器Compile,可以扫描和解析每个节点的相关指令,若节点存在指令,则Compile初始化这类节点的模板数据(使其显示在视图上),以及初始化相应的订阅者。

这里不做具体代码展示,具体方法实现可以参考 这里
vue源码

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/180622.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • HTML占位符_怎么使用占位符

    HTML占位符_怎么使用占位符HTML空格位占位符 ——普通的英文半角空格; 、 、&#xAO;、no-breakspace——普通的英文半角空格但不换行 ——中文全角空格(一个中文宽度) 、&ensp——en空格(半个中文宽度) 、&emsp…

    2022年9月27日
    2
  • 学计算机的男生喜欢什么样的女生,男生喜欢女生的九种表现 男生对女生说的甜蜜情话…

    学计算机的男生喜欢什么样的女生,男生喜欢女生的九种表现 男生对女生说的甜蜜情话…1、你那些恶作剧我是故意中招的,因为想看见你的笑颜。2、推我一把叫我加油的,抱着我让我“不用硬撑也可以”的都是你。3、跟着我,不喜欢吗?如果不喜欢那我就跟着你走。4、如果你在天堂遇见我,请装作不认识我的样子,因为下一次也想由我向你求婚。5、手机里依然留着喜欢你那句未曾送出的信息。6、电话里吵了架,即使如此却还想见你,正因如此才想见你。7、妻啊,虽然开不了口说爱,但不准比我先死。8、短信来了。你问我…

    2022年7月25日
    21
  • 非阻塞connect,错误码:EINPROGRESS

    http://blog.csdn.net/benbendy1984/article/details/5773137当我们以非阻塞的方式来进行连接的时候,返回的结果如果是-1,这并不代表这次连接发生了错误,如果它的返回结果是EINPROGRESS,那么就代表连接还在进行中。

    2022年4月10日
    65
  • jquery Ajax请求中显示Loading…

    jquery Ajax请求中显示Loading…

    2021年9月7日
    116
  • 数据库资料「建议收藏」

    数据库资料「建议收藏」学习数据库的时候发现了比较好的资料,在这里分享一下:https://www.bilibili.com/video/av29219646  视频https://zhangjia.tv/682.html              文档…

    2025年10月29日
    3
  • Linux的redis启动过程详解「建议收藏」

    Linux的redis启动过程详解「建议收藏」目录redis的启动设置redis密码redis-server后台启动redis的启动在我的linux启动redis首先进入到安装redis的目录下cd/usr/local/redis/redis/redis-4.0.2/src启动redis-server服务./redis-server这种启动为前台启动,所以一般直接再VM中启动然后在Xshell中远程控制,启动redis客户端./redis-cli可以看到会有默认端口6379这时就

    2022年6月18日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号