react-navigation 3.x版本的push、navigate、goback、pop、dispatch等常用方法

一、方法簡介

1. 應(yīng)用中的每個頁面組件都會自動提供?this.props.navigation

this.props.navigation可以獲取的一些方法:

navigate- 轉(zhuǎn)到另一個頁面, 計算出需要執(zhí)行的操作 ?。ǔS茫?/p>

goBack- 關(guān)閉活動屏幕并在堆棧中向后移動 ?。ǔS茫?/p>

addListener- 訂閱導航生命周期的更新

isFocused- 函數(shù)返回true如果屏幕焦點和false否則。

state- 當前狀態(tài)/路由 ?。ǔS茫?/p>

setParams- 對路由的參數(shù)進行更改  (常用)

getParam- 獲取具有回退的特定參數(shù) ?。ǔS茫?/p>

dispatch- 向路由發(fā)送 action  (常用)

dangerouslyGetParent- 返回父級 navigator 的函數(shù)

注意: this.props.navigation并不是在所有頁面(組件)中都可以使用,而是必須在StackNavigator、DrawerNavigator中聲明的screen組件,才可以使用this.props.navigation

也就是說,screen組件會自動獲得這個props


this.props.navigation上還有一些方法取決于當前 navigator 的附加函數(shù)(StackNavigator 和?DrawerNavigator)

2. 如果是StackNavigator,除了以上方法,this.props.navigation還提供如下的一些方法:

push- 推一個新的路由到堆?! 。ǔS茫?/p>

pop- 返回堆棧中的上一個頁面 ?。ǔS茫?/p>

popToTop- 跳轉(zhuǎn)到堆棧中最頂層的頁面 ?。ǔS茫?/p>

replace- 用新路由替換當前路由

reset- 操作會擦除整個導航狀態(tài),并將其替換為多個操作的結(jié)果?! 。ǔS茫?/p>

dismiss- 關(guān)閉當前堆棧

3. 如果是DrawerNavigator,除了以上方法,this.props.navigation還提供如下的一些方法:

openDrawer- 打開

closeDrawer- 關(guān)閉

toggleDrawer- 切換,如果是打開則關(guān)閉,反之亦然

由于筆者沒有使用過DrawerNavigator,在此就不做說明;

以上內(nèi)容均摘自react-navigation的官網(wǎng),但是官網(wǎng)有點繁瑣,寫此以自用,有讀者也是我的幸運。


二、以上方法的使用

1. this.props.navigation.navigate()

onPress={() => navigate('ProfileScreen', { title: 'Profile' })}

說明:

功能:導航到某個路由 (即跳轉(zhuǎn)頁面)

使用:this.props.navigation.navigate(routeName, params, action)

參數(shù):

routeName(必需)表示需要導航到的目標路由(即跳轉(zhuǎn)的目標頁面),是在StackNavigator?中聲明的screen頁面的名稱

params(可選)表示跳轉(zhuǎn)攜帶的參數(shù),可以使用大括號攜帶多個,形式是key-value形式,在目標頁面使用this.props.navigation.state.params.xxx來獲取使用

action(可選)不常用,此處不做解釋

注意:3.x版本后,需要注意navigate和push的使用差別

Push- 在堆棧頂部添加一條路由,并導航至該路由. 與navigate的區(qū)別在于,如果有已經(jīng)加載的頁面,navigate方法將跳轉(zhuǎn)到已經(jīng)加載的頁面,而不會重新創(chuàng)建一個新的頁面。push總是會創(chuàng)建一個新的頁面,所以一個頁面可以被多次創(chuàng)建。--摘自官網(wǎng)


2. this.props.navigation.push()

onPress={() => push('ProfileScreen', { title: 'Profile' })}

說明: 功能作用完全同上,只是和navigate的區(qū)別需要注意

類似于navigate,push將跳轉(zhuǎn)到堆棧中的新的路由 與navigate的區(qū)別在于,如果有已經(jīng)加載的頁面,navigate方法將跳轉(zhuǎn)到已經(jīng)加載的頁面,而不會重新創(chuàng)建一個新的頁面。push總是會創(chuàng)建一個新的頁面,所以一個頁面可以被多次創(chuàng)建。--摘自官網(wǎng)

注意:與navigate相比較,push的使用范圍無疑是更廣的,它可以在相同的screen頁面間跳轉(zhuǎn)(只是頁面routeName相同,而參數(shù)params不同),


3. this.props.navigation.goback()

onPress={() =>this.props.navigation.goback()}

說明: 可以返回堆棧的上一頁面

功能: 關(guān)閉當前頁面并返回上一頁面

參數(shù):可以是空(即表示僅僅返回上一個頁面,并關(guān)閉當前頁),

   ? ?可以有參數(shù),表示回到指定頁面(關(guān)閉本頁面和指定頁面之間的所有頁面)

擴展:有參數(shù)情況的使用

//當前已使用以下導航堆棧:

navigation.navigate(SCREEN_KEY_A);

navigation.navigate(SCREEN_KEY_B);

navigation.navigate(SCREEN_KEY_C);

navigation.navigate(SCREEN_KEY_D);

//現(xiàn)在你在* screen D 上,并且想要回到 screen A *(銷毀D、C和B)

navigation.goBack(SCREEN_KEY_D)//將從 screen D 跳轉(zhuǎn)到 screen A

