【vue3|第17期】Vue3 中清空 Reactive 定义的数组的正确姿势

日期:2024年7月15日
作者:Commas
签名:(ง •_•)ง 积跬步以致千里,积小流以成江海……
注释:如果您觉得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^
1.01365 = 37.7834;0.99365 = 0.0255
1.02365 = 1377.4083;0.98365 = 0.0006

说在最前面:本文 vue3 的示例代码,在没有另外声名的情况下,均采用 <script setup> 组合式代码风格,风格统一,避免混乱,请各位新老食客放心食用哈 ^ _ ^



在这里插入图片描述


一、前言

Vue3 的响应式系统中,reactive API 允许我们创建响应式对象数组,这些对象或数组的任何变化都能被 Vue依赖追踪系统捕获,并自动触发视图更新。然而,在处理响应式数组时,特别是当需要清空数组时,我们需要注意一些特定的操作方式,以确保响应性不被破坏。本文将给出解决方案。

二、为什么不能直接赋值 [] 或重新声明?

Vue3 的响应式系统中,reactive 创建的响应式数组是通过代理(Proxy)实现的。这种代理能够拦截并响应数组上的各种操作,如 push、pop、splice 等,从而触发视图更新。然而,当你直接给一个响应式数组赋值一个新的数组(即 myArray = [])时,你实际上是在替换掉原有的响应式引用,而不是修改原数组的内容。由于新的数组([])并不是通过 reactive 创建的,因此它不具备响应性,Vue 无法追踪到它的变化

同样地,如果通过 myArray = someOtherArray 的方式给数组赋一个全新的数组,也会遇到相同的问题:新的数组不是响应式的,Vue 无法追踪其变化

三、两种数组清空的方案

我们通过一个例子来说明解决方案。
首先,我们定义一个 Reactive 的数组:

import { reactive } from 'vue';
const numList = reactive([1, 2, 3, 4, 5]);  

1、使用 myArray.length = 0 清空数组

myArray.length = 0 这种方式则是通过直接操作数组的 length 属性来清空数组的,这是一种标准的数组操作方法,且被 Vue3响应式系统所支持length 被设置为 0 时,数组中的所有元素都会被移除,且这个操作是响应式的,能够触发依赖该数组的视图更新

numList.length = 0;

2、使用数组的 splice 方法清空数组

numList.splice(0, numList.length);

这两种方式都会修改数组的长度,从而触发视图的更新。

四、完整示例

假设我们有一个 Vue3 组件,其中包含一个响应式数组 items,并在模板中通过 v-for 指令渲染这个数组的元素:

<template>  
  <div>  
    <ul>  
      <li v-for="(item, index) in items" :key="index">{{ item }}</li>  
    </ul>  
    <button @click="clearItems">清空数组</button>  
  </div>  
</template>  
  
<script setup>  
import { reactive } from 'vue';  
  
const numList = reactive([1, 2, 3, 4, 5]);  

function clearItems() {  
  // 正确的方式:清空数组并保持响应性  
  numList.length = 0;  

  // 错误的方式,不会触发响应性更新  
  // numList = [];  

  // 同样错误的方式  
  // numList = someOtherArray;  
}  
  
</script>

在上述示例中,点击“清空数组”按钮将触发 clearItems 方法,该方法通过 numList.length = 0 清空数组,由于这是响应式的操作,所以视图会立即更新,不再显示任何列表项。

五、结语

Vue3 中,当需要清空一个 reactive 定义的数组时,强烈推荐使用 myArray.length = 0 的方式。这种方式既简单又直接,能够确保数组的响应性不被破坏,从而实现视图的自动更新。相比之下,直接给数组赋值新的数组或重新声明数组都不是好的做法,因为它们会破坏原有的响应性连接。


版权声明:本文为博主原创文章,如需转载,请给出:
原文链接:https://blog.csdn.net/qq_35844043/article/details/140349201

  • 21
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Vue 3,想要清空reactive数组,可以使用shallowRef来定义一个数组,并通过修改其value属性将其清空。根据引用的代码示例,假设我们有一个名为component_list的shallowRef数组,可以通过将其value属性设置为空数组清空它。 ```javascript component_list.value = []; ``` 通过将value属性设置为空数组,我们可以清空component_list数组的所有元素。这样,Vue页面上展示的数据也将被清空。 需要注意的是,shallowRef只是对一个值的浅层响应式包装,它只响应值的改变,而不会响应值内部元素的改变。因此,如果数组的元素是对象或其他引用类型,需要单独处理每个元素的清空。<span class="em">1</span><span class="em">2</span> #### 引用[.reference_title] - *1* [Vue3 清空Reactive定义数组](https://blog.csdn.net/m0_50080847/article/details/128382181)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [vue踩坑记录之数组定义和赋值问题](https://download.csdn.net/download/weixin_38739919/13980102)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Commas.KM

码路共同进步,感恩一路有您

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值