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 相关文章推荐
静态页面的值传递(三部曲)
Sep 25 Javascript
js输入框邮箱自动提示功能代码实现
Dec 10 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
使用Script元素发送JSONP请求的方法
Jun 12 Javascript
jQuery的层级查找方式分析
Jun 16 Javascript
详解Vue中使用v-for语句抛出错误的解决方案
May 04 Javascript
vue 请求后台数据的实例代码
Jun 22 Javascript
vue+element-ui+ajax实现一个表格的实例
Mar 09 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
Jun 19 jQuery
vue组件暴露和.js文件暴露接口操作
Aug 11 Javascript
如何在JS文件中获取Vue组件
Sep 16 Javascript
jQuery实现回到顶部效果
Oct 19 jQuery
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 md5下16位和32位的实现代码
2008/04/09 PHP
PHP fopen 读取带中文URL地址的一点见解
2012/09/25 PHP
解析thinkphp的左右值无限分类
2013/06/20 PHP
PHP 使用memcached简单示例分享
2015/03/05 PHP
php计算一个文件大小的方法
2015/03/30 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
验证码在IE中不刷新而谷歌等浏览器正常的解决方案
2014/03/18 Javascript
删除Javascript Object中间的key
2014/11/18 Javascript
js正则表达式匹配数字字母下划线等
2015/04/14 Javascript
Javascript数组Array方法解读
2016/03/13 Javascript
jQuery实现鼠标滑过图片移动特效
2016/12/08 Javascript
jquery实现下拉框左右选择功能
2017/02/21 Javascript
微信公众号菜单配置微信小程序实例详解
2017/03/31 Javascript
vue增删改查的简单操作
2017/07/15 Javascript
用js实现before和after伪类的样式修改的示例代码
2017/09/07 Javascript
vue-router之nuxt动态路由设置的两种方法小结
2018/09/26 Javascript
微信小程序使用swiper组件实现层叠轮播图
2018/11/04 Javascript
[40:12]Liquid vs Chaos 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
Python协程的用法和例子详解
2017/09/09 Python
django ajax json的实例代码
2018/05/29 Python
对python中list的拷贝与numpy的array的拷贝详解
2019/01/29 Python
使用python telnetlib批量备份交换机配置的方法
2019/07/25 Python
python @classmethod 的使用场合详解
2019/08/23 Python
使用python制作一个解压缩软件
2019/11/13 Python
从多个tfrecord文件中无限读取文件的例子
2020/02/17 Python
使用CSS3的font-face字体嵌入样式的方法讲解
2016/05/13 HTML / CSS
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
美国购买韩国护肤和美容产品网站:Althea Korea
2020/11/16 全球购物
企业申诉管理制度
2014/01/30 职场文书
挂靠协议书范本
2014/04/22 职场文书
计算机考试作弊检讨书1000字
2015/01/01 职场文书
贫困证明书范文
2015/06/16 职场文书
python控制台打印log输出重复的解决方法
2021/05/14 Python
nginx之queue的具体使用
2022/06/28 Servers