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中根据字数截取字符串,不能截断url
Jan 12 Javascript
jquery的ajax简单结构示例代码
Feb 17 Javascript
JQuery与JS里submit()的区别示例介绍
Feb 17 Javascript
jQuery验证插件validation使用指南
Apr 21 Javascript
浅谈javascript中的DOM方法
Jul 16 Javascript
jQuery实现网页抖动的菜单抖动效果
Aug 07 Javascript
多种JQuery循环滚动文字图片效果代码
Jun 23 Javascript
关于网页中的无缝滚动的js代码
Jun 09 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
Jan 19 Javascript
Vue的路由及路由钩子函数的实现
Jul 02 Javascript
JavaScript实现轮播图特效
Apr 10 Javascript
vue如何批量引入组件、注册和使用详解
May 12 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
phpcms手机内容页面添加上一篇和下一篇
2015/06/05 PHP
php写入文件不覆盖的实例讲解
2019/09/17 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
jQuery列表拖动排列具体实现
2013/11/04 Javascript
JQuery结合CSS操作打印样式的方法
2013/12/24 Javascript
js动态移动滚动条至底部示例代码
2014/04/24 Javascript
基于jquery实现人物头像跟随鼠标转动
2015/08/23 Javascript
jquery实现多条件筛选特效代码分享
2015/08/28 Javascript
AngularJS实现全选反选功能
2015/12/08 Javascript
JS+CSS实现DIV层的展开、收缩效果
2016/01/28 Javascript
js中window.open的参数及注意注意事项
2016/07/06 Javascript
浅谈jQuery中ajaxPrefilter的应用
2016/08/01 Javascript
jquery css实现邮箱自动补全
2016/11/14 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
详解vue嵌套路由-query传递参数
2017/05/23 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
使用weixin-java-tools完成微信授权登录、微信支付的示例
2018/09/26 Javascript
webpack中如何加载静态文件的方法步骤
2019/05/18 Javascript
jQuery - AJAX load() 实例用法详解
2019/08/27 jQuery
js实现页面导航层级指示效果
2020/08/25 Javascript
Django中的CACHE_BACKEND参数和站点级Cache设置
2015/07/23 Python
Python之用户输入的实例
2018/06/22 Python
Python类反射机制使用实例解析
2019/12/30 Python
python如何获取apk的packagename和activity
2020/01/10 Python
匡威意大利官方商店 :Converse意大利
2018/11/27 全球购物
汽车专业毕业生推荐信
2013/11/12 职场文书
团工委书记自荐书范文
2013/12/17 职场文书
《月迹》教学反思
2014/02/19 职场文书
大学军训感言300字
2014/03/09 职场文书
搞笑婚礼主持词
2014/03/13 职场文书
总经理助理岗位职责范本
2014/07/20 职场文书
安全伴我行演讲稿
2014/09/04 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
Python中的变量与常量
2021/11/11 Python