У меня есть приложение React Native, использующее среду Redux, и я использую компонент Navigator для обработки навигации. У меня было немного проблем с работой навигации, и я не могу найти хороших примеров того, как это сделать правильно, поэтому я ищу какую-то помощь и разъяснения.
Вот суть того, что у меня сейчас есть, но я не знаю, правильно ли я делаю это:
Корневой компонент
...
renderScene(route, navigator) {
console.log('RENDER SCENE', route);
const Component = route.component;
return (
<Component navigator={navigator} route={route} {...this.props} />
)
}
render() {
return (
<Navigator
renderScene={(route, nav) => this.renderScene(route, nav)}
initialRoute={{ name: 'Signin', component: Signin }} />
)
}
Компонент Signin
...
componentWillReceiveProps(nextProps) {
if (!this.props.signedIn && nextProps.signedIn) {
console.log('PUSHING TO MAIN');
nextProps.navigator.push({ name: 'Main', component: Main });
}
}
Вопросы:
1: Моя первая мысль здесь состоит в том, что я, вероятно, должен переместить код navigator.push
в действие. Однако есть ли componentWillReceiveProps
подходящее место для вызова действия? Когда компонент Signin
загружается, он запускает действие для входа в пользователь, если у них уже есть активный сеанс. По умолчанию они не подписаны, поэтому, когда появляются следующие реквизиты, я проверяю, изменилось ли это значение, а затем нажмите на Main
.
2: В моем журнале консоли сразу после записи "PUSH TO MAIN" я вижу два журнала "RENDER SCENE":
[info] 'RENDER SCENE', { name: 'Signin', component: [Function: Signin] } (EXPECTED)
[info] 'PUSHING TO MAIN'
[info] 'RENDER SCENE', { name: 'Signin', component: [Function: Signin] } (WHY?)
[info] 'RENDER SCENE', { name: 'Main', component: [Function: Main] }
Мне любопытно, почему RENDER SCENE вызывается дважды (первый из них является компонентом Signin
), если я нажимаю только компонент Main
.
Изначально в методе componentWillReceiveProps
я проверял только:
if (nextProps.signedIn) {
nextProps.navigator.push({ name: 'Main', component: Main });
}
но это привело к тому, что компонент Main
был нажат дважды.