Vue2.x和Vue3.x的双向绑定原理详解


Posted in Javascript onNovember 05, 2020

双向的绑定的原理

通过Object.defineproperty()重新定义对象属性的set方法、get方法来实现的,从这个属性中取值时会触发get方法,改变这个属性时会触发set方法,所以我们只要将一些需要更新view的方法放在这里面就可以实现data更新view了,而view更新data其实可以通过事件监听实现

当视图上的数据发生改变时, data 中的数据也发生改变当 data 中的数据发生改变时,视图中的数据也发生改变 Object.defineProperty()

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

语法Object.defineProperty(obj, prop, descriptor)

参数:

  • obj
    要定义属性的对象。
  • prop
    要定义或修改的属性的名称或 Symbol 。
  • descriptor
    要定义或修改的属性描述符。

返回值

被传递给函数的对象。

对象里目前存在的属性描述符有两种主要形式:数据描述符存取描述符。数据描述符是一个具有值的属性,该值可以是可写的,也可以是不可写的。存取描述符是由 getter 函数setter 函数所描述的属性。一个描述符只能是这两者其中之一;不能同时是两者

作用

* 可以给对象的一个属性设置两个方法:

* get:从这个属性中取值时会触发get方法

* set:给这个属性赋值时会触发set方法

let obj = {}
 // 给obj的name属性设置两个方法get&set
 Object.defineProperty(obj,'name',{
 set:function (value){//value就是给name赋值的结果
  console.log('触发了set');
  this._name=value//保存这个值 这里不能直接用name,因为会触发set
 },
 get:function(){
  console.log('触发了get');
  // 将保存的值返回回来
  return this._name
 }
 })

Vue2.x和Vue3.x的双向绑定原理详解

在给name属性赋值的时候触发set方法,在set方法中将值存起来

取值时触发get方法,在get方法中将值返回回来

vue2.x双向绑定原理

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Document</title>
</head>
<body>
 <!-- 这里相当于V -->
 <div id="v"></div>
 <input type="text" id="ipt">
</body>
<script>
 // MVVM:
 // 当V改变,M自动改变
 // 当M改变,V自动改变
 // 这里相当于M

 let data = {}
 // 给data中的name属性设置两个方法get ,set
 Object.defineProperty(data,'name',{
 set:function(value){
  // 当M改变时,V自动改变
  document.querySelector('#v').innerHTML = value
 },
 get:function(){
  return this._name
 }
 })
 // 给input添加一个内容改变的之后会触发的事件
 document.querySelector('#ipt').oninput = function(e){
 data.name = e.target.value
 }
</script>
</html>

一旦输入框中的内容发生改变,就会触发oninput事件马上改变data中的内容,一旦data中的name发生改变就会触发set方法将最新的值赋值给v,这样就实现了数据的双向绑定

Vue2.x和Vue3.x的双向绑定原理详解 

vue3.x双向绑定原理

Vue3.x是通过proxy(代理)实现的数据的双向绑定

proxy

跟Object.defineProperty一样也可以给对象的属性添加两个方法get&set

区别:

  • Object.defineProperty一次性只能给对象的一个属性添加get&set方法
  • Proxy:一次性给对象所有属性都设置get&set方法

用法:

  • 创建一个新的proxy对象
let p = new Proxy(obj,{get:function(){},set:function(){}})
<script>
 let obj = {}
 let p = new Proxy(obj,{
 get:function(obj,prop){
  //obj :被代理的对象 prop:要操作的属性
  console.log('触发了get');
  return obj[prop]
 },
 set:function(obj,prop,value){
  // obj:被代理的对象
  // prop要赋值的属性
  // value要赋值的结果
  console.log('触发了set');
  // 将赋值的结果保存起来
  obj[prop] = value
 }
 })
</script>

Vue2.x和Vue3.x的双向绑定原理详解
vue3.x实现数据的双向绑定

总结

