首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >反应严格模式

反应严格模式
EN

Stack Overflow用户
提问于 2021-07-21 07:19:17
回答 2查看 210关注 0票数 2

我正在做我的项目,我注意到,当启动严格模式时,它会将两个相同的元素推入我的数组中。当严格模式关闭时,它只将一个元素推入数组中。有什么解释吗?

代码语言: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,

        }
    })
}

这是我的状态。

代码语言:javascript
复制
    this.state = {
      winningNumber: getRandomNumber(),
      remainingTickets: 5,
      tickets: [],
      finished: false
    };
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-21 07:36:05

React StrictMode通过有意双重调用某些生命周期方法和响应钩子来帮助暴露意外的副作用。setState更新器函数是一个调用两次的函数。我将把深入的解释留给相关的问题。

发现意想不到的副作用

您无意中的副作用是当您在预减少tickets状态时将一个新元素推入其中时,会对以前的remainingTickets状态进行状态突变。帽子技巧是,您也不返回一个新的tickets数组引用。

代码语言:javascript
复制
this.setState((prevState) => {
  prevState.tickets.push(newTicket); // <-- mutation!!
  return {
    remainingTickets: --prevState.remainingTickets, // <-- mutation!!
    tickets: prevState.tickets, // <-- same old array reference
  }
})

解决方案是将以前的状态数组浅拷贝到一个新的数组引用中,并追加新元素。

代码语言:javascript
复制
this.setState((prevState) => ({
  remainingTickets: prevState.remainingTickets - 1,
  tickets: [...prevState.tickets, newTicket],
}));
票数 4
EN

Stack Overflow用户

发布于 2021-07-21 07:37:31

React.StrictMode使呈现函数在开发过程中被调用两次,以识别意外的副作用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68465414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档