javascript - 反应严格模式
问题描述
我正在研究我的项目,我注意到当打开严格模式时,它会将两个相同的元素推入我的数组中。当严格模式关闭时,它只会将一个元素推入数组。有什么解释为什么会发生这种情况吗?
import {getRandomNumber} from './utils';
export function registerTicket() {
const newTicket = {
number: getRandomNumber(),
color: 'red',
}
this.setState((prevState) => {
prevState.tickets.push(newTicket);
return {
remainingTickets: --prevState.remainingTickets,
tickets: prevState.tickets,
}
})
}
这是我的状态。
this.state = {
winningNumber: getRandomNumber(),
remainingTickets: 5,
tickets: [],
finished: false
};
解决方案
ReactStrictMode
通过有意地重复调用某些生命周期方法和 React 钩子来帮助暴露无意的副作用。setState
updater 函数是被调用两次的函数。我将深入解释链接的问题。
tickets
当您将新元素推入其中并预先减少状态时,您无意的副作用是先前状态的状态突变remainingTickets
。帽子戏法是您也不会返回新的tickets
数组引用。
this.setState((prevState) => {
prevState.tickets.push(newTicket); // <-- mutation!!
return {
remainingTickets: --prevState.remainingTickets, // <-- mutation!!
tickets: prevState.tickets, // <-- same old array reference
}
})
解决方案是将先前的状态数组浅复制到新的数组引用中并附加新元素。
this.setState((prevState) => ({
remainingTickets: prevState.remainingTickets - 1,
tickets: [...prevState.tickets, newTicket],
}));
推荐阅读
- c++ - C++ STL 按值设置擦除
- excel - 当 redemption.dll 加载并且操作 excel 2016 在从磁盘启动保存的文件之前暂停
- windows - 如何在服务器机器上保持客户端密码安全
- c++ - 始终显示“默认 TException”。即使设置了“__set_what_UTF8”
- vuex - 如何在 vue-resource 中读取存储设置器值?
- html - X-path 不适用于一页上的多个 html 标签
- swift - RealityKit - 模型实体的动画不透明度?
- android - 如何按日期对 RecyclerView 标题和项目进行排序
- java - “匹配鞋子”挑战我的错误在哪里
- reactjs - 从 JSON 获取时无法读取 ReactJs 中数据 null 的属性