javascript - React setState 清空旧状态

标签 javascript reactjs

我遇到了问题,正在寻求帮助。 我有一个名为 mapRanks 的函数。它在 componentWillMount 中被调用,并且基本上通过字符串数组使用 map 元素的 setState 进行调用。它适用于一个数组,但我需要使用多个不同的数组多次运行它。

发生的情况是,除了最后一个状态之外,所有先前的状态都变成了 array[0]

请看一下:

export const mapRanks = (options, ranks, count, element) => {
  component = options.component;   // this component
  group = options.group;           // can be 'mapFirst', 'mapSecond', ...
  let col = count;
  let j = count;
  let k = count;

  const map = ranks.map((rank, i) => {
    if (i === col) {
      col = col + j--;
      if (j === 0) {
        j = k--;
      }
      return [element(i, group, rank), <div key={ i } className="clearfix"></div>];
    }
    return [element(i, group, rank)];
  });

  const newState = update(component.state, { maps: { [group]: { $set: map } } });
  component.setState(newState);

  setTimeout(() => { console.log(component.state.maps); }, 7000);
};

我的状态如下所示:

  constructor() {
    super();
    this.state = {
      maps: {
        mapFirst: [],
        mapSecond: [],
        mapThird: [],
        mapFourth: [],
      },
    };
  }

另外,我不认为它相关,但我想知道...您看到上面的 console.logsetTimeout 了吗?我必须使用 setTimeout 因为状态返回 array[0] 但使用 setTimeout 时,它返回整个元素数组。这是为什么?

编辑:我想我发现了问题。

  componentWillMount() {
    mapRanks(
      { component: this, state: 'mapFirst' }, ranksFirst, 9, element
    );
    mapRanks(
      { component: this, state: 'mapSecond' }, ranksSecond, 8, element
    );
  }

当我添加第二个 mapRanks 时,返回的两个(两个)console.log 具有 mapFirst[0] mapSecond[165]..我还是不明白为什么。

第二次编辑:我修复了它但是...

我为第二个 mapRanks 函数调用添加了 setTimeout,现在它可以工作了。我需要一个更好的解决方案。请帮忙。

最佳答案

There is no guarantee of synchronous operation of calls to setState and calls may be batched for performance gains.

不是更新状态,而是在每次调用 setState 时比较 DOM 并呈现更改,React 将尝试将调用批处理在一起,并在下一次重绘之前执行它们,这样您的代码就不会阻塞 UI。

这意味着 setState can be asynchronous ,因此如果您想等待状态更改后再访问它,则需要传递回调函数。

component.setState(newState, () => {
  console.log(component.state.maps);
});

关于javascript - React setState 清空旧状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38156105/

相关文章:

reactjs - this.setState() 在 componentWillReceiveProps 中不起作用

javascript - AngularJS:无法使用缩小的 angularjs javascript 显示模型对话框

javascript - 将我在 Google Analytics 中的目标 url 与正则表达式匹配

javascript - 使用 JavaScript 返回 DOM 元素的所有子元素

javascript - document.querySelectorAll ":not"内的条件不起作用

reactjs - 访问react-router动态段时崩溃

javascript - 使用 webpack 动态加载 javascript block 并 react 路由器

javascript - Flux:顶级 View 不应为 "dump"(不从存储中获取数据)

javascript - 动态添加文本框和文本区域

reactjs - 使用 ESLint 保存时格式化文件