react-navigation 新增 goBackWithRouteName方法

react-navigation是0.45版本新出的路由組件,功能強(qiáng)大.但是在使用過(guò)程中發(fā)現(xiàn)一個(gè)局限性,可以使用navigate('aaa'),通過(guò)routeName跳轉(zhuǎn)指定頁(yè)面,午飯實(shí)現(xiàn)goBack('aaa')方法返回到指定頁(yè)面.

和交流群里一些大神交流了一些看法,兔神選擇了修改goBack()方法的源碼的方式,實(shí)現(xiàn)跳轉(zhuǎn)指定頁(yè)面.兔神文章鏈接react-navigation使用技巧.該方法很好很強(qiáng)大,修改內(nèi)容很少,個(gè)人僅僅是出于多想一種解決方法的出發(fā)點(diǎn),嘗試另一種方法來(lái)解決.

所以我選擇了給react-navigation增加新方法goBackWithRouteName(routeName)的方式來(lái)實(shí)現(xiàn).下面介紹一下詳細(xì)的實(shí)現(xiàn)過(guò)程:

先來(lái)一張效果圖


首先找到項(xiàng)目中該目錄 /node_modules/react-navigation/src/

涉及4個(gè)文件:

1. /node_modules/react-navigation/src/addNavigationHelpers.js文件

2. /node_modules/react-navigation/src/addNavigationActions.js文件

3. /node_modules/react-navigation/src/typeDefinition.js文件

4. /node_modules/react-navigation/src/routers/StackRouter.js文件

修改內(nèi)容

1.addNavigationHelpers.js文件

第18行

goBack: (key?: ?string): boolean =>

navigation.dispatch(

NavigationActions.back({

key: key === undefined ? navigation.state.key : key,

})

),

/*新增代碼部分*/

goBackWithRouteName: (routeName?: ?string): boolean =>

navigation.dispatch(

NavigationActions.backWithRouteName({

routeName: routeName === undefined ? navigation.state.routeName : routeName,

})

),

2. addNavigationHelpers.js文件

第7行

const BACK = 'Navigation/BACK';

/*新增代碼部分*/

const BACK_WITH_ROUTE_RNAME = 'Navigation/BACK_WITH_ROUTE_RNAME';


第22行

const back = createAction(BACK);

/*新增代碼部分*/

const backWithRouteName = createAction(BACK_WITH_ROUTE_RNAME);


第32行

Back: BACK,

/*新增代碼部分*/

BackWithRouteName: BACK_WITH_ROUTE_RNAME,


第68行

BACK,

/*新增代碼部分*/

BACK_WITH_ROUTE_RNAME,


第78行

back,

/*新增代碼部分*/

backWithRouteName,


3.typeDefinition.js文件

第184行

export type NavigationBackAction = {

type: 'Navigation/BACK',

key?: ?string,

};

? /*新增代碼部分*/

export type NavigationBackWithRouteNameAction = {

type: 'Navigation/BACK_WITH_ROUTE_RNAME',

routeName: string,

key?: ?string,

};

4.StackRouter.js文件

if (action.type === NavigationActions.BACK) {

let backRouteIndex = null;

if (action.key) {

const backRoute = state.routes.find(

/* $FlowFixMe */

(route: *) => route.key === action.key

);

/* $FlowFixMe */

backRouteIndex = state.routes.indexOf(backRoute);

}

if (backRouteIndex == null) {

return StateUtils.pop(state);

}

if (backRouteIndex > 0) {

return {

...state,

routes: state.routes.slice(0, backRouteIndex),

index: backRouteIndex - 1,

};

}

}

/*新增代碼部分*/

if (action.type === NavigationActions.BACK_WITH_ROUTER_RNAME) {

let backRouteIndex = null;

if (action.routeName) {

const backRoute = state.routes.find(

/* $FlowFixMe */

(route: *) => route.routeName === action.routeName

);

/* $FlowFixMe */

backRouteIndex = state.routes.indexOf(backRoute);

}

if (backRouteIndex == null) {

return StateUtils.pop(state);

}

if (backRouteIndex >= 0) {

return {

...state,

routes: state.routes.slice(0, backRouteIndex + 1),

index: backRouteIndex - 1 + 1,

};

}

}

以上四個(gè)文件內(nèi)容修改完畢后保存即可.goBackWithRouteName(routeName)使用方法類似goBack().

對(duì)比兔神的實(shí)現(xiàn)方法,這個(gè)方法同樣實(shí)現(xiàn)了根據(jù)routeName回跳到指定頁(yè)面的功能,但是修改步驟較復(fù)雜,優(yōu)點(diǎn)是大家可以參照此方法實(shí)現(xiàn)過(guò)程,自定義自己需要的其他方法.提高大家對(duì)于react-navigation的擴(kuò)展能力.

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

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

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