React Native - 第二次挂载时出现 setState 警告

Posted

技术标签:

【中文标题】React Native - 第二次挂载时出现 setState 警告【英文标题】:React Native - setState Warning on second mount 【发布时间】:2016-06-25 00:31:55 【问题描述】:

请检查以下代码:

componentDidMount() 
    /*
     * Add listener
     * The User has search for a team
     */
    teamStore.addChangeListener("SEARCH_TEAMS", this.updateTeams.bind(this));


componentWillUnmount() 
    /*
     * Remove Listener and clear the Store
     */
    teamStore.removeChangeListener("SEARCH_TEAMS", this.updateTeams);
    teamStore.resetTeams();


/*
 * The API has find some new teams
 * Update the state and show the new teams in the listview
 */

updateTeams() 
    var ds = new ListView.DataSource(rowHasChanged: (r1, r2) => r1 !== r2);
    this.setState(dataSource: ds.cloneWithRows(teamStore.getAllTeams()));

信息:SEARCH_TEAMS Event 由另一个 Component 触发。

如果我第一次渲染组件一切正常。但是,如果我弹出页面并在此页面上再次导航,我会收到以下警告:

警告:setState(…) 只能更新挂载或挂载的组件…

【问题讨论】:

【参考方案1】:

您没有正确清除事件侦听器,因为给出了不同的函数引用。这使您的事件侦听器继续侦听并在其中调用 setState。

这里有一个修复:

componentDidMount() 
    // Save the function you want to listen with so you can remove it later
    this.updateTeamsBound = this.updateTeams.bind(this);
    teamStore.addChangeListener("SEARCH_TEAMS", this.updateTeamsBound);


componentWillUnmount() 
    teamStore.removeChangeListener("SEARCH_TEAMS", this.updateTeamsBound);
    teamStore.resetTeams();

【讨论】:

以上是关于React Native - 第二次挂载时出现 setState 警告的主要内容,如果未能解决你的问题,请参考以下文章

构建失败'配置项目':react-native-reanimated'时出现问题。在 React 原生项目中

编译android时出现React-native-camera错误

安装 react-native-vector-icons 时出现 React Native iOS 构建问题

使用 react-native run-android 运行时出现 React-Native 错误

构建 Android React Native 时出现错误的网关

配置项目“:react-native-gesture-handler”时出现问题