vue中的双向数据绑定原理_vue nodejs

vue中的双向数据绑定原理_vue nodejs简述    每当面试官问到Vue数据双向绑定原理的时候,我们都会简单的说:Vue内部通过Object.defineProperty方法属性拦截的方式,把data对象里每个数据的读写转化成getter/setter,当数据变化时通知视图更新。虽然一句话把大概原理概括了,但是其内部的实现方式还是值得深究的,本文就以通俗易懂的方式剖析Vue内部双向数据绑定原理的实现过程思路   …

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

Jetbrains全系列IDE稳定放心使用

简述

    每当面试官问到Vue数据双向绑定原理的时候,我们都会简单的说:Vue 内部通过 Object.defineProperty 方法属性拦截的方式,把data 对象里每个数据的读写转化成 getter / setter,当数据变化时通知视图更新。虽然一句话把大概原理概括了,但是其内部的实现方式还是值得深究的,本文就以通俗易懂的方式剖析 Vue 内部双向数据绑定原理的实现过程

思路

    所谓MVVM数据双向绑定,即主要是:数据变化更新视图,视图变化更新数据。如图:
在这里插入图片描述
    也就是说,输入框内容变化时,data 中的数据同步变化。即 view —> model 的变化。data 中的数据变化时,文本节点的内容同步变化。即 model —> view 的变化

原理

    Vue 实现的双向数据绑定,是采用数据劫持结合发布者-订阅者模式的方式,通过 Object.defineProperty() 来劫持各个属性的 setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调。要实现mvvm的双向绑定,就必须要实现以下几点:

    Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象
在这里插入图片描述
    1. 实现一个数据监听器 Observer,能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知订阅者

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

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

    4. 将 MVVM 作为数据绑定的入口,整合 Observer,Compile 和 Watcher 三者

实现简单的双向绑定

<body>
<input type="text" id="inp">
<div id="demo"></div>
<script>
	var demo = document.querySelector('#demo')
	var inp = document.querySelector('#inp')
	
	let obj = { 
   }
	
	inp.addEventListener('input', function(e) { 
   
	    // 给 obj 的 name 属性赋值,进而触发该属性的 set 方法
	    obj.name = e.target.value
	})
	
	Object.defineProperty(obj, 'name', { 
   
		set: function(newVal) { 
   
			inp.value = newVal
	        demo.innerHTML = newVal
	        console.log('更新了obj的name:' + newVal)   // name 属性值被修改时触发
	    },
	    get: function() { 
   
	        console.log('获取obj数据name')
	    }
	})
		
	obj.name    // 获取 data 数据 name
</script>
</body>

Vue实现双向绑定

    1. 实现 Observer

    

    2. 实现 Compile

    

    3. 实现 Watcher

    

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

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/184112.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • SSE的学习

    SSE的学习看到intel向量化指令在矩阵乘应用中的评估_softee的专栏-CSDN博客中描述的效果而心动,然后咨询了下博客园博主,我稍微看了下《simdforc++developers》感觉SSE这些指令更像一种寄存器语言,乍一接触略不适应。然而我的疑问是:1、如果对一个步骤我用了TBB/MKL/CILK这种易操作的并行指令,内部能否再用SSE指令,能否性能进一步提升?或者像OMP一样不适合嵌套并行?2、这种向量化指令是否只对无依赖性流程可用?对dst(i)=src(i)+dst(i-1);…

    2022年10月31日
  • android对文件进行加密

    android对文件进行加密最开始想的是对apk进行加密,但是搜到的资料都是对dex层面的加密,后来转念一想,apk也可以被看做是一个普通的文件,普通的文件其实是可以使用AES进行加密的(AES比DES安全性和速度要更好,属于对称性加密里面很好的了),代码如下funmain(args:Array<String>){ //key也可以采用下边的FileAESUtil.getAutoCreateAESKey()方法自动生成valkey=”asdfghjkl”valcontent=.

  • ★Navicat For Mysql 数据库备份与还原

    ★Navicat For Mysql 数据库备份与还原一.首先设置,备份保存路径工具-&gt;选项点开其他-&gt;日志文件保存路径二.开始备份备份分两种,一种是以sql保存,一种是保存为备份1.SQL保存右键点击你要备份的数据库,-&gt;转储SQL文件选择位置和文件名点击保存,开始转储导入建议删除所有表或重新建数据库右键数据库运行SQL文件2.N…

  • ajax请求状态码是0_常见错误状态码

    ajax请求状态码是0_常见错误状态码会出现这个HTTP请求状态码400,说明这个请求是无效的,并没有进入后台服务器(控制器)里。通常的原因:前端提交的字段名称或者字段类型和后台的实体类不一样,或者前端提交的参数跟后台需要的参数个数不一致,导致无法封装。比如在SprimgMVC的控制器方法中使用了@RequestParam修饰了一个yanggb参数,但是前端在请求的时候并没有带上yanggb参数或yanggb参数为空值,就会出现这种情况;再比如前端提交到后台的数据应该是JSON字符串类型,而前端没有将对象转化为字符串类型,也会返回HTTP请

    2022年10月28日
  • YII2安装中遇到的错误解决Calling unknown method: yii\web\UrlManager::addRules()

    YII2安装中遇到的错误解决Calling unknown method: yii\web\UrlManager::addRules()

发表回复

您的电子邮箱地址不会被公开。

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