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 相关文章推荐
window.onload 加载完毕的问题及解决方案(下)
Jul 09 Javascript
jQuery实现简单的点赞效果
May 29 Javascript
基于javascript实现彩票随机数生成(简单版)
Apr 17 Javascript
JS函数定义方式的区别介绍
Mar 22 Javascript
基于js粘贴事件paste简单解析以及遇到的坑
Sep 07 Javascript
JS中的BOM应用
Feb 02 Javascript
Vue将页面导出为图片或者PDF
Aug 17 Javascript
Vue+element 解决浏览器自动填充记住的账号密码问题
Jun 11 Javascript
如何在项目中使用log4.js的方法步骤
Jul 16 Javascript
简单分析js中的this的原理
Aug 31 Javascript
layui复选框限制选择个数的方法
Sep 18 Javascript
解决vue更新路由router-view复用组件内容不刷新的问题
Nov 04 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
smarty+adodb+部分自定义类的php开发模式
2006/12/31 PHP
php object转数组示例
2014/01/15 PHP
CodeIgniter连贯操作的底层原理分析
2016/05/17 PHP
php常用日期时间函数实例小结
2019/07/04 PHP
在IE下:float属性会影响offsetTop的取值
2006/12/22 Javascript
input 输入框内的输入事件详细分析
2010/03/17 Javascript
javascript基础知识大全 便于大家学习,也便于我自己查看
2012/08/17 Javascript
jquery分割字符串的方法
2015/06/24 Javascript
基于replaceChild制作简单的吞噬特效
2015/09/21 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
纯JavaScript 实现flappy bird小游戏实例代码
2016/09/27 Javascript
JS常用函数和常用技巧小结
2016/10/15 Javascript
jQuery中layer分页器的使用
2017/03/13 Javascript
jQuery zTree树插件动态加载实例代码
2017/05/11 jQuery
jquery Ajax实现Select动态添加数据
2017/06/08 jQuery
深入掌握 react的 setState的工作机制
2017/09/27 Javascript
详解vue + vuex + directives实现权限按钮的思路
2017/10/24 Javascript
JavaScript中创建原子的方法总结
2018/08/26 Javascript
Vuex 使用及简单实例(计数器)
2018/08/29 Javascript
jQuery选择器选中最后一个元素,倒数第二个元素操作示例
2018/12/10 jQuery
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
JS实现的碰撞检测与周期移动完整示例
2019/09/02 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
[52:41]OG vs IG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/20 DOTA
Python实现的tab文件操作类分享
2014/11/20 Python
Python 基础教程之闭包的使用方法
2017/09/29 Python
Python中循环引用(import)失败的解决方法
2018/04/22 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
2018/12/12 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
生物技术专业研究生自荐信
2013/09/22 职场文书
《画家乡》教学反思
2014/04/22 职场文书
现役军人家属慰问信
2015/03/24 职场文书
婚宴主持词
2015/06/30 职场文书
JavaScript 与 TypeScript之间的联系
2021/11/27 Javascript