componentDidMount中呼叫setState很容易导致React Native 0.16出错。



  • 学习仿照tony612/react-native-demo,但是现在React Native推荐用ListView,重写后工作正常,但是只要输入几个字符(尤其快速输入情况下),就很容易出现下面报错(模拟器真机都会出现问题),不知道是哪里写的不对?

    0_1449403695819_rn_error.png

    相关代码如下:

      componentWillMount: function() {
        this.updateUI();
      },
    
      componentDidMount: function() {
        IssueStore.addChangeListener(()=> this.updateUI());
      },
    
      updateUI() {
        const issues = IssueStore.getIssues();
        this.setState({
          dataSource: this.state.dataSource.cloneWithRows(issues)
        });
      },
    

    感兴趣的同学可以clone代码下来,自行实验,真的是好奇怪啊。。



  • 此回复已被删除!


  • @ericguo 说:
    我没有运行你这个项目,根据你的描述(“尤其快速输入情况下”),猜测可能是ListView无法在实时输入的情况下快速Relayout。我猜是要实现一个搜索提示?建议加入一个延时设置试试,比如300ms后再根据当前的输入setState。如果用户一直快速输入,则一直延迟,直到用户输入停下来300ms后再触发。



  • 其实速度也不快,真的很容易出现错误,我对React的component生命周期不熟,猜测是否IssueStore.addChangeListener不应该写在componentDidMount里面?(不过这样tony612就错啦。。。)



  • 我倒是觉得这个和addListener的时机无关,从stack上来看明显是个Java错,楼主最好能打开adb log,把实际的Java异常连通stack一起贴出来。 我这周在外地网络不便,周末之后可以抽空调试一下你的工程看看能否发现问题:)