在React中使用setState修改数组的值时,为什么不能使用数组的可变方法(push、unshift等)? 但在vue中可以

news/2024/10/18 7:44:32/

一、为什么React中修改数组时不能使用数组的可变方法

在React中使用setState修改数组的值时,不推荐使用数组的可变方法(如push、unshift等)。这是因为React会对比新旧状态,在发现状态变化后,更新组件的渲染。但当你调用可变方法修改数组时,虽然数组已经被改变,但数组的地址并没有发生变化,React并不会察觉到这个变化,也就不会更新组件。

相反,应该遵循以下原则来正确地进行数组操作:

创建一个新数组,将新值推入其中
将新数组传递给setState来更新组件
以下代码演示了如何在React中创建新数组并更新状态:

this.setState(prevState => ({myArray: [...prevState.myArray, newValue]
}));

以上代码中,我们使用扩展运算符...来创建一个新数组,并将原有数组中所有元素放入其中(即展开),再将新的值推入新数组中。最后,我们将新数组作为参数传递给setState函数。由于我们返回的是一个新对象,而不是直接引用旧对象,所以React能够正确地检测到状态变化并更新组件。

同样的,如果要从数组中删除元素,也应该创建一个新数组并将元素排除在外,如下所示:

this.setState(prevState => ({myArray: prevState.myArray.filter(element => element !== valueToRemove)
}));

在上面的代码片段中,我们使用Array.filter()方法从原数组中过滤掉要移除的元素,并返回一个新数组。最后,我们将这个新数组传递给setState,以更新组件状态。

二、Vue中为什么可以直接用数组可变方法来修改数组

相反的,在vue中直接使用数组可变方法(push, unshift等)改变data中的数组,是因为vue使用了响应式系统来实现数据的双向绑定。

当一个组件中的数据对象被包装成响应式对象后,vue会追踪这个对象,并自动在其属性被访问和修改时发出通知。这就使得 vue 能够在组件更新之后,检测到需要重新渲染的地方,从而做到数据与视图的联动。

对于数组,vue同样对它进行了包装,即定义了一系列能够触发视图更新的 array mutation method(变异方法),如push, pop, shift, unshift等。这些变异方法是通过重写数组原型上的方法来实现的,当触发这些方法时,同时也会触发vue的通知机制,从而更新视图。

因此,在vue中我们可以放心地直接使用push、unshift等可变方法来改变数组而不必担心视图不会更新。


http://www.ppmy.cn/news/47209.html

相关文章

TiDB实战篇-TiDB Cluster部署

简介 部署TiDB Cluster部署,熟系集群的基础操作。 集群规划 机器拓扑 3pd,3tikv,1tidb_server.1tiflash,监控。 192.168.66.10192.168.66.20192.168.66.21 pd_servers tikv_servers tidb_servers tiflash_servers pd_servers tikv_servers monitoring_servers…

SSH升级

升级openssh版本 一、安装telnet远程管理主机1、检查是否安装telnet2、安装telnet服务 二、下载所需的安装包1、下载openssl、openssh、zlib安装包2、安装所需的相关软件3、备份原来的数据4、复制文件到/usr/local/bin/下增加执行权限 一、安装telnet远程管理主机 1、检查是否…

用SQL语句操作Oracle数据库--数据查询详解(下篇)

数据查询是数据库的核心操作。上一篇文章我们介绍了单表查询操作,本文将继续介绍另一种重要的查询类型—[ 多表查询 ](涉及多个表的数据查询)。 本文我们将使用以下三个表来进行查询操作: TABLE1: S(学生基本信息表) TABLE2: C(…

设置Pycharm的背景颜色(样式)、图片

目录 一、效果 二、背景图片 三、背景颜色 一、效果 二、背景图片 1.打开Pycharm中的File-Settings 2.点击Appearance & Behavior中的Appearance,然后点击Bcakground Image (图中已标明顺序) 3.找到图片并选中。 (图中已…

需要买apple pencil吗?ipad第三方电容笔了解下

第一款ipad早在诞生于十年前,并被作为一款平板电脑使用,其性能十分出色。随着IPAD的不断更新换代,IPAD已经被越来越多的人接受了。其中,iPad的附属配件起到了很大的作用,就像今天要介绍的电容笔,它是我们进…

ARM rootfs、linuxrc 的简单制作

一、nfs 方式启动自制简易文件夹形式的rootfs 1、什么是nfs (1) nfs 是一种网络通讯协议,由服务器和客户端构成。 (2) nfs 的作用。利用 nfs 协议,可以做出很多直接性的应用,我们这里使用 nfs 主要是做 rootfs 挂载。 开发板中运行 kerne…

【Linux】NanoPi-NEO2外接spi-lcd

这是目录 一、显示接口1.1、LCD接口1.2、核心板接口 二、添加驱动2.1、确认驱动型号2.2、添加驱动 三、测试四、附加4.1、交叉编译器安装4.2、内核和module编译4.3、扩展rootfs大小 本文使用环境: 电脑:Ubuntu 18.04.5 LTS 开发板:NanoPi-NEO…

Microsoft Power Apps部署方案

目录 前言 一、准备条件 二、Power Apps环境部署 三、应用程序部署 四、最佳实践 总结