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 event 事件解析
Jan 31 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
Jan 04 Javascript
节点的插入之append()和appendTo()的用法介绍
Jan 13 Javascript
javascript/jquery获取地址栏url参数的方法
Mar 05 Javascript
深入理解JavaScript中的浮点数
May 18 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
Dec 30 Javascript
ajax与json 获取数据并在前台使用简单实例
Jan 19 Javascript
详谈js中数组(array)和对象(object)的区别
Feb 27 Javascript
vue.js树形组件之删除双击增加分支实例代码
Feb 28 Javascript
node.js实现登录注册页面
Apr 08 Javascript
JS中的JSON对象的定义和取值实现代码
May 09 Javascript
JavaScript数组去重实现方法小结
Jan 17 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开发框架laravel安装与配置教程
2015/03/13 PHP
PHP框架自动加载类文件原理详解
2017/06/06 PHP
浅谈PHP匿名函数和闭包
2019/03/08 PHP
PHP利用缓存处理用户注册时的邮箱验证,成功后用户数据存入数据库操作示例
2019/12/31 PHP
2020最新版 PhpStudy V8.1版本下载安装使用详解
2020/10/30 PHP
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
2009/10/25 Javascript
理解Javascript_06_理解对象的创建过程
2010/10/15 Javascript
javascript陷阱 一不小心你就中招了(字符运算)
2013/11/10 Javascript
JS中如何设置readOnly的值
2013/12/25 Javascript
jquery easyui使用心得
2014/07/07 Javascript
JS实现文字链接感应鼠标淡入淡出改变颜色的方法
2015/02/26 Javascript
jQuery中$(function() {});问题详解
2015/08/10 Javascript
JS+CSS实现简易实用的滑动门菜单效果
2015/09/18 Javascript
jQuery实现文档树效果
2017/02/20 Javascript
vue select选择框数据变化监听方法
2018/08/24 Javascript
详解vuex持久化插件解决浏览器刷新数据消失问题
2019/04/15 Javascript
js实现拾色器插件(ColorPicker)
2020/05/21 Javascript
jQuery实现倒计时功能完整示例
2020/06/01 jQuery
Python中文字符串截取问题
2015/06/15 Python
Python中有趣在__call__函数
2015/06/21 Python
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
python 拷贝特定后缀名文件,并保留原始目录结构的实例
2018/04/27 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
对python:循环定义多个变量的实例详解
2019/01/20 Python
Python获取二维数组的行列数的2种方法
2020/02/11 Python
如何理解Python中的变量
2020/06/01 Python
Pytorch 使用opnecv读入图像由HWC转为BCHW格式方式
2020/06/02 Python
台湾演唱会订票网站:StubHub台湾
2019/06/11 全球购物
什么是Oracle的后台进程background processes?都有哪些后台进程?
2012/04/26 面试题
土木工程毕业答辩开场白
2015/05/29 职场文书
小学二年级班主任工作经验交流材料
2015/11/02 职场文书
Python还能这么玩之只用30行代码从excel提取个人值班表
2021/06/05 Python
vue使用Google Recaptcha验证的实现示例
2021/08/23 Vue.js