3.react-navigation开发指南(理论熏陶)19-07-11

react-navigation开发指南

推荐使用
creatMaterialTopTabNavigator顶部材料设计主题标签栏

createBottomTabNavigator相当于iOS的TabBarController,屏幕下方标签栏。

navigation包含的功能属性:

navigate: 跳转到其他界面
state:屏幕当前state
setParamas: 改变路由的params
goBack:关闭当前屏幕
dispatch:向路由发送一个action
addListener: 订阅导航生命周期的更新
isFocused:true 标识屏幕获取了焦点
getParams: 获取具有回退的特定参数
dangerouslyGetParent: 返回父导航器;

注意:一个navigation有可能没有navigate、setParams以及goBack,只有state与dispatch,所以在使用navigate时要进行判断,如果没有navigate可以使用navigation去dispatch一个新的action。

如:

const { navigation,theme,selectedTab}=this.props;
const resetAction = StackActions.reset({
    index: 0,
    actions:[
        NavigationActions.navigate({
             routeName: 'HomePage',
             params:{
                    theme:theme,
                    selectedTab: selectedTab
             },
      })
   ]   
})
navigation.dispatch(resetAction)

注意:reset这个API在2.0以后的版本中被从NavigationActions中移到了StackActions中,如以上代码,使用是要注意

StackNavigator的额外功能:

当且仅当当前navigator是stack navigator时,this.props.navigation上有一些附加功能,这些函数是navigate和goBack的代替方法,你可以使用任何你喜欢的方法,功能如下:

this.props.navigation
       push   导航到堆栈中的一个新路由
       pop     返回堆栈中的上一个页面
       popToTop  跳转到堆栈中的最顶层页面
       replace  用新路由替换当前路由
       reset  擦除导航器状态并将其替换多个操作的结果
       dismiss 关闭当前栈      

使用navigate进行页面间的跳转

navigation.navigate({routeName, params, action, key})
或
navigation.navagate(routeName, params, action)

//routeName: 要跳转页面的路由名,也就是我们在导航配置里面配置的路由名
//params: 传递给下一个界面的参数;
//action: 如果改界面是一个navigation的话,将运行这个sub-action
//key: 要导航到路由的可选标识符。如果已经存在,将后退到此路由

可以通过this.props.state.params来获取通过setParams(),或navigation.navigate()传递的参数
 

使用setParams改变route params

setParams: function setParams(params): 我们可以借助setParams来改变route params ,例如通过setParams来更新顶部标题,返回按钮等;

