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

    

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

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

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


相关推荐

  • 快速排序算法详细图解JAVA_实现快速排序

    快速排序算法详细图解JAVA_实现快速排序高快省的排序算法有没有既不浪费空间又可以快一点的排序算法呢?那就是“快速排序”啦!光听这个名字是不是就觉得很高端呢。假设我们现在对“61279345108”这个10个数进行排序。首先在这个序列中随便找一个数作为基准数(不要被这个名词吓到了,就是一个用来参照的数,待会你就知道它用来做啥…

    2022年8月30日
    2
  • 视频编解码优化的几个概念[通俗易懂]

    视频编解码优化的几个概念[通俗易懂]视频编解码1.neon2.gpu加速3.汇编neon在移动平台上进行一些复杂算法的开发,一般需要用到指令集来进行加速。目前在移动上使用最多的是ARM芯片。ARM是微处理器行业的一家知名企业,其芯片结构有:armv5、armv6、armv7和armv8系列。芯片类型有:arm7、arm9、arm11、cortex系列。指令集有:armv5、armv6和neon指令。关于ARM到知识参考:ht

    2022年7月15日
    23
  • 传感器超声波雷达「建议收藏」

    传感器超声波雷达「建议收藏」转自:http://www.itsiwei.com/21962.html在上一次分享中,我介绍了毫米波雷达的原理、数据特性及优缺点。毫米波雷达的低环境敏感和低成本的特性使得其在ADAS和自动驾驶领域得到了广泛的应用。今天要介绍的是一款极其常见的传感器——超声波雷达。如果你觉得超声波雷达有些陌生,那么它还有一个更通俗的名字——倒车雷达。在倒车入库,慢慢挪动车子的过程中,在驾驶室内能听到”…

    2025年11月1日
    2
  • Java的八种基本数据类型

    Java的八种基本数据类型1.byte:字节1.计算机中,数据传输大多是以“位”(bit,比特)为单位。2.一位就代表一个0或1(二进制),每8个位(bit)组成一个字节(byte),所以,1个字节=8位0101代码。2.short3.int4.long5.float6.double7.char1.char类型占2个字节(16位),用来表示字符。2.char是基本数据类型。String表示字符串,是类类型。一个String是由0~n个char组成。3.字符使用单引号表示,字符串使用双引号表示。8.boolea

    2022年7月7日
    20
  • pycharm缩进设置_wps首行缩进快捷键

    pycharm缩进设置_wps首行缩进快捷键1、pycharm使多行代码同时缩进鼠标选中多行代码后,按下Tab键,一次缩进四个字符2、pycharm使多行代码同时左移鼠标选中多行代码后,同时按住shift+Tab键,一次左移四个字符Python语言是一款对缩进非常敏感的语言,给很多初学者带来了困惑,即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分别的…

    2022年8月25日
    8
  • 光闸和网闸区别_网闸作用

    光闸和网闸区别_网闸作用光闸和网闸区别光闸和网闸区别光闸和网闸区别

    2022年8月3日
    10

发表回复

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

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