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 相关文章推荐
一个JS小玩意 几个属性相加不能超过一个特定值.
Sep 29 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
Dec 14 Javascript
JS实现下拉框的动态添加(附效果)
Apr 03 Javascript
js中点击空白区域时文本框与隐藏层的显示与影藏问题
Aug 26 Javascript
js实现的map方法示例代码
Jan 13 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
Jan 16 Javascript
javaScript使用EL表达式的几种方式
May 27 Javascript
webpack常用配置项配置文件介绍
Nov 07 Javascript
angular.js 路由及页面传参示例
Feb 24 Javascript
JavaScript字符串检索字符的方法
Jun 23 Javascript
css和js实现弹出登录居中界面完整代码
Nov 26 Javascript
vue-router定义元信息meta操作
Dec 07 Vue.js
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数据访问之查询关键字
2016/05/09 PHP
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
js DOM的学习笔记
2011/12/22 Javascript
JS动态添加option和删除option(附实例代码)
2013/04/01 Javascript
javascript中使用正则计算中文长度的例子
2014/04/29 Javascript
简介JavaScript中的sub()方法的使用
2015/06/08 Javascript
JavaScript实现Fly Bird小游戏
2016/12/15 Javascript
详解Angular2学习笔记之Html属性绑定
2018/01/03 Javascript
vue弹窗插件实战代码
2018/09/08 Javascript
基于JS判断对象是否是数组
2020/01/10 Javascript
JS制作简易计算器的实例代码
2020/07/04 Javascript
神经网络理论基础及Python实现详解
2017/12/15 Python
python 集合 并集、交集 Series list set 转换的实例
2018/05/29 Python
django 自定义过滤器的实现
2019/02/26 Python
python ChainMap的使用和说明详解
2019/06/11 Python
Python中那些 Pythonic的写法详解
2019/07/02 Python
简单了解python反射机制的一些知识
2019/07/13 Python
Python的matplotlib绘图如何修改背景颜色的实现
2019/07/16 Python
python实现windows倒计时锁屏功能
2019/07/30 Python
基于python判断目录或者文件代码实例
2019/11/29 Python
tensorflow将图片保存为tfrecord和tfrecord的读取方式
2020/02/17 Python
Pycharm插件(Grep Console)自定义规则输出颜色日志的方法
2020/05/27 Python
Django实现随机图形验证码的示例
2020/10/15 Python
英国精品买手店:Browns Fashion
2016/09/29 全球购物
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
学习雷锋倡议书
2014/04/15 职场文书
爱心捐助倡议书
2014/05/19 职场文书
个人自荐材料
2014/05/23 职场文书
新年晚会主持词开场白
2015/05/28 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
毕业生入职感言
2015/07/31 职场文书
关于艺术节的开幕致辞
2016/03/04 职场文书
2019年房屋委托租赁合同范本(通用版)!
2019/07/17 职场文书
【超详细】八大排序算法的各项比较以及各自特点
2021/03/31 Python