javascript - ReactJS 使用异步 setState 更新状态的最佳方法

标签 javascript reactjs

我最近开始使用reactjs,我知道 setState() 是异步的,但是如果我有下面的代码:

// the state is an object

const [addressState, setAddress] = useState({
  adrStNumber: null,
  adrStreet: null,
  adrCity: null,
  adrState: null,
  adrZipcode: null,
  adrCountry: null
})
// this function is called when I select an option in the input

function getAddressAndSaveToState(address) {
    address.map(adr => {
      if (adr.types.includes('street_number')) {
        const adrStNumber = adr.long_name
        setAddress({ ...addressState, adrStNumber: adrStNumber })
      }

      if (adr.types.includes('route')) {
        const adrStreet = adr.long_name
        setAddress({ ...addressState, adrStreet: adrStreet })
      }

      if (adr.types.includes('administrative_area_level_1')) {
        const adrState = adr.long_name
        setAddress({ ...addressState, adrState: adrState })
      }
    })
  }

太好了,在第一个 if 之后,我们的状态如下:

{
  adrCity: null
  adrCountry: null
  adrStNumber: "65"
  adrState: null
  adrStreet: null
  adrZipcode: null
}

但是因为 setState 是异步的,所以第二个 if ...addressState 仍然是其初始值(上次迭代的 adrStNumber 为 null),因此迭代后状态将如下所示:

{
  adrCity: null
  adrCountry: null
  adrStNumber: null
  adrState: "New York"
  adrStreet: null
  adrZipcode: null
}

在这个例子中,每次有一个 if 迭代,我都需要向我的状态对象添加一些东西。实现这样的事情的最佳方法是什么?

最佳答案

您可以在函数体内构建对象,并在检查所有 if 后将其分配给状态。如下所示:

// this function is called when I select an option in the input

function getAddressAndSaveToState(address) {
    address.map(adr => {
      let newAddress = {...addressState}
      if (adr.types.includes('street_number')) {
        const adrStNumber = adr.long_name
         newAddress.adrStNumber = adrStNumber
      }

      if (adr.types.includes('route')) {
        const adrStreet = adr.long_name
        newAddress.adrStreet = adrStreet
      }

      if (adr.types.includes('administrative_area_level_1')) {
        const adrState = adr.long_name
        newAddress.adrState = adrState
      }

      setAddresss(newAddress)
    })

关于javascript - ReactJS 使用异步 setState 更新状态的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472616/

相关文章:

javascript - 如果重构,重构 AJAX 调用将不起作用

javascript - ReactJS - .setState 成功调用后其他属性变得未定义

php - React+Laravel 5.8.33 +Axios : errors when registering user with an axios. post请求;澄清代码问题

reactjs - AudioWorklet错误: DOMException: The user aborted a request

javascript - 如何仅使用javascript获取框索引号

javascript - 观看位置 Ionic 3

javascript - 响应式 jquery 处于非事件状态

javascript - 如何呈现一个列表/网格行,就好像它是粘性的?

javascript - 如何从 React 中的购物车状态中删除未选中的项目

javascript - socket.io 分配自定义 socket.id