原文链接:http://www.devio.org/2018/05/15/navigator-to-react-navigation/ react
导航器也能够当作一个是普通的React组件,你能够经过导航器来定义你的App的导航结构。 导航器还能够渲染通用元素,例如能够配置的标题栏和选项卡栏。数组
在react-navigation中有如下三种类型的导航器:app
注:你能够经过以上三种导航器来建立你APP,能够是其中一个也能够多个组合,这个能够根据具体的应用场景并结合每个导航器的特性进行选择。this
两个和导航关于概念:spa
Screen navigation prop(屏幕导航属性)
:经过navigation能够完成屏幕之间的调度操做,例如打开另外一个屏幕;Screen navigationOptions(屏幕导航选项)
: 经过navigationOptions能够定制导航器显示屏幕的方式(例如:头部标题,选项卡标签等);const SomeNav = StackNavigator/TabNavigator/DrawerNavigator({ // config }); <SomeNav screenProps={xxx} ref={nav => { navigation = nav; }} onNavigationStateChange=(prevState, newState, action)=>{ } />
ref
属性获取到navigation
;ref
属性以外,还接受onNavigationStateChange(prevState, newState, action)
属性,每次当导航器所管理的state
发生改变时,都会回调该方法;
当导航器中的屏幕被打开时,它会收到一个navigation
prop,navigation
prop是整个导航环节的关键一员,接下来就详细讲解一下navigation
的做用。3d
navigation包含一下功能:code
注意:一个navigation有可能没有navigate、setParams以及goBack,只有state与dispatch,因此在使用navigate时要进行判断,若是没有navigate可使用navigation去dispatch一个新的action。如router
const {navigation,theme,selectedTab}=this.props; const resetAction = NavigationActions.reset({ index: 0, actions: [ NavigationActions.navigate({ routeName: 'HomePage', params:{ theme:theme, selectedTab:selectedTab }, }) ] }) navigation.dispatch(resetAction)
export const AppStackNavigator = StackNavigator({ HomeScreen: { screen: HomeScreen }, Page1: { screen: Page1 }) class HomeScreen extends React.Component { render() { const {navigate} = this.props.navigation; return ( <View> <Text>This is HomeScreen</Text> <Button onPress={() => navigate('Page1', {name: 'Devio'})} title="Go to Page1" /> </View> ) } }
能够经过this.props.state.params来获取经过setParams()
,或navigation.navigate()
传递的参数。对象
<Button title={params.mode === 'edit' ? '保存' : '编辑'} onPress={() => setParams({mode: params.mode === 'edit' ? '' : 'edit'})} /> <Button title="Go To Page1" onPress={() => { navigation.navigate('Page1',{ name: 'Devio' }); }} /> const {navigation} = this.props; const {state, setParams} = navigation; const {params} = state; const showText = params.mode === 'edit' ? '正在编辑' : '编辑完成';
setParams: function setParams(params)
: 咱们能够借助setParams
来改变route params,好比,经过setParams
来更新页面顶部的标题,返回按钮等;class ProfileScreen extends React.Component { render() { const {setParams} = this.props.navigation; return ( <Button onPress={() => setParams({name: 'Lucy'})} title="Set title name to 'Lucy'" /> ) }
注意navigation.setParams改变的是当前页面的Params,若是要改变其余页面的Params能够经过NavigationActions.setParams完成,下文会讲到。blog
goBack: function goBack(key)
:咱们能够借助goBack
返回到上一页或者路由栈的指定页面。
key
表示你要返回到页面的页面标识如id-1517035332238-4
,不是routeName。navigation.state.key
来得到页面的标识。navigation.state {params: {…}, key: "id-1517035332238-4", routeName: "Page1"}
export default class Page1 extends React.Component { render() { const {navigation} = this.props; return <View style=> <Text style={styles.text}>欢迎来到Page1</Text> <Button title="Go Back" onPress={() => { navigation.goBack(); }} /> </View> } }
dispatch: function dispatch(action)
:给当前界面设置action,会替换原来的跳转,回退等事件。const resetAction = NavigationActions.reset({ index: 0, actions: [ NavigationActions.navigate({ routeName: 'HomePage', params:{ theme:theme, selectedTab:selectedTab }, }) ] }) navigation.dispatch(resetAction)
Navigatie action会使用Navigate action的结果来更新当前的state。
import { NavigationActions } from 'react-navigation' const navigateAction = NavigationActions.navigate({ routeName: 'Profile', params: {}, action: NavigationActions.navigate({ routeName: 'SubProfileRoute'}) }) this.props.navigation.dispatch(navigateAction)
Reset action删掉全部的navigation state而且使用这个actions的结果来代替。
import { NavigationActions } from 'react-navigation' const resetAction = NavigationActions.reset({ index: 0, actions: [ NavigationActions.navigate({ routeName: 'Profile'}) ] }) this.props.navigation.dispatch(resetAction)
使用场景好比进入APP首页后的splash页不在使用,这时可使用NavigationActions.reset
重置它。
index参数被用来定制化当前激活的route。举个例子:使用两个routes WelcomePage和HomePage给一个基础的stack navigation设置。为了重置route到HomePage,可是在堆栈中又存放在WelcomePage之上,你能够这么作:
const resetAction = NavigationActions.reset({ index: 1, actions: [ NavigationActions.navigate({ routeName: 'WelcomePage'}), NavigationActions.navigate({ routeName: 'HomePage'}) ] }); this.props.navigation.dispatch(resetAction);
返回到前一个screen而且关闭当前screen.backaction creator接受一个可选的参数:
import { NavigationActions } from 'react-navigation' const backAction = NavigationActions.back(); this.props.navigation.dispatch(backAction);
经过SetParams咱们能够修改指定页面的Params。
import { NavigationActions } from 'react-navigation' const setParamsAction = NavigationActions.setParams({ params: { title: 'HomePage' }, key: 'id-1517035332238-4', });
navigation中有setParams为何还要有NavigationActions.setParams?
NavigationActions.setParams
了;NavigationActions.setParams
能够修改全部页面的Params;
一、在导航器屏幕以外使用导航功能(巧用导航器的ref)
有一种场景:有的时候咱们须要在导航器中所定义的屏幕以外使用导航器来作页面跳转。
navigation
来完成的;const {navigation} = this.props;
来获取navigation
;navigation
;navigation
呢?
import { NavigationActions } from 'react-navigation'; const AppNavigator = StackNavigator(SomeAppRouteConfigs); class App extends React.Component { someEvent() { // call navigate for AppNavigator here: this. navigation && this. navigation.dispatch( NavigationActions.navigate({ routeName: someRouteName }) ); } render() { return ( <AppNavigator ref={nav => { navigation = nav; }} /> ); } }
上述代码经过导航器的顶级节点的ref
属性获取到navigation
,当上述代码的AppNavigator
节点被渲染时,ref会被回调这是就能够获取到navigation
了,须要提醒你们的是,这种用法对除StackNavigator
以外的其余两种类型的导航器也是实用的哦;