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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Oracle数据库运维方案及优化

    Oracle数据库运维方案及优化Oracle数据库优化运维优化文章目录Oracle数据库优化前言:Oracle数据库性能优化一为啥要运维,运维哪些内容?二检查数据库基本状况2.1检查Oracle实例状态2.2检查Oracle服务进程2.3检查Oracle监听状态三检查系统和oracle日志文件四检查Oracle对象状态前言:在上一篇文章中我们讲了关于Oracle数据库的性能方面的优化,这篇文章咱们讲讲关于运维方面的优化吧。上一篇文章的地址:Oracle数据库性能优化一为啥要运维,运维哪些内容?数据库的运维主

    2022年10月22日
  • vue 设置定时执行函数

    vue 设置定时执行函数varapp=newVue({el:’#app’,data:{},filters:{},created:function(){setInterval(this.timer,1000);…

    2022年7月17日
  • 开源库TinyXML2简介及使用

    开源库TinyXML2简介及使用TinyXML2是一个开源、简单、小巧、高效的C++XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中。它解析XML文档并从中构建可以读取、修改和保存的文档对象模型(DocumentObjectModel,DOM)。它不能解析DTD(DocumentTypeDefinitions,文档类型定义)或XSL(eXtensibleStylesheetLan…

    2022年6月14日
  • ajax 常用写法「建议收藏」

    ajax 常用写法「建议收藏」$.ajax({type:”POST”,url:”/aa/bb”,data:{},success:function(data){},error:function(jqXHR){}});——————————————$.ajax({.

    2022年9月29日
  • Spark pool_spark docker

    Spark pool_spark docker概述这篇文章主要是分析一下Pool这个任务调度的队列。整体代码量也不是很大,正好可以详细的分析一下,前面在TaskSchedulerImpl提到大体的功能,这个点在丰富一下吧。DAGSchedul

    2022年8月4日
  • 如何用matlab编写分段函数_请教各位怎样用matlab定义一个分段函数MATLAB分段函数…[通俗易懂]

    如何用matlab编写分段函数_请教各位怎样用matlab定义一个分段函数MATLAB分段函数…[通俗易懂]请教各位怎样用matlab定义一个分段函数MATLAB分段函数www.zhiqu.org时间:2020-12-27步骤如下1、打开MATLAB软件,如图所示。2、建立一个脚本文件,具体方法如图所示。3、定义变量。4、建立循环,求解分段函数。5、采用以下指令画图。6、画出的图片如图所示。扩展资料20世纪70年代,美国新墨西哥大学计算机科学系主任CleveMoler为了减轻学生编程的…

    2022年5月26日

发表回复

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

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