Vue不能检测到Object/Array更新的情况的解决

news/2024/7/9 23:59:28 标签: vue

前言
看文档不认真,开发也没有多注意,总是hack。忽悠忽悠就过去,但怎么说,歪门邪道还是不太好,现在就亡羊补牢,总结总结。

数组

索引

  • 使用下标更新数组元素;
  • 使用赋值方式改变数组长度;
  • 使用下标增删数组元素;

正文

使用下标更新数组元素

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)

this.arrs.splice(0, 1, 'zero');

前端全栈学习交流圈:866109386,面向1-3经验年前端开发人员,帮助突破技术瓶颈,提升思维能力,群内有大量PDF可供自取,更有干货实战项目视频进群免费领取。

使用赋值方式改变数组长度
即this.arrs.length = 100;无效!
官方应对方法:
1、vm.items.splice(newLength)

this.arrs.splice(100);

使用下标增删数组元素
即一下操作无效:

this.arrs[this.arrs.length] = this.arrs.length;

官方应对方法:变异方法。

  • push()
  • pop()
  • shift()
  • unshift()
  • splice()
  • sort()
  • 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 元素得到最大范围的重用而实现了一些智能的、启发式的方法,所以用一个含有相同元素的数组去替换原来的数组是非常高效的操作。

前端全栈学习交流圈:866109386,面向1-3经验年前端开发人员,帮助突破技术瓶颈,提升思维能力,群内有大量PDF可供自取,更有干货实战项目视频进群免费领取。

对象

索引

增删元素;

正文

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对数组也是有效传送门


http://www.niftyadmin.cn/n/1301035.html

相关文章

CocosCreator修改js文件模板

正常我们在CocosCreator编辑器里新建的JS文件是这样的: 这上面有一部分我们是不需要的,所以每次新建文件的时候,都需要手动把他们删除掉,很尴尬啊有木有。 所以我们需要定制自己的JS文件模板: 首先,我们打…

ES6与CommonJS中的模块处理的区别

ES6和CommonJS都有自己的一套处理模块化代码的措施,即JS文件之间的相互引用。 为了方便两种方式的测试,使用nodejs的环境进行测试 CommonJS的模块处理 使用require来引入其他模块的代码,使用module.exports来引出 // exportDemo.js count…

指向类成员变量的指针int A:: * p

 #include "stdafx.h" #include <iostream> #include <type_traits> using namespace std; class A {public : double o; //制造一个偏移量 int a; }; class B: public A {public: int b; }; int main() { A a1 ; …

纹理压缩简介 DXT PVR ETC

文章转载自&#xff1a;https://www.jianshu.com/p/a0d7eed9f44d 在软件开发&#xff0c;特别是三维应用中&#xff0c;纹理随处可见&#xff0c;但受限于网络环境https://www.jianshu.com/p/a0d7eed9f44d和硬件能力&#xff0c;纹理也是一大瓶颈。而且在一般的三维应用中&…

Vue 在使用中的一些小技巧

在vue的使用过程中会遇到各种场景&#xff0c;当普通使用时觉得没什么&#xff0c;但是或许优化一下可以更高效更优美的进行开发。 1. 多图表resize事件去中心化 1.1 一般情况 有时候我们会遇到这样的场景&#xff0c;一个组件中有几个图表&#xff0c;在浏览器resize的时候…

C++编译与链接过程

头文件&#xff08;.h&#xff09;是不参与编译的,一般只是编译源文件(.cpp)生成.obj. 但是.cpp里面有#include将指定头文件(其实任何文件都行)插进来, 组成完整的.cpp. 如果你不喜欢这个方式,你也可以直接在.cpp里面写好了,而不放到.h里面,载用指令拷贝进来. 好了&…

如何查看网页内存大小

1、错误的查看方法 我们在做Web端开发的时候&#xff0c;会有需要查看项目的内存占用情况&#xff0c;那么我们的查看内存的操作是这样的&#xff1a; 比如&#xff0c;在Google浏览器测试项目的时候&#xff0c;是先在Memory页签下点击“Take heap snapshot”来查看当前网页…

C++内部链接与外部链接

你曾经碰到的问题&#xff1a; 1.为什么有时会出现aaa已在bbb中重定义的错误&#xff1f; 2.为什么有时会出现无法解析的外部符号&#xff1f; 3.为什么有的内联函数的定义需要写在头文件中? 4.为什么对于模板&#xff0c;声明和定义都要写在一起&#xff1f; 编译单元 什么是…