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 操作,提高了开发效 ...
随机推荐
- 命令序列 ; & && ||
; 从左到右依次被执行,返回最后一个命令的执行状态 & 该命令将在后台被执行,即在子bash中执行(或ctrl+z,bg, jobs,bg 命令号)(变量$!.$one.$two.$three ...
- Javascript ----函数表达和形参实参
1.函数是对象,函数名实际上是函数对象的指针 1.函数声明方式 (函数声明提前) function sum(num1,num2){return num1+num2;} 2.函数表达式 var sums ...
- 更改input标签的placeholder的样式
主要是要区别不同浏览器的不同css类 在input框中有时想将输入的字和placeholder设为不同的颜色或其它效果,这时就可以用以下代码来对placeholder进行样式设置了. input::- ...
- 如何配置tomcat的环境变量
如何配置tomcat的环境变量 安装好tomcat之后, 按照这个操作,计算机→属性→高级系统设置→高级→环境变量,打开环境变量设置框. 以本人的tomcat 8.0为例:安装下来如图 那么我的tom ...
- 【Luogu P2515】软件安装
Luogu P2515 这道题的题面与P2146有点像.一些不同地方就是P2146是无环的,这题是有环的. 很显然,如果有几个软件的依赖关系形成环,那么这几个软件就可以被看成是一个大软件,其价值和空间 ...
- JavaScript笔记十
1.正则表达式 - 语法: - 量词 {n} 正好n次 {m,n} m-n次 {m,} 至少m次 + 至少1次 {1,} ? 0次或1次 {0,1} * 0次或多次 {0,} - 转义字符 \ 在正则 ...
- 防范XSS攻击
原文链接:http://www.cnblogs.com/chenty/p/5136834.html 最近,有个项目突然接到总部的安全漏洞报告,查看后知道是XSS攻击. 问题描述: 在页面上有个隐藏域: ...
- [需求设计]从一个小需求感受Redis的独特魅力
分享一个简单的小需求应该怎么设计实现以及有关Redis的使用 Redis在实际应用中使用的非常广泛,本篇文章就从一个简单的需求说起,为你讲述一个需求是如何从头到尾开始做的,又是如何一步步完善的.之前写 ...
- SpringBoot 整合 Zookeeper 接入Starring微服务平台
背景 最近接的一个项目是基于公司产品Starring做的微服务支付平台,纯后台项目,实现三方支付公司和银行接口来完成用户账户扣款,整合成通用支付接口发布给前端调用. 但是扯蛋了,这边前端什么都不想做, ...
- LinkedList实现原理(JDK1.8)
LinkedList实现原理(JDK1.8) LinkedList底层采用双向链表,如果对链表这种结构比较熟悉的话,那LinkedList的实现原理看明白就相当容易. 链表通过"指针&quo ...