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 opener的使用详解
Jan 11 Javascript
完善的jquery处理机制
Feb 21 Javascript
js简单实现图片延迟加载的方法
Jul 19 Javascript
JS实现商品筛选功能
Aug 19 Javascript
VUE长按事件需求详解
Oct 18 Javascript
原生JS实现瀑布流插件
Feb 06 Javascript
使用vue制作探探滑动堆叠组件的实例代码
Mar 07 Javascript
JS使用Date对象实时显示当前系统时间简单示例
Aug 23 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
Apr 13 Javascript
ES6函数和数组用法实例分析
May 23 Javascript
JavaScript indexOf()原理及使用方法详解
Jul 09 Javascript
vue实现移动端项目多行文本溢出省略
Jul 29 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 多进程 解决难题
2009/06/22 PHP
php实现按照权重随机排序数据的方法
2015/01/09 PHP
通过php删除xml文档内容的方法
2015/01/23 PHP
PHP中使用hidef扩展代替define提高性能
2015/04/09 PHP
人脸识别测颜值、测脸龄、测相似度微信接口
2016/04/07 PHP
如何让PHP编码更加好看利于阅读
2019/05/12 PHP
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
js获取select标签的值且兼容IE与firefox
2013/12/30 Javascript
Bootstrap每天必学之导航
2015/11/26 Javascript
jQuery ajax分页插件实例代码
2016/01/27 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
Node.js connect ECONNREFUSED错误解决办法
2016/09/15 Javascript
jQuery 的 ready()的纯js替代方法
2016/11/20 Javascript
jQuery 如何实现一个滑动按钮开关
2016/12/01 Javascript
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
vue中使用cropperjs的方法
2018/03/01 Javascript
使用vue cli4.x搭建vue项目的过程详解
2020/05/08 Javascript
JS数据类型分类及常用判断方法
2020/11/19 Javascript
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
Python利用matplotlib生成图片背景及图例透明的效果
2017/04/27 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
python 将字符串完成特定的向右移动方法
2019/06/11 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
通过python扫描二维码/条形码并打印数据
2019/11/14 Python
python将音频进行变速的操作方法
2020/04/08 Python
Python 操作SQLite数据库的示例
2020/10/16 Python
Python爬虫如何破解JS加密的Cookie
2020/11/19 Python
HTML5调用手机摄像头拍照的实现思路及代码
2014/06/15 HTML / CSS
澳大利亚最好的厨具店:Kitchen Warehouse
2018/03/13 全球购物
中专自我鉴定范文
2013/10/16 职场文书
劳动工资科岗位职责范本
2014/03/02 职场文书
中学生英语演讲稿
2014/04/26 职场文书
公务员群众路线心得体会
2014/11/03 职场文书
学子宴致辞大全
2015/07/27 职场文书
mysql优化
2021/04/06 MySQL
解决hive中导入text文件遇到的坑
2021/04/07 Python