当前位置: 首页 > 面试题库 >

何时使用功能setState

相高谊
2023-03-14
问题内容

在过去的几天里,我一直在学习React,研究一些有关编写不同元素的不同方式的教程和说明。但是,我最想知道的是-
setState更新/覆盖state组件属性的功能。

例如,假设我有一个包含以下内容的类:

class Photos extends React.Component {
    constructor() {
        super()
        state = {
            pictures: []
        }
    }

   componentDidMount() {
      // This is where the fetch and setState will occur (see below)
   }

    render() {
       return {
          <div className="container">
             {this.state.pictures}
          </div>
       }
    }
}

这个例子让我从API获取图像。

鉴于我已经执行了此函数的获取,映射和返回操作-然后,我将pictures: []使用在API调用中获得的结果来更新状态数组。

我的问题源于我所见过的关于如何更新/覆盖图片状态属性的不同方法。

我看到它以两种不同的方式编写:

1) 这似乎是一种非常简单易读的方法

this.setState({pictures: pics})

2) 这比较复杂,但我认为它被描述为更安全的方法

this.setState(prevState => ({
   pictures: prevState.pictures.concat(pics)
}))

有人可以解释使用这两种方法的优点吗?我希望将来与代码保持一致,处理道具和状态等,因此,最通用的方法当然是首选。


问题答案:

首先,在您的情况下,两种语法完全不同,您可能要寻找的是两者之间的区别

this.setState({pictures: this.state.picture.concat(pics)})

this.setState(prevState => ({
   pictures: prevState.pictures.concat(pics)
}))

要了解为什么第二种方法是首选方法,您需要了解React在内部使用setState做什么。

React将首先将您传递给的对象合并setState()到当前状态。然后,它将启动该和解事务。由于调用setState()可能不会立即更新您的状态。

React可以将多个setState()调用批处理为一个更新,以提高性能。

考虑一个简单的情况,要理解这一点,在您的函数中,您可能会多次调用setState,例如

myFunction = () => {

   ...
   this.setState({pictures: this.state.picture.concat(pics1)})
   this.setState({pictures: this.state.picture.concat(pics1)})
   this.setState({pictures: this.state.picture.concat(pics1)})

   ...
}

在简单的应用程序中,这不是有效的用例,但是随着应用程序变得复杂,可能会在多个地方发生多个setState调用,并执行相同的操作。

因此,为了执行有效的更新,React通过提取传递给每个setState()调用的所有对象来进行批处理,将它们合并在一起形成一个对象,然后使用该对象来进行处理setState()。根据setState文档

如果您尝试在同一周期内多次增加项目数量,则将导致以下结果:

Object.assign(
  previousState,
  {quantity: state.quantity + 1},
  {quantity: state.quantity + 1},
  ...
)

后续呼叫将覆盖同一周期中先前呼叫的值,因此数量只会增加一次。如果下一个状态取决于上一个状态,我们建议使用updater函数形式,而不是

因此,如果任何对象包含相同的键,则存储具有相同键的最后一个对象的键的值。因此,更新仅使用最后一个值发生一次



 类似资料:
  • 问题内容: 我将Q节点库用于Promises,我认为这个问题也适用于Bluebird库。 语境 我需要对自己的自定义函数和node.js 样式异步函数进行一些函数调用。 如果我正在调用这样的函数: 同步功能 并需要以上内容来执行此功能: 同步功能 并且需要调用类似于以下内容的本机节点函数: 异步功能 并需要以上内容来执行此功能: 同步功能 题 为了使我的所有函数“递延”或答应知道,在这里要做的“正

  • 问题内容: 我正在尝试使用current.futures模块使超时在python3.2中工作。但是,当它超时时,并不会真正停止执行。我尝试了使用线程和进程池执行器,但它们都没有停止任务,只有直到完成后,超时才会增加。那么,有谁知道是否有可能使它起作用? 问题答案: 据我所知,TimeoutError实际上是在您期望的时间引发的,而不是在任务完成之后引发的。 但是,您的程序本身将继续运行,直到完成所

  • 我在这里关注Android开发者的DAO教程: https://developer.android.com/codelabs/android-room-with-a-view-kotlin#5 他们说: 默认情况下,所有查询都必须在单独的线程上执行。 Room支持静态编程语言协程。这允许您的查询用挂起修饰符进行注释,然后从协程或另一个挂起函数调用。 Dao接口如下: 为什么<code>getAlp

  • 1. 分析报告 怎么理解当日留存? 当日留存是指在当天满足了初始条件后,后续行为又满足了留存条件的用户数或访问次数。例如,当初始条件与留存条件均为用户有访问行为时,当日留存可以理解为:当日至少有个两次访问行为的用户情况。 怎么查看周留存和月留存? 在留存分析报告界面切换右上角留存粒度控件,可选日留存、周留存和月留存进行查看。 为什么漏斗分析中事件次数与事件分析不一致? 首先,您可以查看右上角的采样

  • 可视化圈选怎么判断连接手势是否触发 Q:可视化圈选怎么判断连接手势是否触发? A:打开app之后,如果您的App有启动广告页,则等待广告页过去之后,使用双指同时touch按住屏幕3s,看到界面中出现设备型号选项,即说明成功触发连接操作。 您还可以查看Xcode窗口输出的log日志,查看连接的返回结果 百度移动统计如何导出数据报表? Q:百度移动统计如何导出数据报表? A:在各报表页,点击“导出CS

  • 说明 这里仅做最简单使用方法的说明,个性化设置请查阅进阶开发。 所有平台的授权登录调用方法都是一样的,唯一不同的是实例化的类!如果有个性化的参数需要传,采用类属性赋值的方式传递,详见文档。 实例化 $qqOAuth = new \Yurun\OAuthLogin\QQ\OAuth2('appid', 'appkey', 'callbackUrl'); 把上面3个参数替换成你的即可。 Swoole