reactjs - 有什么区别?更新列表的两种方法
问题描述
我有一个列表,我需要分成两个列表,这个列表可以有更新,因为我有很多过滤器。
const List = ({list}) => {
const [listA, setListA] = useState([]);
const [listB, setListB] = useState([]);
useEffect(() => {
setListA(list.filter(x => x.a === 0));
setListB(list.filter(x => x.a !== 0));
}, [list]);
return (
......
)
}
VS
const List = ({list}) => {
const listA = list.filter(x => x.a === 0);
const listB = list.filter(x => x.a !== 0);
return (
......
)
}
解决方案
不同之处在于,在第一种情况下,您最终将冗余信息存储在状态中。此外,当您的列表更改时,您将运行您的效果,设置 and 的状态listA
,listB
并最终获得额外的组件渲染。
以这个代码框为例。您可以在控制台中看到我们的组件渲染了两次:一次用于初始渲染,一次作为效果调用setState
新列表的结果。那是额外的渲染!
由于您不需要存储listA
和listB
处于状态,因此我建议您不要这样做;它们是“派生”状态,可以简单地作为list
道具和过滤器的结果进行计算。
推荐阅读
- ubuntu - 使用 anonip.py 将 Apache 日志中的 IP 匿名化与使用 Cronolog 的日志轮换相结合
- r - 卸载并重新安装 Quantstrat 以进行全新和干净的设置 R
- python - Bigquery Python API 多线程不会提高性能
- angular - 从 Typescript 端重置的角度材料
- python - 使用 Date 创建自上次出现列以来的时间
- java - kafka 流异常找不到 org.apache.kafka.common.serialization.Serdes$WrapperSerde 的公共无参数构造函数
- python - 如何在 Python 中制作多击键功能?
- sql - SQL Server 在一个查询中查询一个订单的所有行
- ruby - 您如何在 mongoid 中定义部分索引?
- c# - 编写接受 Lambda 表达式列表以访问属性的 html 扩展