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 showModalDialog模态对话框使用说明
Dec 31 Javascript
JavaScript 页面坐标相关知识整理
Jan 09 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
Jan 20 Javascript
js控制表单不能输入空格的小例子
Nov 20 Javascript
JS实现数字格式千分位相互转换方法
Aug 01 Javascript
Angularjs实现分页和分页算法的示例代码
Dec 23 Javascript
详解如何快速配置webpack多入口脚手架
Dec 28 Javascript
解决echarts的多个折现数据出现坐标和值对不上的问题
Dec 28 Javascript
JS温故而知新之变量提升和时间死区
Jan 27 Javascript
JS实现li标签的删除
Apr 12 Javascript
Vue防止白屏添加首屏动画的实例
Oct 31 Javascript
vue界面发送表情的实现代码
Sep 11 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导出excel格式数据问题
2014/03/11 PHP
jquery $.ajax入门应用一
2008/11/19 Javascript
jquery ajax学习笔记2 使用XMLHttpRequest对象的responseXML
2011/10/16 Javascript
JavaScript中prototype为对象添加属性的误区介绍
2013/10/15 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
JQuery弹出炫丽对话框的同时让背景变灰色
2014/05/22 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
Javascript学习笔记之函数篇(六) : 作用域与命名空间
2014/11/23 Javascript
JavaScript常用验证函数实例汇总
2014/11/25 Javascript
angularjs实现文字上下无缝滚动特效代码
2016/09/04 Javascript
小程序开发踩坑:页面窗口定位(相对于浏览器定位)(推荐)
2019/04/25 Javascript
JavaScript遍历查找数组中最大值与最小值的方法示例
2019/05/24 Javascript
基于layPage插件实现两种分页方式浅析
2019/07/27 Javascript
微信小程序反编译的实现
2020/12/10 Javascript
[04:50]2019DOTA2高校联赛秋季赛四强集锦
2019/12/27 DOTA
Python中使用strip()方法删除字符串中空格的教程
2015/05/20 Python
python anaconda 安装 环境变量 升级 以及特殊库安装的方法
2017/06/21 Python
Linux CentOS Python开发环境搭建教程
2018/11/28 Python
python web自制框架之接受url传递过来的参数实例
2018/12/17 Python
django ModelForm修改显示缩略图 imagefield类型的实例
2019/07/28 Python
python对csv文件追加写入列的方法
2019/08/01 Python
python多任务之协程的使用详解
2019/08/26 Python
Pytorch转onnx、torchscript方式
2020/05/25 Python
PyTorch-GPU加速实例
2020/06/23 Python
pytorch学习教程之自定义数据集
2020/11/10 Python
Timberland美国官网:全球领先的户外品牌
2016/08/15 全球购物
全球领先的全景影像品牌:Insta360
2019/08/21 全球购物
什么是WEB控件?使用WEB控件有哪些优势?
2012/01/21 面试题
机械工程师求职自我评价
2013/09/23 职场文书
大学生学业生涯规划
2014/01/05 职场文书
班级出游活动计划书
2014/08/15 职场文书
民主生活会发言材料
2014/10/20 职场文书
小学英语教学经验交流材料
2015/11/02 职场文书
情况说明书格式及范文
2019/06/24 职场文书
提升Nginx性能的一些建议
2021/03/31 Servers
Redis 彻底禁用RDB持久化操作
2021/07/09 Redis