vue响应式数据变化
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响应式数据变化的更多相关文章
- Vue 响应式数据说明
值得注意的是只有当实例被创建时 data 中存在的属性才是响应式的.也就是说如果你添加一个新的属性,比如: vm.b = 'hi' 那么对 b 的改动将不会触发任何视图的更新. 这里唯一的例外是使用 ...
- 仿VUE创建响应式数据
VUE对于前端开发人员都非常熟悉了,其工作原理估计也都能说的清个大概,具体代码的实现估计看的人不会太多,这里对vue响应式数据做个简单的实现. 先简单介绍一下VUE数据响应原理,VUE响应数据分为对象 ...
- Vue2手写源码---响应式数据的变化
响应式数据变化 数据发生变化后,我们可以监听到这个数据的变化 (每一步后面的括号是表示在那个模块进行的操作) 手写简单的响应式数据的实现(对象属性劫持.深度属性劫持.数组函数劫持).模板转成 ast ...
- vue基础响应式数据
1.vue 采用 v……vm……m,模式,v---->el,vm---->new Vue(实例),m---->data 数据,让前端从操作大量的dom元素中解放出来. 2.vue响应 ...
- Vue实现双向绑定的原理以及响应式数据
一.vue中的响应式属性 Vue中的数据实现响应式绑定 1.对象实现响应式: 是在初始化的时候利用definePrototype的定义set和get过滤器,在进行组件模板编译时实现water的监听搜集 ...
- vue源码之响应式数据
分析vue是如何实现数据响应的. 前记 现在回顾一下看数据响应的原因. 之前看了vuex和vue-i18n的源码, 他们都有自己内部的vm, 也就是vue实例. 使用的都是vue的响应式数据特性及$w ...
- Vue响应式变化
Vue有一个很方便的特性就是Vue的双向绑定,即响应式变化,在Vue2.X版本中,Vue响应式变化靠的是Object.defineProperty方法实现的,但是这个方法有个问题,就是对数组的支持不全 ...
- angular,vue,react的基本语法—插值表达式,渲染数据,响应式数据
基本语法: 1.插值表达式: vue:{{}} react:{} angular:{{}} 2.渲染数据 vue js: export default{ data(){ return{ msg:&qu ...
- vue 响应式原理
Vue 采用声明式编程替代过去的类 Jquery 的命令式编程,并且能够侦测数据的变化,更新视图.这使得我们可以只关注数据本身,而不用手动处理数据到视图的渲染,避免了繁琐的 DOM 操作,提高了开发效 ...
随机推荐
- 【原创】(十一)Linux内存管理slub分配器
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- VMware NAT模式ping通外网[CentOS7]
使用一张网卡,NAT模式 在编辑里打开虚拟网络编辑器 dhcp设置的范围 你的虚拟机的IP 就在那个范围里 NAT设置里有填网关 这里我们vmware 的设置就OK了 在去把你的网络适配器改下iP 这 ...
- react路由的动态传参
① 定义规则 ②传值 ③获取传过来的值
- selenium针对浏览器滚动条的操作
我们在实际自动化测试过程中,肯定会遇到当前页面显示不到我们定位的元素.这就需要下拉滚动条才能显示出我们的元素: 而滚动条的按钮又是我们定位不到的,所以需要使用js脚本来完成: 1.先来说我们的下拉滚动 ...
- CentOS 7下配置ISO镜像文件为本地yum源
环境限制外网怎么办?离线环境怎么解决依赖?yum源配起来,可以解决大部分包的安装^_^ 环境: 虚拟机:VMware Workstation Pro 12.x Linux系统版本:CentOS-7-x ...
- web前端之css基础
CSS选择器 元素选择器 p{color:red;} ID选择器 #li{ background-color:red; } 类选择器 .c1{ font-size:15px; } 注意: 样式类名不要 ...
- 驰骋工作流系统-Java共工作流引擎配置定时任务
关键词:工作流定时任务 流程引擎定时任务设置 工作流系统定时任务配置 开源工作流引擎 开源工作流系统 一.定时任务的作用 发送邮件,发送短信. 处理节点自动执行的任务.比如:一个节点的待办工作是 ...
- scikit-learn文本特征提取之TF-IDF
TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与文本挖掘的常用加权技术. TF-IDF是一种统计方法,用以评估一字词对于一个文件集 ...
- SpringBoot 整合 Zookeeper 接入Starring微服务平台
背景 最近接的一个项目是基于公司产品Starring做的微服务支付平台,纯后台项目,实现三方支付公司和银行接口来完成用户账户扣款,整合成通用支付接口发布给前端调用. 但是扯蛋了,这边前端什么都不想做, ...
- Java并发编程:Callable、Future和FutureTask【转】
原文链接:http://www.cnblogs.com/dolphin0520/p/3949310.html 创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口. 这 ...