当前位置: 首页 > 知识库问答 >
问题:

为什么我会得到“引用前一个状态时在setState中使用回调”?

法和硕
2023-03-14

我正在学习React,并且在我的项目中安装了ESLint。它开始给我一些错误,比如:

在setState中引用之前的状态react/no access状态时,在setState中使用回调

在我的React组件中,我有一个构造函数

  constructor() {
    super()
    this.state = {
      currentIdVehicle: null,
      currentIdModel: null,
      currentIdVehicleFinal: null,
      marca: [],
      veiculo: [],
      modeloEAno: [],
      vehicleFinal: [],
      infoTable: [],
    };
  }

在我的职能中,我有:

  getMarca = () => {
    this.setState({ marca: [], veiculo: [], modeloEAno: [] });
    api.get(`/marcas.json`).then(res => {
      res.data.map((item) => {
        const joined = this.state.marca.concat([
          { name: item.name, id: item.id },
        ]);
        this.setState({ marca: joined });
      });
    });
  };

我理解在setState中使用this.state是不正确的,但我如何解决此错误?

共有2个答案

皇甫高阳
2023-03-14

如果必须改变状态(例如添加项目),则可以将函数传递到setState,该函数接收上一个状态并返回下一个状态:

  this.setState(previousState => ({ marca: [...previousState.marca, { name: item.name, id: item.id }] }));

一次添加所有项目会更快,不过:

 this.setState(previousState => ({
   marca: [
    ...previousState.marca,
    ...res.data.map((item) => ({ name: item.name, id: item.id }))
   ],
 }));
庄兴发
2023-03-14

而不是这样:

      res.data.map((item) => {
        const joined = this.state.marca.concat([
          { name: item.name, id: item.id },
        ]);
        this.setState({ marca: joined });
      });

这样做:

      res.data.map((item) => this.setState(prevState => {
        const joined = prevState.marca.concat([
          { name: item.name, id: item.id },
        ]);
        return({ marca: joined });
      }));

您不应该直接或间接引用this.state在您最终传递给this.setState的内容中。

 类似资料:
  • 问题内容: 好的,我会尽快解决这个问题,因为它应该很容易解决… 我读过很多类似的问题,答案似乎非常明显。首先,我不需要查找任何内容!但是…我有一个错误,我无法理解如何修复或为什么会发生。 如下: 与此相关的代码更多,但这就是我的问题所在。应该工作吧? 我也尝试过这个: 所以我有这两个,两者应该相同。我实际上是将状态设置为与其上方的行相同! 但是它总是返回与应有的相反的结果。 我用的时候也一样; 如

  • 好吧,我会尽快解决的,因为这应该是一个很容易的解决办法... 我读过一堆类似的问题,答案似乎相当明显。从一开始我就不用抬头看了!但是...我有一个错误,我无法理解如何修复或为什么它会发生。 具体如下:

  • 问题内容: 我的Express Server中有这个。 调用此函数: 正在调用courtsAmount函数。但是,在我的客户看来,我没有得到重用。相反,我只是得到一个空对象。 我认为这与我有一个回调有关,因此在实际触发之前发送了一个空对象。 我该如何解决这个问题? 问题答案: 您的courtsAmount不返回任何内容。相反,您应该在其中使用回调(或Promise)来执行以下操作: 和

  • 问题内容: React有一个叫做useState的钩子,在向功能组件添加状态时使用。 该挂钩API参考状态: useState : 返回一个有状态值,以及一个更新它的函数。 在初始渲染期间,返回的状态()与作为第一个参数()传递的值相同。 该功能用于更新状态。它接受一个新的状态值并排队重新呈现组件。 该阵营文档状态: 作为论点我们要传递什么? 挂钩的唯一参数是初始状态。与类不同,状态不必是对象。如

  • 问题内容: 我正在阅读reactjs文档的Forms部分,只是尝试了这段代码来演示用法(JSBIN)。 在浏览器中更新值时,回调内的第二个与第一个相同,为什么在回调范围内看不到结果? 问题答案: 从React的文档中: 不会立即变异,但会创建待处理的状态转换。调用此方法后进行访问可能会返回现有值。无法保证对呼叫的同步操作,并且可以为提高性能而对呼叫进行批量处理。 如果要在状态更改发生后执行某个函数

  • 问题内容: 我正在使用托管在Google App Engine上的Java,Jetty和Jersey 2.18(目前最新)。 假设我有一项服务 当我做: 我正确地收到了一个application / json内容类型和主体。但是当我这样做时: 与返回任何4XX或5XX状态相同,我收到一个text / html内容类型以及以下HTML正文: 而不是我放入.entity()的对象 编辑:这是我的web