注意:

如果,* screen A * 在堆棧的頂部, 你可以使用navigation.popToTop()方法

gaoback()使用的參數(shù),同navigate,應(yīng)該是在StackNavigator?中聲明的screen頁面的名稱


4. this.props.navigation.popToTop()

onPress={() =>this.props.navigation.popToTop()}

說明: 功能同上面的goback(),只是作用更單一,是回到堆棧的頂部

功能:?調(diào)用該方法將直接跳轉(zhuǎn)到堆棧最頂層的路由,銷毀其它所有頁面


5. this.props.navigation.pop()

onPress={() =>this.props.navigation.pop()}//也可以攜帶參數(shù),n表示在堆棧內(nèi)返回幾層onPress={() =>this.props.navigation.pop(n)}

說明:??功能同上面的goback()、popToTop(),只是參數(shù)是不同的

功能:?返回到堆棧中的上一個頁面,如果提供一個參數(shù)n,則指定在堆棧內(nèi)返回幾層。


6. this.props.navigation.reset()

import { NavigationActions } from 'react-navigation'navigation.reset([NavigationActions.navigate({ routeName: 'HomeScreen' })], 0)

說明:?this.props.navigation.reset()是重置堆棧,并初始化到指定頁面(HomeScreen),也就是清空堆棧,一般在退出登錄的情況下操作

功能:?操作會擦除整個導航狀態(tài),并將其替換為多個操作的結(jié)果。

擴展:也可使用dispatch執(zhí)行此操作:

import { StackActions, NavigationActions } from 'react-navigation';

const resetAction = StackActions.reset({

? index: 0,

? actions: [NavigationActions.navigate({ routeName: 'HomeScreen' })],

});this.props.navigation.dispatch(resetAction);

參數(shù):

index- * number *??- 必需 -routes數(shù)組中state的活動路由的索引。(此處0表示清空所以,從0開始)

actions-array- 必需 - 將取代導航狀態(tài)的導航行為數(shù)組。(即初始化)

key-string or null- 可選 - 如果設(shè)置,具有給定 key 的導航器將重置。 如果為null,則根導航器將重置。


7. this.props.navigation.dispatch()

import { NavigationActions } from 'react-navigation';

const navigateAction = NavigationActions.navigate({

? routeName: 'ProfileScreen',

? params: {},

? // navigate can have a nested navigate action that will be run inside the child router (navigate 可以用有一個嵌套的navigate 操作)action: NavigationActions.navigate({ routeName: 'SubProfileRoute' }),

});this.props.navigation.dispatch(navigateAction);

說明: dispatch() 可以重新定義任何導航操作(比如navigate,push,reset等),上面的reset()方法的擴展也是使用的dispatch

功能:使用dispatch將任何導航操作發(fā)送到路由后,該操作都將具有最高優(yōu)先級。

參數(shù): 就是你想重做的?NavigationActions 或者?StackActions中的方法及其參數(shù)


8. this.props.navigation.state

// 頁面可以通過 this.props.navigation.state訪問其路由。每一個都將返回一個對象, 其內(nèi)容如下:{

? //StackNavigator中聲明的screen名稱routeName: 'profileScreen,

? //用于路由排序的唯一標識,對于我們無用

? key: 'xxx',

? //攜帶參數(shù)

? params: { name: 'profile' }

}

說明: state可以獲取本頁面路由下的數(shù)據(jù),尤其是params (可以通過前一頁面的跳轉(zhuǎn)攜帶,也可在本頁面通過setParams來設(shè)置)

功能:頁面可以通過this.props.navigation.state訪問其路由,獲取想要的東西,比如params等

使用:this.props.navigation.state.params.title等

// 通過 navigation.state 獲取參數(shù) paramsstatic? navigationOptions = ({navigation}) => ({

? ? headerTintColor: '#fff',

? ? headerTitle: navigation.state.params.title, //這是從上一級跳轉(zhuǎn)攜帶的headerRight: ? ?            {navigation.state.params.toOperate();}}>//此處必須通過添加參數(shù)的形式來調(diào)用方法下一步? ?                     })


9. this.props.navigation.setParams()

componentDidMount() {

? ? // toOperate同上面的state.paramsthis.props.navigation.setParams({toOperate: () => {

? ? ? ? alert('操作')

? ? }})

}

說明:?setParams()可以設(shè)置參數(shù),方便在頁面的頭部使用(即使用navigationOptions定義的頭部,當需要本頁面的數(shù)據(jù)時,必須通過setParams()傳遞,通過state.params去獲?。?/p>

功能:setParams方法允許頁面更改路由中的參數(shù)


10.?this.props.navigation.getParam()

// 使用state.params獲取this.props.navigation.state.params.title//使用getParam()獲取this.props.navigation.getParam('title', 'profile');

說明:?過去, 當params未定義時, 你可能在獲取params時遇到問題。 現(xiàn)在,你不必直接訪問參數(shù),可以調(diào)用getParam方法。

功能: 獲取指定的參數(shù),可以設(shè)置獲取失敗的返回值,比如上面的 title,當獲取不到時,使用 profile?作為默認值


三、

最后說明:全文使用?react-navigation官網(wǎng)的內(nèi)容,僅為方便理解,添加了個人的刪改和解釋,如有問題,望見諒。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容