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


相关推荐

  • KindEditor配置ctrl+enter提交

    KindEditor配置ctrl+enter提交今天花费了一些时间去想怎么配置,网上也没有直接找到这方面的资料。后面突然看到一个网页,提交也是用了相同的编辑器。就学习了一下。//创建编辑器functioncreateEditor(){KindEditor.ready(function(K){ChatEditor=K.create(‘textarea.win_chat_textarea’,{width:’100%’,

    2022年10月10日
    4
  • Linux下修改配置文件内容

    Linux下修改配置文件内容文件操作之修改配置文件内容在一些系统或者游戏运行时经常遇到一些情况需要修改一下配置文件的内容,比如游戏中任务升级了,需要修改人物等级,那么这是怎么完成的呢?好,我还是老规矩先来介绍一个函数,strstr一样的查看手册可以看到,该函数有两个参数,第一个参数要查询的字符串,第二个参数是目标子字符串,返回值是一个指针,指向子字符串的开头,如果没有那么返回NULL,什么意思呢,举个例子,比如CHINAENGLISH字符串,我要查找ENGLISH,使用strstr后,返回一个字符指针,指到E位置。好,介绍完

    2022年7月26日
    23
  • collectors.groupingby属性分组_group by having order by

    collectors.groupingby属性分组_group by having order by问题描述:当我们对List根据时间排序,然后根据某个字段分组后,会产生乱序的问题。 解决办法:因为Collectors.groupingBy分组后默认返回HashMap类型,我们修改为LinkedHashMap即可。Collectors.groupingBy部分源码://一个参数classifierpublicstatic<T,K>Collector<T,?,Map<K,List<T>>>groupingBy(Fu.

    2022年8月22日
    23
  • 阿里面试Redis最常问的三个问题:缓存雪崩、击穿、穿透(带答案)

    阿里面试Redis最常问的三个问题:缓存雪崩、击穿、穿透(带答案)我没想到他会这么问

    2022年6月26日
    26
  • java如何遍历数组中的元素_js数组遍历方法

    java如何遍历数组中的元素_js数组遍历方法packagecom.yang;publicclassDemo01{publicstaticvoidmain(String[]args){int[]a={25,64,19,48,91,23};//遍历数组中的元素for(intx:a){System.out.println(x);}}}

    2026年1月25日
    3
  • Oracle保留两位小数_java中怎么保留小数点后两位

    Oracle保留两位小数_java中怎么保留小数点后两位在最近的项目开发中,有个业务需求是界面显示的数字需要保留两位小数,目前我想到的解决方法有两种:(1)在写SQL的时候,直接保留两位小数(2)在java代码里面将查询出来的数进行格式化处理,保留两位小数先说第一种方案:在SQL中的处理我使用的oracle数据库,所以有3个函数可以选择,分别是:(1)ROUND(A/B,2)ROUND()函数是会将计算结果进行四舍五入的,如果所需

    2022年9月24日
    4

发表回复

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

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