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 相关文章推荐
纯JavaScript实现HTML5 Canvas六种特效滤镜示例
Jun 28 Javascript
JQUERY 获取IFrame中对象及获取其父窗口中对象示例
Aug 19 Javascript
用unescape反编码得出汉字示例
Apr 24 Javascript
IE浏览器IFrame对象内存不释放问题解决方法
Aug 22 Javascript
jquery控制显示服务器生成的图片流
Aug 04 Javascript
js实现文字在按钮上滚动的方法
Aug 20 Javascript
后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法
Jul 05 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
Jan 05 Javascript
原生js编写2048小游戏
Mar 17 Javascript
JavaScript中offsetWidth的bug及解决方法
May 17 Javascript
node省市区三级数据性能测评实例分析
Nov 06 Javascript
jquery实现拖拽小方块效果
Dec 10 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
phpStudy配置多站点多域名和多端口的方法
2017/09/01 PHP
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
jQuery实现单行文字间歇向上滚动源代码
2013/06/02 Javascript
innerHTML,outerHTML,innerText,outerText的用法及区别解析
2013/12/16 Javascript
JavaScript中window.showModalDialog()用法详解
2014/12/18 Javascript
详解javascript new的运行机制
2016/01/26 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
2016/12/14 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
vue2.0+ 从插件开发到npm发布的示例代码
2018/04/28 Javascript
详解angularjs4部署文件过大解决过程
2018/12/05 Javascript
Vue v-model组件封装(类似弹窗组件)
2020/01/08 Javascript
vue 翻页组件vue-flip-page效果
2020/02/05 Javascript
Ajax获取node服务器数据的完整步骤
2020/09/20 Javascript
Python多线程学习资料
2012/12/19 Python
python删除指定类型(或非指定)的文件实例详解
2015/07/06 Python
Python实现的RSS阅读器实例
2015/07/25 Python
python使用itchat实现手机控制电脑
2018/02/22 Python
pandas进行数据的交集与并集方式的数据合并方法
2018/06/27 Python
用Django写天气预报查询网站
2018/10/21 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
Anaconda3+tensorflow2.0.0+PyCharm安装与环境搭建(图文)
2020/02/18 Python
Python安装与卸载流程详细步骤(图解)
2020/02/20 Python
Python列表去重复项的N种方法(实例代码)
2020/05/12 Python
CSS3图片旋转特效(360/60/-360度)
2013/10/10 HTML / CSS
Belle Maison倍美丛官网:日本千趣会旗下邮购网站
2016/07/22 全球购物
The Hut英国:英国领先的豪华在线百货商店
2019/07/26 全球购物
普通大学毕业生自荐信范文
2014/02/23 职场文书
弘扬职业精神演讲稿
2014/03/20 职场文书
村级个人对照检查材料
2014/08/22 职场文书
政府个人对照检查材料思想汇报
2014/10/08 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
完美解决golang go get私有仓库的问题
2021/05/05 Golang
PHP RabbitMQ消息列队
2022/05/11 PHP