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()传递的参数
 <Button
       title={params.mode === 'edit' ? '保存':'编辑'}
       onPress={()=>
                 setParams({mode: params.mode === 'edit' ? '' :'edit'})}
 />
 <Button
       title="Go to Page1"
       onPress={()=>{
       navigation.navigate('page',{name:'Devio'});
 }}               
 />
 const {navigation} = this.prop;
 const {state, setParams} = navigation;
 const {params} = state;
 const showText = params.mode === 'edit' ? '正在编辑':'完成编辑';

使用setParams改变route params

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完成,下文会讲到。

使用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"}
<Button 
         title="Set title name to 'Lucy'"
          onPress={() => {
              navigation.goBack();
}}
      />

通过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());
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349