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-世界上误解最深的语言分析
Aug 12 Javascript
utf-8编码引起js输出中文乱码的解决办法
Jun 23 Javascript
JS控制阿拉伯数字转为中文大写示例代码
Sep 04 Javascript
javascript获取选中的文本的方法代码
Oct 30 Javascript
jQuery获取table行数并输出单元格内容的实现方法
Jun 30 Javascript
关于TypeScript中import JSON的正确姿势详解
Jul 25 Javascript
vue-cli 打包使用history模式的后端配置实例
Sep 20 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
微信小程序iBeacon测距及稳定程序的实现解析
Jul 31 Javascript
JS实现可视化音频效果的实例代码
Jan 16 Javascript
uniapp实现横向滚动选择日期
Oct 21 Javascript
React列表栏及购物车组件使用详解
Jun 28 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的开合式多级菜单程序
2006/10/09 PHP
thinkphp常见路径用法分析
2014/12/02 PHP
PHP获取链表中倒数第K个节点的方法
2018/01/18 PHP
JavaScript 组件之旅(二)编码实现和算法
2009/10/28 Javascript
jQuery页面滚动浮动层智能定位实例代码
2011/08/23 Javascript
3分钟写出来的Jquery版checkbox全选反选功能
2013/10/23 Javascript
javascript将数字转换整数金额大写的方法
2015/01/27 Javascript
JavaScript判断是否为数组的3种方法及效率比较
2015/04/01 Javascript
初识Javascript小结
2015/07/16 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
JS排序方法(sort,bubble,select,insert)代码汇总
2016/01/30 Javascript
RequireJs的使用详解
2017/02/19 Javascript
vue-cli中的webpack配置详解
2017/09/25 Javascript
vue webpack打包优化操作技巧
2018/02/22 Javascript
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
Vue3.0 响应式系统源码逐行分析讲解
2019/10/14 Javascript
JavaScript实现PC端四格密码输入框功能
2020/02/19 Javascript
基于jsbarcode 生成条形码并将生成的条码保存至本地+源码
2020/04/27 Javascript
JavaScript实现简单日历效果
2020/09/11 Javascript
[42:24]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第三场 11.27
2020/12/01 DOTA
Python ORM框架SQLAlchemy学习笔记之映射类使用实例和Session会话介绍
2014/06/10 Python
小结Python用fork来创建子进程注意事项
2014/07/03 Python
Python神奇的内置函数locals的实例讲解
2019/02/22 Python
python ChainMap 合并字典的实现步骤
2019/06/11 Python
Django实现文件上传下载
2019/10/06 Python
python matplotlib实现将图例放在图外
2020/04/17 Python
Python插件机制实现详解
2020/05/04 Python
python 贪心算法的实现
2020/09/18 Python
HTML5 device access 设备访问详解
2018/05/24 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
美国领先的奢侈美容零售商:Bluemercury
2017/07/26 全球购物
波兰购物网站:MALL.PL
2019/05/01 全球购物
公开服务承诺制度
2014/03/26 职场文书
群众路线剖析材料怎么写
2014/10/09 职场文书
风之谷观后感
2015/06/11 职场文书
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技