vue响应式数据变化

话不多说,先上代码:

//拷贝一份数组原型,防止修改所有数组类型变量的原型方法
let arrayProto = Array.prototype;// 数组原型上的方法
let proto = Object.create(arrayProto);
//重写以下几个方法
['splice','unshift','push','sort','reserve','shift','pop'].forEach(method=>{
proto[method] = function(...args){
let inserted;//默认没有插入新数据
switch(method){
case 'push':
case 'unshift':
inserted = args;//参数是数组
break;
case 'splice':
inserted = args.slice(2);//splice方法参数大于等于三个才是添加
default:
break;
}
observeArray(inserted);
console.log('视图更新');
// Array.prototype.push.call([1,2,3],4,5,6);
arrayProto[method].call(this,...args);
}
});
//监控数组
function observeArray (obj){
for(let i = 0; i<obj.length;i++){
observe(obj[i])//数组中普通值不会被监控,对象会被监控
}
}
//监控
function observe (obj){
//基本数据类型直接返回不需要监控
if((typeof obj !== 'object'&& typeof obj !== 'function') || obj == null){
return obj
}
//数组的处理方式
if(Array.isArray(obj)){
//重写该数组原型的方法
Object.setPrototypeOf(obj,proto);
observeArray(obj);
}else{//对象的处理方式
for(let key in obj){
defineReactive(obj,key,obj[key])
}
}
}
//调用Object.defineProperty()方法,监控数据
function defineReactive(obj,key,value){
observe(value);//递归监控数据
Object.defineProperty(obj,key,{
get(){
return value;
},
set(newValue){
if(value!==newValue){
observe(newValue);
value = newValue;
}
}
})
}
let data = {
name:'yh',
arr:[1,2,3]
}
observe(data);
data.arr = [1,2];//更新
data.arr.push(996);//更新
data.arr[3] = 251;//不更新

逻辑步骤:

1、传参data,判断data类型

2.1、如果是基本类型就直接返回

2.2、如果是数组则重写数组的那七个方法并循环数组将遍历的孩子作为data再次走第一步

2.3、如果是对象或函数,则给其循环添加监控,并将孩子作为data再次走第一步

特点: 使用对象的时候 必须先声明属性 ,这个属性才是响应式的

1.增加不存在的属性 不能更新视图 (vm.$set)

2.默认会递归增加 getter和setter

3.数组里套对象 对象是支持响应式变化的,如果是常量则没有效果

4.修改数组索引和长度 是不会导致视图更新的

5.如果新增的数据 vue中也会帮你监控(对象类型)

vue响应式数据变化的更多相关文章

  1. Vue 响应式数据说明

    值得注意的是只有当实例被创建时 data 中存在的属性才是响应式的.也就是说如果你添加一个新的属性,比如: vm.b = 'hi' 那么对 b 的改动将不会触发任何视图的更新. 这里唯一的例外是使用  ...

  2. 仿VUE创建响应式数据

    VUE对于前端开发人员都非常熟悉了,其工作原理估计也都能说的清个大概,具体代码的实现估计看的人不会太多,这里对vue响应式数据做个简单的实现. 先简单介绍一下VUE数据响应原理,VUE响应数据分为对象 ...

  3. Vue2手写源码---响应式数据的变化

    响应式数据变化 数据发生变化后,我们可以监听到这个数据的变化 (每一步后面的括号是表示在那个模块进行的操作) 手写简单的响应式数据的实现(对象属性劫持.深度属性劫持.数组函数劫持).模板转成 ast ...

  4. vue基础响应式数据

    1.vue 采用 v……vm……m,模式,v---->el,vm---->new Vue(实例),m---->data 数据,让前端从操作大量的dom元素中解放出来. 2.vue响应 ...

  5. Vue实现双向绑定的原理以及响应式数据

    一.vue中的响应式属性 Vue中的数据实现响应式绑定 1.对象实现响应式: 是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集 ...

  6. vue源码之响应式数据

    分析vue是如何实现数据响应的. 前记 现在回顾一下看数据响应的原因. 之前看了vuex和vue-i18n的源码, 他们都有自己内部的vm, 也就是vue实例. 使用的都是vue的响应式数据特性及$w ...

  7. Vue响应式变化

    Vue有一个很方便的特性就是Vue的双向绑定,即响应式变化,在Vue2.X版本中,Vue响应式变化靠的是Object.defineProperty方法实现的,但是这个方法有个问题,就是对数组的支持不全 ...

  8. angular,vue,react的基本语法—插值表达式,渲染数据,响应式数据

    基本语法: 1.插值表达式: vue:{{}} react:{} angular:{{}} 2.渲染数据 vue js: export default{ data(){ return{ msg:&qu ...

  9. vue 响应式原理

    Vue 采用声明式编程替代过去的类 Jquery 的命令式编程,并且能够侦测数据的变化,更新视图.这使得我们可以只关注数据本身,而不用手动处理数据到视图的渲染,避免了繁琐的 DOM 操作,提高了开发效 ...

随机推荐

  1. flex盒子布局

    看过很多对于弹性盒子flex的简介,但还是觉得阮一峰大神的解析和张鑫旭大神(旧版flex)的解析比较容易理解,下面,我以自己的理解来叙述关于flex弹性布局! 1.概念(容器和项目) 在flex中,有 ...

  2. python_06

    今日内容:注意: selenium驱动的浏览器是干净的,没有任何缓存. 1.selenium剩余用法 2.selenium万能登录破解 3.selenium爬取京东商品信息 4.破解极验滑动验证码 X ...

  3. 20191107-7 beta week 2/2 Scrum立会报告+燃尽图 06

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9959 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  4. Spring Security之多次登录失败后账户锁定功能的实现

    在上一次写的文章中,为大家说到了如何动态的从数据库加载用户.角色.权限信息,从而实现登录验证及授权.在实际的开发过程中,我们通常会有这样的一个需求:当用户多次登录失败的时候,我们应该将账户锁定,等待一 ...

  5. odoo12 修行基础篇之 添加字段 (一)

    本人刚刚接触odoo12,大概有2个多月的时间,这两天有点时间,就集中写下博客. 本来是打算整理成笔记,想到这段时间的开发经历,着实感觉网上有关odoo的资料太少,学习资料也不多,既然与odoo有缘, ...

  6. 【论文阅读】Where Is My Mirror?

    Where Is My Mirror?(ICCV2019收录) 作者: 论文链接: https://arxiv.org/pdf/1908.09101.pdf 1.  研究背景 目前存在的计算机视觉任务 ...

  7. STDN: Scale-Transferrable Object Detection论文总结

    概述 STDN是收录于CVPR 2018的一篇目标检测论文,提出STDN网络用于提升多尺度目标的检测效果.要点包括:(1)使用DenseNet-169作为基础网络提取特征:(2)提出Scale-tra ...

  8. tcpip协议

    几个概念 1.分层(我们使用四层模型更为贴合我们的实际网络) 分层是为什么,其实和公司中职位是一样的,不同职位的人做不同的事情,然后不同职位的人合起来,一起完成了数据传输的事情. 链路层  在这个层面 ...

  9. Java程序在内存中运行详解

    目录 Java程序在内存中运行详解 一.JVM的内存分布 二.程序执行的过程 三.只有一个对象时的内存图 四.两个对象使用同一个方法的内存图 五.两个引用指向同一个对象的内存图 六.使用对象类型作为方 ...

  10. Mysql操作之查询语句

    查询语句: select 查询列表 from 表名 where 筛选条件; 去重:select distinct 查询列表...... 选择全部:* 起别名:select 查询列表 as 别名 fro ...