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 相关文章推荐
JS验证日期的格式YYYY-mm-dd 具体实现
Jun 29 Javascript
jquery 设置元素相对于另一个元素的top值(实例代码)
Nov 06 Javascript
js 将json字符串转换为json对象的方法解析
Nov 13 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
node.js中的fs.closeSync方法使用说明
Dec 17 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
AnjularJS中$scope和$rootScope的区别小结
Sep 18 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
Sep 20 Javascript
js实现适配不同的屏幕大小
Apr 10 Javascript
使用travis-ci如何持续部署node.js应用详解
Jul 30 Javascript
JS实现的A*寻路算法详解
Dec 14 Javascript
javascript实现计算器功能
Mar 30 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 获取远程网页内容的函数
2009/09/08 PHP
PHP显示今天、今月、上月、今年的起点/终点时间戳的代码
2011/05/25 PHP
php连接oracle数据库及查询数据的方法
2014/12/29 PHP
如何把php5.3版本升级到php5.4或者php5.5
2015/07/31 PHP
PHP中利用sleep函数实现定时执行功能实现代码
2016/08/25 PHP
详解PHP处理字符串类似indexof的方法函数
2017/06/11 PHP
PHP+redis实现微博的推模型案例分析
2019/07/10 PHP
File, FileReader 和 Ajax 文件上传实例分析(php)
2011/04/27 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
JS如何判断json是否为空
2016/07/06 Javascript
js删除Array数组中指定元素的两种方法
2016/08/03 Javascript
javascript实现圣旨卷轴展开效果(代码分享)
2017/03/23 Javascript
详解vue-cli中配置sass
2017/06/21 Javascript
详解性能更优越的小程序图片懒加载方式
2018/07/18 Javascript
layui 优化button按钮和弹出框的方法
2018/08/15 Javascript
JavaScript常用数组操作方法,包含ES6方法
2020/05/10 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
node.js开发辅助工具nodemon安装与配置详解
2020/02/06 Javascript
JS实现页面数据懒加载
2020/02/13 Javascript
Python的另外几种语言实现
2015/01/29 Python
python使用socket连接远程服务器的方法
2015/04/29 Python
Python 正则表达式 re.match/re.search/re.sub的使用解析
2019/07/22 Python
Python 跨.py文件调用自定义函数说明
2020/06/01 Python
浅析python 字典嵌套
2020/09/29 Python
css3实现信纸/同学录效果的示例代码
2018/12/11 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
nohup的用法
2012/11/26 面试题
太太口服液广告词
2014/03/20 职场文书
社区消防工作实施方案
2014/03/21 职场文书
项目合作意向书模板
2014/07/29 职场文书
社区娱乐活动方案
2014/08/21 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
小学教育见习总结
2015/06/23 职场文书
九年级化学教学反思
2016/02/22 职场文书