警告:setState(...):只能更新已安装或安装的组件

时间:2016-12-12 03:42:28

标签: javascript reactjs react-native ecmascript-6 setstate

我无法摆脱这个错误。当我从我的数组中删除一个项目并更新状态时,就会发生这种情况。

经过一些调试后,我发现如果我重新加载应用程序,直接进入此屏幕并删除,则不会显示错误。 但是,如果我导航到此屏幕,返回,再次转到此屏幕,然后删除,将出现错误。如果我加载屏幕10次,我会得到(30)这样的错误。

我的猜测是,当流行路线返回仪表板时,我没有关闭firebase连接。或者我正在使用的导航器没有正确卸载场景。或者deleteRow()函数

有问题

我真的不知道我能做什么..同样的问题在网上,但似乎不适用于我的情景。

ffmpeg

3 个答案:

答案 0 :(得分:2)

问题是他们提到的,但没有提供解决方案。 经过一段时间和一些外部帮助,这解决了我的问题: 只需删除监听器即可。

  componentWillUnmount() {
    this.itemsRef.off(); // this line
    this.connectedRef.off('value', this.handleValue);
  }

答案 1 :(得分:1)

我不确定它是否导致您出错但是这是一个错误,您需要绑定您的事件处理程序,最好是在您的构造函数中,因为您要取消绑定(删除事件侦听器),您需要引用相同的功能。

constructor(props) {
    super(props);
    this.state = {
      dataSource: new ListView.DataSource({
        rowHasChanged: (row1, row2) => row1 !== row2,
      }),
    };

    const user = firebase.auth().currentUser;
    if (user != null) {
      this.itemsRef = this.getRef().child(`Stores/${user.uid}/`);
    } else {
      Alert.alert('Error', 'error!');
    }
    this.connectedRef = firebase.database().ref('.info/connected');
    this.handleValue = this.handleValue.bind(this) // here added
  }

希望它有效,也解决你的问题。

答案 2 :(得分:1)

您没有关闭所有的事件处理程序。

您可以在函数'value'内的itemsRef对象上为listenForItems()事件创建事件处理程序。该事件处理程序调用{​​{1}}。该特定事件处理程序未被关闭,这意味着每个后续数据库事件都会调用回调函数,该函数会尝试在旧(未安装)组件上调用setState()

您应该关闭setState()中的所有事件处理程序,因此:

componentWillUnmount()