到此这篇关于Vue2.x和Vue3.x的双向绑定原理的文章就介绍到这了,更多相关Vue2.x和Vue3.x双向绑定原理内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
如何做到打开一个页面,过几分钟自动转到另一页面
Apr 20 Javascript
JavaScript instanceof 的使用方法示例介绍
Oct 23 Javascript
js判断IE浏览器版本过低示例代码
Nov 22 Javascript
Jquery.Form 异步提交表单的简单实例
Mar 03 Javascript
javascript的tab切换原理与效果实现方法
Jan 10 Javascript
jQuery插件slick实现响应式移动端幻灯片图片切换特效
Apr 12 Javascript
js实现字符串和数组之间相互转换操作
Jan 12 Javascript
url传递的参数值中包含&amp;时,url自动截断问题的解决方法
Aug 02 Javascript
BootStrap中Table分页插件使用详解
Oct 09 Javascript
vue全局使用axios的方法实例详解
Nov 22 Javascript
JavaScript面向对象核心知识与概念归纳整理
May 09 Javascript
三剑客:offset、client和scroll还傻傻分不清?
Dec 04 Javascript
nuxt引入组件和公共样式的操作
Nov 05 #Javascript
jQuery列表动态增加和删除的实现方法
Nov 05 #jQuery
nuxt 实现在其它js文件中使用store的方式
Nov 05 #Javascript
解决nuxt 自定义全局方法,全局属性,全局变量的问题
Nov 05 #Javascript
vue实现点击出现操作弹出框的示例
Nov 05 #Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
Nov 05 #Javascript
Vant 在vue-cli 4.x中按需加载操作
Nov 05 #Javascript
You might like
杏林同学录(六)
2006/10/09 PHP
PHP新手上路(十三)
2006/10/09 PHP
PHP动态变静态原理
2006/11/25 PHP
10个实用的PHP代码片段
2011/09/02 PHP
PHP反射机制用法实例
2014/08/28 PHP
浅谈PHP中的面向对象OOP中的魔术方法
2017/06/12 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
Laravel框架源码解析之反射的使用详解
2020/05/14 PHP
可选择和输入的下拉列表框示例
2013/11/05 Javascript
JQuery创建DOM节点的方法
2015/06/11 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
jQuery实现的浮动层div浏览器居中显示效果
2017/02/03 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
AngularJs用户登录问题处理(交互及验证、阻止FQ处理)
2017/10/26 Javascript
关于jquery layui弹出层的使用方法
2018/04/21 jQuery
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
浅谈TypeScript 用 Webpack/ts-node 运行的配置记录
2019/10/11 Javascript
vue 父组件通过$refs获取子组件的值和方法详解
2019/11/07 Javascript
[03:20]次级联赛厮杀超职业 现超级兵对拆世纪大战
2014/10/30 DOTA
windows下添加Python环境变量的方法汇总
2018/05/14 Python
Pycharm 创建 Django admin 用户名和密码的实例
2018/05/30 Python
python绘制中国大陆人口热力图
2018/11/07 Python
Python实现序列化及csv文件读取
2020/01/19 Python
用 Django 开发一个 Python Web API的方法步骤
2020/12/03 Python
html5组织内容_动力节点Java学院整理
2017/07/10 HTML / CSS
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
GafasWorld哥伦比亚:网上购买眼镜
2017/11/28 全球购物
屈臣氏菲律宾官网:Watsons菲律宾
2020/06/30 全球购物
师恩难忘教学反思
2014/04/27 职场文书
学习焦裕禄同志为人民服务思想汇报
2014/09/10 职场文书
法学专业求职信范文
2015/03/19 职场文书
销售内勤岗位职责范本
2015/04/13 职场文书
企业员工辞职信范文
2015/05/12 职场文书
python实现调用摄像头并拍照发邮箱
2021/04/27 Python
java版 联机五子棋游戏
2022/05/04 Java/Android
MySQL数据库查询之多表查询总结
2022/08/05 MySQL