大家好,我是编程小6,很高兴遇见你,有问题可以及时留言哦。
createStackNavigator
提供APP屏幕之间切换的能力,它是以栈的形式还管理屏幕之间的切换,新切换到的屏幕会放在栈的顶部。
默认情况下,createStackNavigator提供了转场过渡效果,在Android和iOS上过渡效果是不同的,这也是React Native重平台性的一个体现,在Android上从屏幕底部淡入,在iOS上是从屏幕的右侧划入,当然你也可以通过配置让StackNavigator支持屏幕从底部滑入的效果。
createStackNavigator(RouteConfigs, StackNavigatorConfig):
RouteConfigs
(必选):路由配置对象是从路由名称到路由配置的映射,告诉导航器该路由呈现什么。StackNavigatorConfig
(可选):配置导航器的路由(如:默认首屏,navigationOptions,paths等)样式(如,转场模式mode、头部模式等)。从createStackNavigator API上可以看出createStackNavigator
支持通过RouteConfigs
和 StackNavigatorConfig
两个参数来创建createStackNavigator导航器。
提示:和本文配套的还有一个React Navigation3x的视频教程,欢迎学习。
RouteConfigs支持三个参数screen
、path
以及navigationOptions
;
screen
(必选):指定一个 React 组件作为屏幕的主要显示内容,当这个组件被createStackNavigator加载时,它会被分配一个navigation
prop。path
(可选):用来设置支持schema跳转时使用,具体使用会在下文的有关Schema
章节中讲到;navigationOptions
(可选):用以配置全局的屏幕导航选项如:title、headerRight、headerLeft等;从react-navigation
源码中可以看出StackNavigatorConfig支持配置的参数有10个。
function createStackNavigator(routeConfigMap, stackConfig = {}) {
const {
initialRouteKey,
initialRouteName,
initialRouteParams,
paths,
navigationOptions,
disableKeyboardHandling,
getCustomActionCreators
} = stackConfig;
...
这7个参数可以根据作用不同分为路由配置、视图样式配置两类,首先看用于路由配置的参数:
用于路由配置的参数:
Schema
章节中讲到。提示:和本文配套的还有一个React Navigation3x的视频教程,欢迎学习。
用于导航样式配置的参数:
支持一下参数:
export const AppStackNavigator = createStackNavigator({
HomePage: {
screen: HomePage
},
Page1: {
screen: Page1,
navigationOptions: ({navigation}) => ({
title: `${navigation.state.params.name}页面名`//动态设置navigationOptions
})
},
Page2: {
screen: Page2,
navigationOptions: {//在这里定义每个页面的导航属性,静态配置
title: "This is Page2.",
}
},
Page3: {
screen: Page3,
navigationOptions: (props) => {//在这里定义每个页面的导航属性,动态配置
const {navigation} = props;
const {state, setParams} = navigation;
const {params} = state;
return {
title: params.title ? params.title : 'This is Page3',
headerRight: (
<Button
title={params.mode === 'edit' ? '保存' : '编辑'}
onPress={() =>
setParams({mode: params.mode === 'edit' ? '' : 'edit'})}
/>
),
}
}
},
}, {
defaultNavigationOptions: {
// header: null,// 可以通过将header设为null 来禁用StackNavigator的Navigation Bar
}
});
提示:和本文配套的还有一个React Navigation3x的视频教程,欢迎学习。
步骤一的代码中通过两种方式配值了navigationOptions:
静态配置:
对Page2的navigationOptions配置是通过静态配置完成的:
Page2: {
screen: Page2,
navigationOptions: {//在这里定义每个页面的导航属性,静态配置
title: "This is Page2.",
}
},
这种方式被称为静态配置,因为navigationOptions中的参数是直接Hard Code的不依赖于变量。
动态配置:
对Page3的navigationOptions配置是通过动态配置完成的:
Page3: {
screen: Page3,
navigationOptions: (props) => {//在这里定义每个页面的导航属性,动态配置
const {navigation} = props;
const {state, setParams} = navigation;
const {params} = state;
return {
title: params.title ? params.title : 'This is Page3',
headerRight: (
<Button
title={params.mode === 'edit' ? '保存' : '编辑'}
onPress={() =>
setParams({mode: params.mode === 'edit' ? '' : 'edit'})}
/>
),
}
}
},
从上述代码中可以看出Page3的navigationOptions依赖于props这个变量所以是动态的,当props中的内容发生变化时,navigationOptions也会跟着变化;
提示:除了在创建createStackNavigator时配置navigationOptions外,在StackNavigator之外也可以配置navigationOptions;
createStackNavigator之外也可以配置navigationOptions
方式一:
Page2.navigationOptions = {
title: "This is Page2.",
};
方式二:
export default class Page1 extends React.Component {
//也可在这里定义每个页面的导航属性,这里的定义会覆盖掉别处的定义
static navigationOptions = {
title: 'Page1',
};
...
提示:和本文配套的还有一个React Navigation3x的视频教程,欢迎学习。
export default class HomePage extends React.Component {
//在这里定义每个页面的导航属性
static navigationOptions = {
title: 'Home',
headerBackTitle:'返回哈哈',//设置返回此页面的返回按钮文案,有长度限制
}
render() {
const {navigation} = this.props;
return <View style={{flex: 1, backgroundColor: "orange",}}>
<Text style={styles.text}>欢迎来到HomePage</Text>
<Button
title="Go To Page1"
onPress={() => {
navigation.navigate('Page1', {name: '动态的'});
}}
/>
<Button
title="Go To Page2"
onPress={() => {
navigation.navigate('Page2');
}}
/>
<Button
title="Go To Page3"
onPress={() => {
navigation.navigate('Page3',{ name: 'Devio' });
}}
/>
</View>
}
}
代码解析:
页面跳转可分为两步:
const {navigation} = this.props;
navigate(routeName, params, action)
进行页面跳转: navigation.navigate('Page2');
navigation.navigate('Page3',{ name: 'Devio' });
这里在跳转到Page3
的时候传递了参数{ name: 'Devio' }
;
提示:和本文配套的还有一个React Navigation3x的视频教程,欢迎学习。
export default class Page3 extends React.Component {
render() {
const {navigation} = this.props;
const {state, setParams} = navigation;
const {params} = state;
const showText = params.mode === 'edit' ? '正在编辑' : '编辑完成';
return <View style={{flex: 1, backgroundColor: "gray",}}>
<Text style={styles.text}>欢迎来到Page3</Text>
<Text style={styles.showText}>{showText}</Text>
<TextInput
style={styles.input}
onChangeText={text=>{
setParams({title:text})
}}
/>
<Button
title="Go Back"
onPress={() => {
navigation.goBack();
}}
/>
</View>
}
}
代码解析:
在上述代码中通过:
<TextInput
style={styles.input}
onChangeText={text=>{
setParams({title:text})
}}
/>
将输入框中内容的变化,通过setParams({title:text})
更新到页面的标题上,你会看到当输入框中内容发生变化时,标题也会跟着变。
当用户单击Go Back
按钮时,通过:
navigation.goBack();
实现了返回上一页;
类似上述的应用场景有很多,大家可以通过与本教程配套的最新版React Native+Redux打造高质量上线App视频教程进行进一步学习react-navigation的更多高级应用。