createStackNavigator
提供APP屏幕之间切换的能力,它是以栈的形式还管理屏幕之间的切换,新切换到的屏幕会放在栈的顶部。html
默认状况下,createStackNavigator提供了转场过渡效果,在Android和iOS上过渡效果是不一样的,这也是React Native重平台性的一个体现,在Android上从屏幕底部淡入,在iOS上是从屏幕的右侧划入,固然你也能够经过配置让StackNavigator支持屏幕从底部滑入的效果。react
createStackNavigator(RouteConfigs, StackNavigatorConfig):
微信
RouteConfigs
(必选):路由配置对象是从路由名称到路由配置的映射,告诉导航器该路由呈现什么。StackNavigatorConfig
(可选):配置导航器的路由(如:默认首屏,navigationOptions,paths等)样式(如,转场模式mode、头部模式等)。从createStackNavigator API上能够看出createStackNavigator
支持经过RouteConfigs
和 StackNavigatorConfig
两个参数来建立createStackNavigator导航器。app
RouteConfigs支持三个参数screen
、path
以及navigationOptions
;函数
screen
(必选):指定一个 React 组件做为屏幕的主要显示内容,当这个组件被createStackNavigator加载时,它会被分配一个navigation
prop。学习
path
(可选):用来设置支持schema跳转时使用,具体使用会在下文的有关Schema
章节中讲到;ui
navigationOptions
(可选):用以配置全局的屏幕导航选项如:title、headerRight、headerLeft等;this
从react-navigation
源码中能够看出StackNavigatorConfig支持配置的参数有10个。spa
function createStackNavigator(routeConfigMap, stackConfig = {}) { const { initialRouteKey, initialRouteName, initialRouteParams, paths, navigationOptions, disableKeyboardHandling, getCustomActionCreators } = stackConfig; ...
这7个参数能够根据做用不一样分为路由配置、视图样式配置两类,首先看用于路由配置的参数:code
用于路由配置的参数:
Schema
章节中讲到。用于导航样式配置的参数:
mode: 页面切换模式: 左右是card(至关于iOS中的push效果), 上下是modal(至关于iOS中的modal效果)
headerMode: 导航栏的显示模式: screen: 有渐变透明效果, float: 无透明效果, none: 隐藏导航栏。
headerBackTitleVisible : 提供合理的默认值以肯定后退按钮标题是否可见,但若是要覆盖它,则可使用true或` false 在此选项中。
cardStyle: 样式(iOS上页面切换会有白色渐变蒙层,想去掉则能够这样设置,cardStyle: { opacity: null },切换页面时的页面边框也在这里能够设置)。
onTransitionStart: 页面切换开始时的回调函数 (咱们能够在这里注册一些通知,告知咱们切面切换的状态,方便后面处理页面切换事件)。
onTransitionEnd: 页面切换结束时的回调函数。
支持一下参数:
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 } });
步骤一的代码中经过两种方式配值了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', }; ...
export default class HomePage extends React.Component { //在这里定义每一个页面的导航属性 static navigationOptions = { title: 'Home', headerBackTitle:'返回哈哈',//设置返回此页面的返回按钮文案,有长度限制 } render() { const {navigation} = this.props; return <View style=> <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' }
;
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=> <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();
实现了返回上一页