【问题标题】:React Native: How to go about using ShouldComponentUpdate with setInterval and setStateReact Native:如何将 ShouldComponentUpdate 与 setInterval 和 setState 一起使用
【发布时间】:2018-09-05 05:15:16
【问题描述】:

我正在使用 setInterval 的组合,它位于我的 componentDidMount 函数中,它从 API 获取数据并为获取的数据设置状态,并显示在我的 react-native-maps 上。问题是使用 setIntervalsetState 成本太高,因为地图必须每 5 秒重新渲染一次。

componentDidMount() {
    this.interval = setInterval(() => {
        api.getData().then((res) => {
            this.setState({
                data: res
            })
        });
    }, 5000);
}

我对此进行了研究,发现我应该使用houldComponentUpdate,但我无法让它工作,因为地图无法正确渲染,在不应该渲染的时候渲染,而不是在应该渲染的时候渲染。

shouldComponentUpdate(nextProps, nextState) {
    for(var i = 0; i < this.state.data.length; i++) {
        if(this.state.data[i].value !== nextState.data[i].value) {
            return true;
        }
    }
    return false;
}

我正在将我拥有的数据状态与下一个状态的数据i.e this.state.data !== nextState.data 进行比较,如果是,则返回 true。

我是否正确地解决了这个问题,所以这是 ShouldComponentUpdate 应该解决的问题,我只是没有正确编写该函数,还是应该专注于不同的解决方案?

【问题讨论】:

  • 你的数据里面有什么?
  • @FisNAN 数据是一个包含整数“value”属性和整数“time”属性的对象
  • 答案还取决于组件的props 和另一个state。我发布了一个答案,它可能不完全适合你的情况,但你应该明白了。

标签: javascript reactjs react-native setinterval setstate


【解决方案1】:

飞入shouldComponentUpdate的是:

  • 当组件收到新的props 时,您也会停止重新渲染
  • 如果nextState 的长度不同,您的方法不会检查它。在这种情况下,我们总是希望重新渲染

shouldComponentUpdate(nextProps, nextState) {
  // Just an example, you need compare actual parameter which inside props
  if (this.props !== nextProps) { 
    return true;
  }
  
  if (this.state.data.length !== nextState.data.length) {
    return true;
  }
  
  for (var i = 0; i < this.state.data.length; i++) {
    if (this.state.data[i].value !== nextState.data[i].value) {
      return true;
    }
  }
  return false;
}

【讨论】:

  • 感谢您的回复。我是 ReactNative 的新手,所以你能解释一下 this.props 和 nextProps 的比较,以及我们为什么需要它吗?
  • 在大多数情况下,当组件收到新的props 时,您不想停止重新渲染。但我没有看到你的组件。它收到任何道具吗?
  • 是的,确实如此。它接收各种道具,例如搜索栏建议、选定的搜索栏项目等。
  • @ZainBudhwani 那么你需要检查this.props中的每个键
  • 像this.props.suggestions !== nextProps.suggestions?谢谢,现在明白了!
猜你喜欢
  • 2021-12-09
  • 2022-11-29
  • 2020-06-19
  • 2020-08-02
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 2018-10-11
相关资源
最近更新 更多