Vue data的数据响应式到底是如何实现的


Posted in Javascript onFebruary 11, 2020

研究过程

一般形式

data:{ n:0 } :以这样的方式存储数据,vue能够监听其变化吗?显然是不能的。

使用Obj.defineProperty

let data1 = {}

Object.defineProperty(data1, 'n', {
value: 0  
})

为什么要使用defineProperty呢?这不是把一般形式复杂化了吗?

引出主角getter setter。

如果我们想对数据监听进行处理呢?(假设修改的数据必须>=0)

let data2 = {}
data2._n = 0

Object.defineProperty(data2,'n',{
  get(){ return this._n },
  set(value){
    if(value<0) return //在此处可以对数据的修改进行操作
    this._n = value
  }
})

使用代理

如果对方直接修改data2._n怎么办?我们让data2变成匿名对象!

let data3 = proxy({ data:{n:0} }) //括号里是匿名对象,无法访问
function proxy({data}){
 const obj = {}
 Object.defineProperty(obj, 'n', {
  get(){
    return data.n
  },
  set(value){
    if(value<0)return
    data.n = value
   }
 })
 return obj // obj 就是代理
}

代理是什么?

  • 对data的属性的读写,全权交给另一个对象obj负责,那么obj就是data的代理
  • data.n不使用,偏要使用obj.n来操作data.n

如果用户自己给匿名对象起了个名字怎么办呢?

MyData = { n:0 }
let data3 = proxy({ data:MyData })
MyData.n = -1
 //成功赋值为-1

这种情况,我们也要进行拦截处理。

//在4.中的proxy函数中加入这几行
let value = data.n
 Object.defineProperty(data, 'n', {
   get(){
     return value
   },
   set(newValue){
     if(newValue<0)return
     value = newValue
   }
 })

这样,我们就对data进行了监听。

data域的一个bug

new Vue({
  data:{
    obj:{
      a:0
    }
  },
  template:`
    <div @click="set">{{ obj.b }}</div>
  `,
  methods:{
    set(){
      this.obj.b = 1
    }
  }
})
  //bug:vue无法监听一开始data域中不存在的obj.b

解决方法:

data的初始化中加入b

data:{
  obj:{
    a:0,
    b:undefined 
    //注意,vue中的null和undefined都不会被渲染出来
  }
}

使用Vue.set(this.obj,'b',1)

数组的长度又不固定,怎么提前声明?

  1. 使用Vue.set (不推荐)
  2. 使用this.array.push (被Vue改写过的push,实现了代理和监听)

详见vue文档,变异方法 章节

总结

//看看下面的代码,发现了什么?

let data = proxy({ data:myData5 })
let vm = new Vue({ data: myData })

Vue正是使用了这种代理和监听的设计模式,形成的数据响应式。

流程:声明数据 => 监听数据 => 代理数据 => 返回数据

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript 获取图片颜色
Apr 05 Javascript
jQuery下通过$.browser来判断浏览器.
Apr 05 Javascript
JavaScript 选中文字并响应获取的实现代码
Aug 28 Javascript
表头固定(利用jquery实现原理介绍)
Nov 08 Javascript
jQuery里filter()函数与find()函数用法分析
Jun 24 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
Dec 02 Javascript
JavaScript DOM 对象深入了解
Jul 20 Javascript
利用Mongoose让JSON数据直接插入或更新到MongoDB
May 03 Javascript
node.js中express中间件body-parser的介绍与用法详解
May 23 Javascript
通过JavaScript下载文件到本地的方法(单文件)
Mar 17 Javascript
vue中img src 动态加载本地json的图片路径写法
Apr 25 Javascript
Vue-cli3.x + axios 跨域方案踩坑指北
Jul 04 Javascript
JS实现TITLE悬停长久显示效果完整示例
Feb 11 #Javascript
vue.config.js中配置Vue的路径别名的方法
Feb 11 #Javascript
vue-resourc发起异步请求的方法
Feb 11 #Javascript
js实现圆形显示鼠标单击位置
Feb 11 #Javascript
JavaScript实现省份城市的三级联动
Feb 11 #Javascript
node.js使用yargs处理命令行参数操作示例
Feb 11 #Javascript
node.js实现http服务器与浏览器之间的内容缓存操作示例
Feb 11 #Javascript
You might like
php 缓存函数代码
2008/08/27 PHP
PHP 中 Orientation 属性判断上传图片是否需要旋转
2015/10/16 PHP
PHP 搜索查询功能实现
2016/11/29 PHP
php使用PDO执行SQL语句的方法分析
2017/02/16 PHP
PHP长连接实现与使用方法详解
2018/02/11 PHP
通过JAVAScript实现页面自适应
2007/01/19 Javascript
JavaScript入门教程(12) js对象化编程
2009/01/31 Javascript
基于jQuery试卷自动排版系统
2010/07/18 Javascript
jQuery对象[0]是什么含义?
2010/07/31 Javascript
jQuery DOM操作实例
2014/03/05 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
BootStrap智能表单实战系列(四)表单布局介绍
2016/06/13 Javascript
如何检测JavaScript的各种类型
2016/07/30 Javascript
微信小程序前端源码逻辑和工作流
2016/09/25 Javascript
JS实现简单的二元方程计算器功能示例
2017/01/03 Javascript
Vue三层嵌套路由的示例代码
2018/05/05 Javascript
nodejs实现套接字服务功能详解
2018/06/21 NodeJs
javascript中函数的写法实例代码详解
2018/10/28 Javascript
JavaScript使用小插件实现倒计时的方法讲解
2019/03/11 Javascript
详解JS深拷贝与浅拷贝
2020/08/04 Javascript
JS前端基于canvas给图片添加水印
2020/11/11 Javascript
Python科学计算之NumPy入门教程
2017/01/15 Python
Django之模型层多表操作的实现
2019/01/08 Python
python pandas库的安装和创建
2019/01/10 Python
解决webdriver.Chrome()报错:Message:'chromedriver' executable needs to be in Path
2019/06/12 Python
Python中变量的输入输出实例代码详解
2019/07/28 Python
基于Python新建用户并产生随机密码过程解析
2019/10/08 Python
Python实现自动装机功能案例分析
2020/10/22 Python
PyCharm Community安装与配置的详细教程
2020/11/24 Python
对CSS3选择器的研究(详解)
2016/09/16 HTML / CSS
德国家具购物网站:Möbel Höffner
2019/08/26 全球购物
小学科学教学反思
2014/01/26 职场文书
人力资源管理专业应届生求职信
2014/04/24 职场文书
2014年机关后勤工作总结
2014/12/16 职场文书
公司保洁员管理制度
2015/08/04 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书