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 相关文章推荐
从零开始学习jQuery (十一) 实战表单验证与自动完成提示插件
Feb 23 Javascript
JsDom 编程小结
Aug 09 Javascript
javascript作用域容易记错的两个地方分析
Jun 22 Javascript
javascript贪吃蛇完整版(源码)
Dec 09 Javascript
javascript 面向对象封装与继承
Nov 27 Javascript
jQuery实现的给图片点赞+1动画效果(附在线演示及demo源码下载)
Dec 31 Javascript
微信小程序使用第三方库Underscore.js步骤详解
Sep 27 Javascript
原生js实现弹出层效果
Jan 20 Javascript
webpack配置sass模块的加载的方法
Jul 30 Javascript
JavaScript实现多态和继承的封装操作示例
Aug 20 Javascript
vue.js父子组件通信动态绑定的实例
Sep 28 Javascript
JS正则表达式常见函数与用法小结
Apr 13 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
PHP中的日期及时间
2006/11/23 PHP
php批量上传的实现代码
2013/06/09 PHP
ini_set的用法介绍
2014/01/07 PHP
php curl请求信息和返回信息设置代码实例
2015/04/27 PHP
php+jQuery ajax实现的实时刷新显示数据功能示例
2019/09/12 PHP
tp5框架无刷新分页实现方法分析
2019/09/26 PHP
jQuery 版元素拖拽原型代码
2011/04/25 Javascript
JavaScript mapreduce工作原理简析
2012/11/25 Javascript
原始的js代码和jquery对比体会
2013/09/10 Javascript
解决jQuery动态获取手机屏幕高和宽的问题
2014/05/07 Javascript
JS是按值传递还是按引用传递
2015/01/30 Javascript
jQuery自定义滚动条完整实例
2016/01/08 Javascript
JS实现鼠标框选效果完整实例
2016/06/20 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
让网站自动生成章节目录索引的多个js代码
2018/01/07 Javascript
Javascript 编码约定(编码规范)
2018/03/11 Javascript
详解vue-router 命名路由和命名视图
2018/06/01 Javascript
通过cordova将vue项目打包为webapp的方法
2019/02/02 Javascript
小程序绑定用户方案优化小结
2019/05/15 Javascript
小程序卡片切换效果组件wxCardSwiper的实现
2020/02/13 Javascript
Python的函数嵌套的使用方法
2014/01/24 Python
Python socket C/S结构的聊天室应用实现
2014/11/30 Python
Python首次安装后运行报错(0xc000007b)的解决方法
2016/10/18 Python
Python图片裁剪实例代码(如头像裁剪)
2017/06/21 Python
Python基于FTP模块实现ftp文件上传操作示例
2018/04/23 Python
Python变量作用域LEGB用法解析
2020/02/04 Python
pycharm使用技巧之自动调整代码格式总结
2020/11/04 Python
CheapTickets泰国:廉价航班,查看促销价格并预订机票
2019/12/28 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
普师专业个人自荐信范文
2013/11/26 职场文书
上课迟到检讨书300字
2014/10/15 职场文书
2015年检验科工作总结
2015/04/27 职场文书
工作感言一句话
2015/08/01 职场文书
2016十一国庆节感言
2015/12/09 职场文书
2019各种保证书范文
2019/06/24 职场文书
手把手教你导入Go语言第三方库
2021/08/04 Golang