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折腾得半死,揭秘为何jQuery为何在IE/Firefox下均无法使用
Jan 22 Javascript
Js基础学习资料
Nov 23 Javascript
js String对象中常用方法小结(字符串操作)
Jan 27 Javascript
JS 作用域与作用域链详解
Apr 07 Javascript
跟我学习javascript的定时器
Nov 19 Javascript
jQuery使用$.ajax进行即时验证的方法
Dec 08 Javascript
基于Bootstrap的Java开发问题汇总(Spring MVC)
Jan 15 Javascript
在 Typescript 中使用可被复用的 Vue Mixin功能
Apr 17 Javascript
JavaScript设计模式之责任链模式实例分析
Jan 16 Javascript
vue2配置scss的方法步骤
Jun 06 Javascript
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 Javascript
Javascript webpack动态import
Apr 19 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 4.2书写安全的脚本
2006/10/09 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
2017/04/01 PHP
php中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
jQuery学习基础知识小结
2010/11/25 Javascript
javascript中数组的concat()方法使用介绍
2013/12/18 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
javascript制作的网页侧边弹出框思路及实现代码
2014/05/21 Javascript
js常用数组操作方法简明总结
2014/06/20 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
关于JS变量和作用域详解
2016/07/28 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
微信小程序 122100版本更新问题解决方案
2016/12/22 Javascript
Angularjs+bootstrap+table多选(全选)支持单击行选中实现编辑、删除功能
2017/03/27 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
vue动态改变背景图片demo分享
2018/09/13 Javascript
解决vue单页面应用进入页面加载所有 js 的问题
2020/08/12 Javascript
原生JS实现拖拽功能
2020/12/16 Javascript
使用Python的Tornado框架实现一个简单的WebQQ机器人
2015/04/24 Python
python开发之函数定义实例分析
2015/11/12 Python
Python机器学习之决策树算法
2017/12/22 Python
python smtplib模块实现发送邮件带附件sendmail
2018/05/22 Python
详解python-图像处理(映射变换)
2019/03/22 Python
Python+OpenCV实现图像的全景拼接
2020/03/05 Python
Python二元算术运算常用方法解析
2020/09/15 Python
CHARLES & KEITH英国官网:新加坡时尚品牌
2018/07/04 全球购物
香港彩色隐形眼镜在线商店:Stunninglens(全球免费送货)
2019/05/10 全球购物
Janie and Jack美国官网:GAP旗下的高档童装品牌
2019/09/09 全球购物
家长评语大全
2014/01/22 职场文书
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
真诚的求职信
2014/07/04 职场文书
优秀班集体申报材料
2014/12/25 职场文书
使用Pytorch训练two-head网络的操作
2021/05/28 Python
Django rest framework如何自定义用户表
2021/06/09 Python
深入讲解Vue中父子组件通信与事件触发
2022/03/22 Vue.js
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server