React 状态未更新,尝试使用 ES6 语法

Posted

技术标签:

【中文标题】React 状态未更新,尝试使用 ES6 语法【英文标题】:React state is not updating, trying to use ES6 syntax 【发布时间】:2020-03-25 18:54:09 【问题描述】:

为什么状态没有更新?我已检查我是否以正确的形式从 api 接收数据。如果我更改结果而不是尝试将其添加到新数组并将其置于状态,我可以打印结果。我还检查了它是否存在于范围内,据我所知,它应该可以工作,因为我使用的是箭头函数。在 map 函数之后我仍然收到一个空数组。

我错过了什么?

class CurrencyForm extends React.Component 
  state = 
    currencies: [],
  
  componentDidMount()
   this.fetchCurrencies();
  

  fetchCurrencies = async () => 
    const response = await axios.get('some address')
    response.data.map(currency => 
    this.setState(currencies: [...this.state.currencies,currency.id]
    ))
   

【问题讨论】:

难道你不想做类似this.setState( currencies: response.data ); 的事情吗?您的代码似乎不正确,因为您正在映射每个响应数据元素并调用 setState 也许这是一个糟糕的解决方案,但我收到的数据是多个 JSON 对象的形式,我只想显示一个对象中的一个值。 @DanielDunér 检查我的答案,您可以将代码减少到一个 setstate 调用 【参考方案1】:

问题是您使用的是[...this.state.currencies, currency.id]

由于setState 也是异步的,因此地图的每次迭代的状态都不会改变。所以你总是使用相同的this.state.currencies。这意味着您应该只添加最后一个 currency.id

您应该使用setState的函数版本

this.setState((state) => (currencies: [...state.currencies,currency.id]));

或者简单地执行map 并使用结果数组来设置状态

fetchCurrencies = async () => 
    const response = await axios.get('some address');
    const currencyIds = response.data.map(currency=>currency.id);
    this.setState(currencies: [...this.state.currencies,...currencyIds]

【讨论】:

谢谢,我发现我所做的事情有问题。这为我解决了。 哦,是的。这让我想起了为什么我切换到 vue.js。【参考方案2】:

如果您想将所有 id 放入状态中.. 而不是多次调用 setState,您可以先将所有 id 放入一个数组中,然后使用该数组更新状态,如下所示:

fetchCurrencies = async () => 
const response = await axios.get('some address')
const idsArray = response.data.map(currency => currency.id)
this.setState(currencies: idsArray)

请记住 setState 是一个异步调用,因此如果您将 console.log 放在 setState 之后,您可能无法看到结果,而是尝试在您的渲染方法中登录控制台

【讨论】:

map 函数返回一个数组,如果你要使用push,我建议你改用forEach。 @Gabriele 的回答有正确的做法。 是的,我们也可以直接使用 assign .. 可能这是更好的方法,我现在将编辑

以上是关于React 状态未更新,尝试使用 ES6 语法的主要内容,如果未能解决你的问题,请参考以下文章

ES6/React:为啥我的三重嵌套 setState 更新不起作用?

警告:无法对未安装的组件执行 React 状态更新

React Native - 无法对未安装的组件执行 React 状态更新,使用Effect 清理功能

在 Apollo 客户端中使用 react-router 返回时 React 未更新其状态

反应钩子。无法对未安装的组件执行 React 状态更新

路由器事件在构造函数上使用时会导致错误警告:无法对未安装的组件执行 React 状态更新