当前位置: 首页 > 编程笔记 >

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

申屠浩歌
2023-03-14
本文向大家介绍Vue不能检测到Object/Array更新的情况的解决,包括了Vue不能检测到Object/Array更新的情况的解决的使用技巧和注意事项,需要的朋友参考一下

前言

看文档不认真,开发也没有多注意,总是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)

 

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。

 类似资料:
  • 如果我研究一维上两个球的碰撞检测。假设第一个球在位置0,每帧速度5像素,第二个球在位置3,每帧速度-5像素,那么在下一帧中,第一个球将移动到位置5,第二个球将跳到位置-2。在这种情况下,它们之间没有重叠,因此碰撞检测将失败。我怎么处理这个案子?这里有一张图片来说明:

  • 问题内容: 建立一个社交网络,我正在尝试获取实时通知。当前,站点使用setInterval每隔几秒钟发送一次AJAX请求。看起来像这样: 那很好,但是我非常担心创建服务器过载。我尝试了彗星技术,但由于某种原因,它发送的请求比上述代码多得多。还有其他更有用的技术来实时发布此数据吗? 编辑:为实现长轮询,我使用了以下内容(使用此处提到的示例:http : //techoctave.com/c7/pos

  • 本文向大家介绍解决Vue不能检测数组或对象变动的问题,包括了解决Vue不能检测数组或对象变动的问题的使用技巧和注意事项,需要的朋友参考一下 来看一个实例: 想实现的效果是点击 li 看 vm.nymbers[index] 是否存在,不存在设置为1,存在的话加1。 点击之后数字并没有在view层更新,而通过console打印发现数据更新了,只是view层没有及时的检测到。 再看一个改动之后的: 可以

  • 问题内容: 我在我的网站上设置了一个滑动面板。 完成动画制作后,我像这样设置哈希 (这是一个回调,并且在前面已分配)。 这很好用,可以使用户在面板上添加书签,也可以使非JavaScript版本正常工作。 但是,当我更新哈希时,浏览器跳到该位置。我想这是预期的行为。 我的问题是:如何预防这种情况?即如何更改窗口的哈希值,但是如果哈希值存在,浏览器 不能 滚动到该元素?某种东西吗? 我正在使用jQue

  • 我有两个没有匹配值的表表表1 表2 我想更新下面的表2,这意味着对于103,我想要表1中的101个值 我曾经 除此之外,还有其他查询要使用吗?

  • 问题内容: 我的页面结构是: 如何在不刷新整个页面的情况下更新/刷新组件? 一旦用户成功登录,我想在标题中隐藏“登录”链接。标题在所有组件/路由中都是通用的。 问题答案: 您可以使用 来在整个应用程序的不同组件之间进行通信。您可以定义一个数据共享服务,其中包含 您可以订阅和发出更改的服务。 定义数据共享服务 在您的 提供商条目中添加。 接下来,将导入到您和您在其中执行登录操作的组件中。在订阅主题更