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 相关文章推荐
关于JAVASCRIPT urldecode URL解码的问题
Jan 08 Javascript
ASP.NET jQuery 实例10 动态修改hyperlink的URL值
Feb 03 Javascript
jquery实现用户信息修改验证输入方法汇总
Jul 18 Javascript
javascript实现获取浏览器版本、浏览器类型
Dec 02 Javascript
jQuery日历插件datepicker用法详解
Mar 03 Javascript
JS简单获取日期相差天数的方法
Apr 24 Javascript
bootstrap栅格系统示例代码分享
May 22 Javascript
微信小程序开发之toast等弹框提示使用教程
Jun 08 Javascript
使用apifm-wxapi模块中的问题及解决方法
Aug 05 Javascript
React传值 组件传值 之间的关系详解
Aug 26 Javascript
JS原型对象操作实例分析
Jun 06 Javascript
理解Proxy及使用Proxy实现vue数据双向绑定操作
Jul 18 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一维二维数组键排序方法实例总结
2014/11/13 PHP
PHP 自动加载类原理与用法实例分析
2020/04/14 PHP
PHP加MySQL消息队列深入理解
2021/02/27 PHP
js打印纸函数代码(递归)
2010/06/18 Javascript
jQuery学习笔记 操作jQuery对象 文档处理
2012/09/19 Javascript
js 限制数字 js限制输入实现代码
2012/12/04 Javascript
js判断选择的时间是否大于今天的代码
2013/08/20 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
JS实现日期加减的方法
2013/11/29 Javascript
js判断某个方法是否存在实例代码
2015/01/10 Javascript
JS基于面向对象实现的拖拽库实例
2015/09/24 Javascript
node.js抓取并分析网页内容有无特殊内容的js文件
2015/11/17 Javascript
jquery对象和DOM对象的相互转换详解
2016/10/18 Javascript
JS用斜率判断鼠标进入DIV四个方向的方法
2016/11/07 Javascript
JavaScript优化以及前段开发小技巧
2017/02/02 Javascript
详谈jQuery中的一些正则匹配表达式
2017/03/08 Javascript
JavaScript中各数制转换全面总结
2017/08/21 Javascript
微信小程序用户授权,以及判断登录是否过期的方法
2019/05/10 Javascript
微信小程序wx.navigateTo方法里的events参数使用详情及场景
2020/01/07 Javascript
Node.JS获取GET,POST数据之queryString模块使用方法详解
2020/02/06 Javascript
vue实现用户长时间不操作自动退出登录功能的实现代码
2020/07/23 Javascript
python 正则式 概述及常用字符
2009/05/07 Python
同时安装Python2 &amp; Python3 cmd下版本自由选择的方法
2017/12/09 Python
python爬取哈尔滨天气信息
2018/07/14 Python
详解python3安装pillow后报错没有pillow模块以及没有PIL模块问题解决
2019/04/17 Python
Django-Model数据库操作(增删改查、连表结构)详解
2019/07/17 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
Python使用enumerate获取迭代元素下标
2020/02/03 Python
python获取linux系统信息的三种方法
2020/10/14 Python
Argos官网:英国家喻户晓的百货零售连锁商
2017/04/03 全球购物
size?瑞典:英国伦敦的球鞋精品店
2018/03/01 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
外贸英语专业求职信范文
2013/12/25 职场文书
留学生如何写好自荐信
2013/12/27 职场文书
国贸专业毕业求职信
2014/06/11 职场文书
计算机系统管理员求职信
2014/06/20 职场文书