React Native Navigation 在登录后导航到主页时调用所有屏幕 componentDidMount/componentWillMount
Posted
技术标签:
【中文标题】React Native Navigation 在登录后导航到主页时调用所有屏幕 componentDidMount/componentWillMount【英文标题】:React Native Navigation invoke all screens componentDidMount/componentWillMount when navigated to Home after login 【发布时间】:2018-12-01 12:24:04 【问题描述】:解释:我登录并导航到主页,我发现它调用了两个屏幕(即主页和错误管理)的 componentDidMount 和 componentWillMount。我是不是做错了什么,我猜这是因为 Tabs 的错误。但无法解决。请帮我解决它。
从'react'导入反应,组件; 从'react-navigation'导入createStackNavigator,createDrawerNavigator,createMaterialTopTabNavigator; 从“反应导航”导入 DrawerActions ; 从 'react-native' 导入 View,Text,StyleSheet,Platform,TouchableOpacity,Image,StatusBar;
import Login from '../Login';
import Home from '../Profile';
import ErrorManagement from '../screen/error-management/ErrorManagement'
import DrawerScreen from '../DrawerScreen';
const Tabs = createMaterialTopTabNavigator(
Home: Home,
'Error Management':ErrorManagement
,
tabBarOptions:
scrollEnabled: true,
lazyLoad: true,
activeTintColor: '#000',
inactiveTintColor: 'gray',
style:
backgroundColor: '#fff',
,
tabStyle:
width: 210
,
indicatorStyle:
backgroundColor: '#000',
,
);
const DrawerNavigator = createDrawerNavigator(
Home:
screen: Tabs
,
initialRouteName: 'Home',
contentComponent: DrawerScreen,
drawerWidth: 300
);
const MenuImage = (navigation) =>
if(!navigation.state.isDrawerOpen)
return <Image source=require('../images/menu-button.png')/>
else
return <Image source=require('../images/left-arrow.png')/>
const Routes = createStackNavigator (
Login :
screen : Login,
navigationOptions: ( navigation ) => (
header: null
),
,
Home : screen : DrawerNavigator,
navigationOptions: ( navigation ) => (
title: 'Middle-Office', // Title to appear in status bar
headerLeft:
<TouchableOpacity onPress=() => navigation.dispatch(DrawerActions.toggleDrawer()) >
<MenuImage style="styles.bar" navigation=navigation/>
</TouchableOpacity>,
headerStyle:
backgroundColor: '#87ceeb',
,
headerTintColor: '#fff',
headerTitleStyle:
fontWeight: 'bold',
,
),
,
,
initialRouteName: 'Login'
);
export default Routes;
【问题讨论】:
【参考方案1】:createTabNavigator
接受了一个TabNavigatorConfig
选项lazy
,仅当用户在该选项卡上时才能使用该选项挂载和呈现选项卡。但是createMaterialTopTabNavigator
没有这样的选项。
但是您可以使用react-navigation
中的withNavigationFocus
来查看您的屏幕是否有焦点,然后您就可以完成所需的任务。
https://reactnavigation.org/docs/en/with-navigation-focus.html
但它仍然会一次挂载你的所有屏幕。
我在以下链接上创建了一个 HOC:
https://snack.expo.io/HkjVzm5-m
您可以看到它使用withNavigationFocus
并且仅在屏幕聚焦时才安装屏幕。但是有一个小问题,每次屏幕聚焦时都会重新安装屏幕。
但您只需稍加努力即可了解如何根据您的用例来完成它。
【讨论】:
lazy 与现在已弃用的 TabNavigator 配合得很好。有没有更具体的 createMaterialTopTabNavigator。【参考方案2】:lazy
选项也适用于 createMaterialTopTabNavigator
。
所以,只需在TabNavigatorConfig
的createMaterialTopTabNavigator
中添加lazy:true
属性。
它会起作用的:)
【讨论】:
以上是关于React Native Navigation 在登录后导航到主页时调用所有屏幕 componentDidMount/componentWillMount的主要内容,如果未能解决你的问题,请参考以下文章
无法从“App.js”解析“@react-navigation/native”-React Native + 如何解决?
从 React-native-navigation v1 到现有项目的 react-native-navigation v2
在 iOS 中将 react-native-navigation 与 react-native-callkit 集成
react-native-navigation如何在`shouldComponentUpdate`中检测当前屏幕