Vue不能检测到Object/Array更新的情况的解决


Posted in Javascript onJune 26, 2018

前言

看文档不认真,开发也没有多注意,总是hack。忽悠忽悠就过去,但怎么说,歪门邪道还是不太好,现在就亡羊补牢,总结总结。

数组

索引

  1. 使用下标更新数组元素;
  2. 使用赋值方式改变数组长度;
  3. 使用下标增删数组元素;

正文

使用下标更新数组元素

data: {
  arrs: [0, 1, 2, 3]
}

直接使用this.arrs[0] = 'zero';虽然数组确实是被更新了,但是更新不会被渲染到视图(html页面)上。因为Vue没有检测到数组的更新。

由于 JavaScript 的限制,Vue 不能检测以下变动的数组:

当你利用索引直接设置一个项时,例如:vm.items[indexOfItem] = newValue

当你修改数组的长度时,例如:vm.items.length = newLength

官方应对方法:

1、Vue.set( target, key, value )

Vue.set(this.arrs, 0, 'zero');

2.vm.items.splice(indexOfItem, 1, newValue)

Vue不能检测到Object/Array更新的情况的解决 

this.arrs.splice(0, 1, 'zero');

使用赋值方式改变数组长度

即this.arrs.length = 100;无效!

官方应对方法:

1、vm.items.splice(newLength)

this.arrs.splice(100);

使用下标增删数组元素

即一下操作无效:

this.arrs[this.arrs.length] = this.arrs.length;

官方应对方法:变异方法。

  1. push()
  2. pop()
  3. shift()
  4. unshift()
  5. splice()
  6. sort()
  7. reverse()
this.arrs.push(this.arrs.length);

8、替换数组(改变引用)

如官方所言:filter(), concat() 和 slice()都是会返回一个新数组

this.arrs = this.arrs.contact(this.arrs.length);
// or
// this.arrs = this.arrs.contact([this.arrs.length]);

官方对性能问题的回应:

你可能认为这将导致 Vue 丢弃现有 DOM 并重新渲染整个列表。幸运的是,事实并非如此。Vue 为了使得 DOM 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

对象

索引

增删元素;

正文

data: {
 foo: { name: 'isaac' }
}

增删元素

this.foo.job = 'coder';
delete this.foo.name;

如上增删元素是无效的。

官方的解决方法:

// 新增
Vue.set(this.foo, 'job', 'coder');

// 删除
Vue.delete(this.foo, 'name');

Vue.delete对数组也是有效传送门

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

Javascript 相关文章推荐
JavaScript 面向对象的之私有成员和公开成员
May 04 Javascript
使用js在页面中绘制表格核心代码
Sep 16 Javascript
JQUERY实现网页右下角固定位置展开关闭特效的方法
Jul 27 Javascript
JS+CSS实现简易实用的滑动门菜单效果
Sep 18 Javascript
JS组件Bootstrap ContextMenu右键菜单使用方法
Apr 17 Javascript
jQuery基础_入门必看知识点
Jul 04 Javascript
详解vue 中使用 AJAX获取数据的方法
Jan 18 Javascript
jQuery时间验证和转换为标准格式的时间格式
Mar 06 Javascript
vue 2.0组件与v-model详解
Mar 27 Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 Javascript
基于javascript实现贪吃蛇小游戏
Nov 25 Javascript
使用Node.js实现base64和png文件相互转换的方法
Mar 11 Javascript
vue中element-ui表格缩略图悬浮放大功能的实例代码
Jun 26 #Javascript
Vue动态控制input的disabled属性的方法
Jun 26 #Javascript
利用Decorator如何控制Koa路由详解
Jun 26 #Javascript
vue实现点击关注后及时更新列表功能
Jun 26 #Javascript
微信小程序项目总结之点赞 删除列表 分享功能
Jun 25 #Javascript
nuxt.js 缓存实践
Jun 25 #Javascript
vue2.0使用v-for循环制作多级嵌套菜单栏
Jun 25 #Javascript
You might like
PHP函数utf8转gb2312编码
2006/12/21 PHP
Thinkphp的volist标签嵌套循环使用教程
2014/07/08 PHP
Symfony数据校验方法实例分析
2015/01/26 PHP
PHP连接操作access数据库实例
2015/03/30 PHP
Zend Framework教程之Application用法实例详解
2016/03/14 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
js获取html页面节点方法(递归方式)
2013/12/13 Javascript
jquery清空表单数据示例分享
2014/02/13 Javascript
jQuery取消ajax请求的方法
2015/06/09 Javascript
Node.js 应用跑得更快 10 个技巧
2016/04/03 Javascript
jQuery EasyUI基础教程之EasyUI常用组件(推荐)
2016/07/15 Javascript
JavaScript简单实现合并两个Json对象的方法示例
2017/10/16 Javascript
js字符串处理之绝妙的代码
2019/04/05 Javascript
Vue 无限滚动加载指令实现方法
2019/05/28 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
6种JavaScript继承方式及优缺点(小结)
2020/02/06 Javascript
[00:36]DOTA2上海特级锦标赛 Archon战队宣传片
2016/03/04 DOTA
Python入门_浅谈逻辑判断与运算符
2017/05/16 Python
python编程线性回归代码示例
2017/12/07 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
CSS3 二级导航菜单的制作的示例
2018/04/02 HTML / CSS
CSS3 边框效果
2019/11/04 HTML / CSS
唤醒头发毛囊的秘密武器:Grow Gorgeous
2016/08/28 全球购物
美国本地交易和折扣网站:LocalFlavor.com
2017/10/26 全球购物
北美最大的手工艺品零售商之一:Michaels Stores
2019/02/27 全球购物
意大利网上书店:LaFeltrinelli
2020/06/12 全球购物
linux面试题参考答案(11)
2012/05/01 面试题
学雷锋活动倡议书
2014/08/30 职场文书
教师党员先进性教育自我剖析材料思想汇报
2014/09/24 职场文书
师德标兵事迹材料
2014/12/19 职场文书
单位介绍信格式
2015/01/31 职场文书
2015年行政管理人员工作总结
2015/10/15 职场文书
Rust 连接 PostgreSQL 数据库的详细过程
2022/01/22 PostgreSQL
无线电通信名词解释
2022/02/18 无线电
vue实现Toast组件轻提示
2022/04/10 Vue.js