javascript - 上一篇状态不一致

标签 javascript reactjs redux

我正在尝试将thumbnail URL 添加到我的缩略图状态数组中。但为了防止无限循环,我试图将先前的状态与当前的状态进行比较。但是,当这样做时,先前的状态会继续引用状态对象吗?我需要的数组是显示 Explore 第 35 行的数组。理想情况下,我认为这将是当前状态,因为这就是它正在打印的内容。

enter image description here

构造函数

constructor(props) {
    super(props);
    this.props.getVideos();
    this.state = {
      thumbnail: []
    };
  }

ComponentDidUpdate

componentDidUpdate(prevState) {
    console.log("Current State->" + this.state.thumbnail);
    console.log("Previous State->" + JSON.stringify(prevState.videos));
    // console.log("Previous State->" + prevState.videos.video);
    if (this.props.videos == null) {
      console.log("It's null");
    } else {
      if (this.state !== prevState) {
        const videos = this.props.videos.video.map(video => {
          this.setState(prevState => ({
            thumbnail: prevState.thumbnail.concat(video.thumbnail)
          }));
          console.log(this.state.thumbnail);
        });
      }
    }
  }

reducer 片段

case GET_VIDEOS:
  return {
    ...state,
    videos: action.payload,
    loading: false
  };

最佳答案

我可以立即看到的几个问题:

  1. if (this.state !== prevState) 不是比较旧状态与新状态的有效方法。他们只是将它们的引用作为变量进行比较(它们总是不同的) - 而不是它们的内容。为了正确地做到这一点,您需要一一比较每个状态变量。要么使用一个库,例如 lodash 的 _isEqual,要么实现您自己的解决方案(如果您的状态很小,这是个好主意)。

  2. setState() 之后执行 console.log(this.state.thumbnail); 实际上会打印之前的值,因为 setState( ) 是异步的。相反,请将日志放入 setState() 的回调参数中:

    this.setState(prevState => ({
      thumbnail: prevState.thumbnail.concat(video.thumbnail)
    }), () => console.log(this.state.thumbnail));
    

关于javascript - 上一篇状态不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51481413/

相关文章:

javascript - 我应该如何传递我的 Prop 以获得有效的 Array[Object]

PHP 文件 - 使用数据库问题中的值填充动态 <select> 标记

javascript - 回调之上的回调

javascript - 使用scrapy从网页中提取js数据

reactjs - 如果将 Font Awesome 放置在串联文本旁边,则会呈现 "[object object]"

javascript - 无法删除边框底部

javascript - React 提升状态

reactjs - MapDispatchToProps 在父组件中导致 Typescript 错误,期望 Actions 作为 props 传递

reactjs - React 测试,我是否在浪费时间尝试不使用 Redux?

返回 NAN 的 Javascript 原型(prototype)函数