2016-02-28 4 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() на немонтированном компоненте. Это не-op. Проверьте код для компонента TabBarItem.

Я не уверен, что мне не хватает.

ответ

1

Это, возможно, придется делать с вашим методом navigateToAuthScreen().

В основном, вы меняете сцену в событии lifecycle компонента componentWillReceiveProps, что приводит к отключению компонента. Но React по-прежнему переживает события жизненного цикла и где-то называется setState. Я не уверен, как это работает под капотом, но кажется, что размонтер вызывается до того, как он закончил предыдущие жизненные циклы до render().

У меня было такое же предупреждение при использовании Navigator, я установил рабочий экран, прежде чем я проверил состояние входа, если я не был зарегистрирован, я бы поменялся на экран входа в систему.

Я установил его, открыв всплывающее окно при запуске приложения, убедитесь, что все мои магазины и состояния входа и т. Д. Были инициализированы перед экранами рендеринга.

+0

Я застрял в той же ситуации из-за навигатора, вы можете уточнить, как это исправить. –

1

Я столкнулся с этой ошибкой при использовании встроенных функций для события click, как вы это делали.

Пожалуйста, попробуйте извлекая свой onPress-Handler:

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

это было его предложение, и не помогло –

Смежные вопросы

 Смежные вопросы