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 相关文章推荐
Linux下使用jq友好的打印JSON技巧分享
Nov 18 Javascript
jquery实现倒计时功能
Dec 28 Javascript
JS识别浏览器类型(电脑浏览器和手机浏览器)
Nov 18 Javascript
js案例之鼠标跟随jquery版(实例讲解)
Jul 21 jQuery
webpack使用 babel-loader 转换 ES6代码示例
Aug 21 Javascript
基于twbsPagination.js分页插件使用心得(分享)
Oct 21 Javascript
JS模拟实现哈希表及应用详解
May 04 Javascript
详解使用jest对vue项目进行单元测试
Sep 07 Javascript
js的新生代垃圾回收知识点总结
Aug 22 Javascript
js实现超级玛丽小游戏
Mar 18 Javascript
用javascript制作qq注册动态页面
Apr 14 Javascript
VUE中的v-if与v-show区别介绍
Mar 13 Vue.js
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
php短域名转换为实际域名函数
2011/01/17 PHP
CodeIgniter使用phpcms模板引擎
2013/11/12 PHP
Laravel 5.3 学习笔记之 安装
2016/08/28 PHP
js 浮动层菜单收藏
2009/01/16 Javascript
namespace.js Javascript的命名空间库
2011/10/11 Javascript
js去除重复字符串两种实现方法
2013/01/09 Javascript
jQuery实现类似淘宝购物车全选状态示例
2013/06/26 Javascript
jquery实现侧边弹出的垂直导航
2014/12/09 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
jquery渐隐渐显的图片幻灯闪烁切换实现方法
2015/02/26 Javascript
JS实现的打字机效果完整实例
2016/06/20 Javascript
浅谈JS读取DOM对象(标签)的自定义属性
2016/11/21 Javascript
Bootstrap CSS组件之面包屑导航(breadcrumb)
2016/12/17 Javascript
ES7中利用Await减少回调嵌套的方法详解
2017/11/01 Javascript
vue输入节流,避免实时请求接口的实例代码
2019/10/30 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
线程和进程的区别及Python代码实例
2015/02/04 Python
python Django 反向访问器的外键冲突解决
2020/05/20 Python
python 负数取模运算实例
2020/06/03 Python
同步和异步有何异同,在什么情况下分别使用他们?
2012/12/28 面试题
护士专业推荐信
2013/11/02 职场文书
可贵的沉默教学反思
2014/02/06 职场文书
酒店保安领班职务说明书
2014/03/04 职场文书
优秀少先队辅导员先进事迹材料
2014/05/18 职场文书
经典禁毒标语
2014/06/16 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
会议欢迎词范文
2015/01/27 职场文书
2015年安全生产责任书
2015/01/30 职场文书
红旗渠导游词
2015/02/09 职场文书
2015年保管员工作总结
2015/04/30 职场文书
2015年宣传部个人工作总结
2015/05/14 职场文书
人生遥控器观后感
2015/06/11 职场文书
安全教育培训心得体会
2016/01/15 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
浅谈python数据类型及其操作
2021/05/25 Python