class ProfileScreen extends React.Component {
  render(){
    const {setParams} = this.props.navigation;
    return (
      

注意:navigation.setParams改变的是当前页面的Params,如果要改变其他页面的params可以通过NavigationActions.setParams完成,下文会讲到。

使用goBack返回上一页或者指定页面

goBack: function goBack(key): 我们可以借助goBack返回到上一页或者路由栈指定页面。

  • 其中key表示你要返回页面的页面标识如id-151704349482934754-4,不是routeName。
  • 可以通过指定页面的navigation.state.key来获得页面的标识
  • key 非必传,也可以穿null
    navigation..state {params: {...}, key: "id-154839473957543975-4", routeName: "Page1"}

通过dispatch发送一个action

  • dispatch: function dispatch(action): 给当前页面设置action,会替换原来的跳转,回退等事件。
const resetAction = StackActions.reset({
    index: 0,
    actions:[
        NavigationActions.navigate({
             routeName: 'HomePage',
             params:{
                    theme:theme,
                    selectedTab: selectedTab
             },
      })
   ]   
})
navigation.dispatch(resetAction)

NavigationActions

  • Navigate: 导航到其他页面
  • Back : 返回到上一个页面
  • Set params : 设置指定页面的Params;
  • Init : 初始化一个state 如果state是undefined

Navigate

方法原型: navigate({routeName, params,actions,key})

  • routeName: 字符串, 必选 ,在app的router里注册的导航目的地的routeName
  • params: 对象, 可选项,融合进目的地route的参数
  • action: 对象, 可选项(高级),如果screen也是一个navigator,次级action可以在router中运行。在文档中描述的任何actions都可以作为次级action。
  • key: string或null, 可选,要导航到的路由标识符,如果已经存在,则导航回此路由。
import {NavigationActions} from 'react-navigation';

const navigateAction = NavigationActions.navigate({
  routeName: 'Profile',
  params: {},
  action: NavigationActions.navigate({routeName: 'SubProfileRoute'})
})

Back

返回到前一个screen并且关闭当前screen.backaction creator接受一个可选的参数:
方法原型: back(key)

import {NavigationActions} from 'react-navigation';

const backAction = NavigationActions.back();
this.props.navigation.dispatch(backAction)

SetParams

通过SetParams我们可以修改指定页面的Params

  • params: 对象, 必选参数,将会被合并到已经存在页面的Params中
  • key : 字符串 , 页面key值
import {NavigationActions } from 'react-navigation'
const setParamsAction = NavigationActions.setParams({
  params: {title: 'HomePage'},
  key: 'id-1547347857384537-4',
})
navigation中有setParams,为什么还要有navigationActions.setParams呢?
  • 1.上文讲到过有时navigation中只有state与dispatch,这个时候如果要修改页面的Params,则只能通过NavigationActions.setParams了。
  • 2.另外,navigation.setParams只能修改当前页面的Params, 而NavigationActions.setParams可以修改所有页面的Params;

StackActions

  • Reset: 重置当前state到一个新的state;
  • Replace: 使用另一条路由替换指定路由;
  • Push: 在堆栈顶部添加一个页面,然后跳转到该页面
  • Pop: 跳转到上一个页面;
  • PopToTop: 跳转到堆栈最顶层页面;

Reset:

Reset action 删掉所有的navigation state 并且使用这个action的结果来代替。

  • index, 数组,必选,navigation state中route数组中激活的route的index。
  • actions, 数组,必选,Navigation Actions数组,将会代替navigation state。
  • key: string or null ,可选如果设置具有导航key的导航器将重置。如果为null,根导航器将重置。
import {NavigationActions, StateActions } from 'react-navigation'

const resetAction = StateActions.reset({
  index: 0,
  actions: [
    NavigationActions.navigate({routeName: 'Profile'})
  ]
})

this.props.navigation.dispatch(resetAction)

//应用场景,进入APP后欢迎页不再使用,这时可以用NavigationActions.reset重置它。

Replace:

Replace 用另一个路由替换指定路由

  • key string ,被替换路由的key,如果未指定,最近的路由将会替换
  • newKey string,用于替换路线的key,如果未提供则自动生成
  • routeName string,routeName用于替换路由
  • params object,要传入替换路由的参数
  • action object,可选的子动作
    *immediate boolean,目前没有效果,这是stack navigator支持动画替换(它目前不支持)

Push

Push 在堆栈顶部添加一条路由,并导航至该路由。
push与navigate的区别在于,如果有已经加载的页面, navigate方法将跳转到已经加载的页面,而不会重新创建一个新的。push总是可以创建新的页面,所以一个页面可以多次创建。

  • routeName string,routeName用于替换路由。
  • params object, 将合并到目标路由的参数。
  • action object,可选,(高级)如果页面时navigator,则在子路由器中运行子操作。
import { StackActions } from 'react-navigation';

const pushAction = StackActions.push({
  routeName: 'Profile',
  params:{
    myUserId: 9,
  },
})

this.props.navigation.dispatch(pushAction);

pop

The pop 一个可以返回堆栈中上一个路由的方法,通过设置参数n,可以指定返回多少层。

  • n number, 返回的层数,1是上一层 ,2是上一层的上一层
import { StackActions } from 'react-navigation';

const popAction = StackActions.pop({
  n: 1,
})

this.props.navigation.dispatch(popAction);

popToTop

The popToPop一个可以直接跳到堆栈最顶端,并销毁其他所有页面的方法,它在功能上与StackAction.pop({n: currentIndex})相同。

import { StateAction } from 'react-navigation';
this.props.navigation.dispatch(StateAction.popToTop());

你可能感兴趣的:(3.react-navigation开发指南(理论熏陶)19-07-11)