2016-02-28 64 views
0

我有以下代碼:reactJs警告:的setState(...):只能更新一安裝或安裝組件

class MainScreen extends Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     selectedTab: 'news' 
    }; 
    } 

    componentWillMount() { 
    this.props.dispatch({ 
     type:'isLoggedIn', 
     isLoggedIn: false 
    }) 
    } 

    shouldComponentUpdate() { 
    console.log('shouldComponentUpdate: --------') 
    return false; 
    } 

    navigateToAuthScreen() { 
    this.props.navigator.immediatelyResetRouteStack([ 
     rootRoutes.authScreen 
    ]); 
    } 

    componentWillReceiveProps(nextProps) { 
    console.log('componentWillReceiveProps: ----'); 
    if (!nextProps.isLoggedIn) this.navigateToAuthScreen(); 
    } 

    render() { 
    console.log('rending: ----------------------'); 
    return (
    <View style={styles.container}> 
     <TabBarIOS tintColor={theme.accentColor} translucent> 
     <Icon.TabBarItem 
      iconName="newspaper-o" 
      title="News" 
      selected={this.state.selectedTab === 'news'}> 
      <SceneStack 
      initialRoute={newsRoutes.newsListing} 
      /> 
     </Icon.TabBarItem> 
     </TabBarIOS> 
    </View> 
    ); 
    } 
} 

更新:

我發現這個錯誤有什麼以某種方式處理TabBarIOS和Icon.TabBarItem。

我已經完全刪除onPress={() => this.switchTabsOrPopStack('news')}和錯誤還是發生了。

我收到此錯誤:

警告:的setState(...):只能更新一安裝或安裝組件。這通常意味着您在卸載的組件上調用了setState()。這是一個沒有操作。請檢查TabBarItem組件的代碼。

我不知道我錯過了什麼。

回答

1

它可能與你的navigateToAuthScreen()方法來做給出的組件名稱。

基本上,你在componentWillReceiveProps生命週期事件,這將導致組件卸載改變場景。但React仍然在經歷生命週期事件,並在某處稱爲setState。我不確定它是如何工作的,但它似乎在它完成之前的生命週期直到render()之前調用卸載。

我使用導航儀時有同樣的警告,我安裝了主屏幕之前我檢查登錄狀態,如果我沒有登錄,我會換一個登錄界面。

我通過在應用程序啓動時顯示啓動屏幕來確定它,確保在渲染屏幕之前初始化我的所有商店和登錄狀態等。

+0

因爲導航器,我陷入了相同的情況,你可以詳細說明如何解決這個問題。 –

1

我一直在使用內聯函數時單擊事件像你這樣遇到此錯誤。

請嘗試提取您的onPress處理程序:

onPress() { 
    this.setState({selectedTab: 'news'}); 
} 

而在你的onPress:

onPress={this.onPress.bind(this)} 
+0

我已經刪除onPress完全和我仍然得到相同的錯誤.. –

1

你可以嘗試返回了 'shouldComponentUpdate' 真。

shouldComponentUpdate() { 
console.log('shouldComponentUpdate: --------'); 
return true;} 
3

有一個非常快速解決這個有點模糊的錯誤,這將給你有違規成分完整的堆棧跟蹤。只要把下面的代碼到您的控制檯,並試圖重現錯誤:

var warn = console.warn; 
    console.warn = function(warning) { 
    if (/(setState)/.test(warning)) { 
     throw new Error(warning); 
    } 
    warn.apply(console, arguments); 
    }; 

我有一種感覺分量呈現問題與驚喜你,我相當肯定,問題不在於所提供的代碼,尤其是因爲你沒有在提供的代碼中設置狀態。

+0

嘗試沒有工作 –

+0

@NetaMeta它沒有提供一個更長的堆棧跟蹤控制檯? –

+0

它已經提供它,並沒有幫助 –

相關問題