React-navigation導航系統(5)-Router
tags: React-Native
Routers
Router定義一個元件的navigation state,允許開發者定義路徑和可以操作的actions.
內建的Routers
- StackRouter
- TabRouter
使用Routers
為了手動定製一個navigator,在元件裡可以放一個靜態的router
.(使用內建的元件快速的定製一個navigator,使用Navigator
Factory更容易實現).
class MyNavigator extends React.Component {
static router = StackRouter(routes, config);
...
}
現在你可以把這個元件作為另一個navigator的screen
對待,MyNavigator
的導航邏輯在StackRouter
中定義.
定製化Router
看看[定製Router API 部分](https://reactnavigation.org/docs/routers/api)
學習StackRouter
和TabRouter
的API.
只要你願意也可以重寫router的函式.
定製Navigation的Actions
為了重寫navigation的行為,你可以在getStateForAction
中重寫navigation
state的邏輯,從而手動處理routes
和index
.
const MyApp = StackNavigator({
Home: { screen: HomeScreen },
Profile: { screen: ProfileScreen },
}, {
initialRouteName: 'Home',
})
MyApp.router = {
...MyApp.router,
getStateForAction(action, state ) {
if (state && action.type === 'PushTwoProfiles') {
const routes = [
...state.routes,
{key: 'A', routeName: 'Profile', params: { name: action.name1 }},
{key: 'B', routeName: 'Profile', params: { name: action.name2 }},
];
return {
...state ,
routes,
index: routes.length - 1,
};
}
return MyApp.router.getStateForAction(action, state);
},
};
阻止某些Navigation的Actions
有時候根據你的route,需要阻止某些navigation的活動
const MyStackRouter = StackRouter({
Home: { screen: HomeScreen },
Profile: { screen: ProfileScreen },
}, {
initialRouteName: 'Home',
})
const MyAppRouter = {
...MyStackRouter,
getStateForAction(action, state) {
if (
state &&
action.type === NavigationActions.BACK &&
state.routes[state.index].params.isEditing
) {
// Returning null from getStateForAction means that the action
// has been handled/blocked, but there is not a new state
return null;
}
return MyStackRouter.getStateForAction(action, state);
},
};
操作定製URIs
或許你的app有一個獨特的URI,內建的routers處理不了.你可以通過getActionForPathAndParams
來擴充套件router.
import { NavigationActions } from 'react-navigation'
const MyApp = StackNavigator({
Home: { screen: HomeScreen },
Profile: { screen: ProfileScreen },
}, {
initialRouteName: 'Home',
})
const previousGetActionForPathAndParams = MyApp.router.getActionForPathAndParams
Object.assign(MyApp.router, {
getActionForPathAndParams(path, params) {
if (
path === 'my/custom/path' &&
params.magic === 'yes'
) {
// returns a profile navigate action for /my/custom/path?magic=yes
return NavigationActions.navigate({
routeName: 'Profile',
action: NavigationActions.navigate({
// This child action will get passed to the child router
// ProfileScreen.router.getStateForAction to get the child
// navigation state.
routeName: 'Friends',
}),
});
}
return previousGetActionForPathAndParams(path, params);
},
};
定製Router API
你可以童工下面的函式來構建自己的router物件,
const MyRouter = {
getStateForAction: (action, state) => ({}),
getActionForPathAndParams: (path, params) => null,
getPathAndParamsForState: (state) => null,
getComponentForState: (state) => MyScreen,
getComponentForRouteName: (routeName) => MyScreen,
};
// Now, you can make a navigator by putting the router on it:
class MyNavigator extends React.Component {
static router = MyRouter;
render() {
...
}
}
getStateForAction(action,state)
根據給定的action來定義返回的navigation sate.當一個action通過props.navigation.dispatch()
傳遞,或者任何其他的助手函式被呼叫,例如navigation.navitate()
的時候,這個函式將會執行.
通常這個函式將會以下面的形式返回navitaion state.
{
index: 1, // identifies which route in the routes array is active
routes: [
{
// Each route needs a name to identify the type.
routeName: 'MyRouteName',
// A unique identifier for this route in the routes array:
key: 'myroute-123',
// (used to specify the re-ordering of routes)
// Routes can have any data, as long as key and routeName are correct
...randomRouteData,
},
...moreRoutes,
]
}
如果router已經在外部處理了acion,或者想不改變任何的navigation state就消化它,這個函式就返回null
.
getComponentForRouterName(routeName)
為給定的route name返回子元件或者navigator.
像這樣宣告一個routergetStateForAction
輸出的state.
{
index: 1,
routes: [
{ key: 'A', routeName: 'Foo' },
{ key: 'B', routeName: 'Bar' },
],
}
基於state中的額routeName,router將會呼叫router.getComponentForRouteName('Foo')
或router.getComponentForRouteName('Bar')
來返回對應的有效元件.
getComponentForState(state)
從深度巢狀navigation state返回啟用的元件
getActionForPathAndParams
返回一個可選配置的navigation action,在使用者導航到這個路徑並且有可選的查詢引數的時候使用這個action.
getPathAndParamsForState
使用者在app中返回同一個URL連結的點時,這個函式返回路徑和引數.
從這個函式返回的路徑和引數應該是從一個action獲得的,這個action是重傳進入router的getActionForPathAndParams
的.這個action一旦通過getStateForAction
傳遞,會給你返回形似的state.
getScreenConfig
這個函式從一個route獲取navigation的可選項.必須要提供screen的當前navigation prop和被返回的選項的名字.
navigation
-這是screen將會使用的navigation prop,對應在screen的route和state.Dispatch將會根據screen的上下文來觸發actions.optionName
-被獲取的選項的名字,例如’title’
在例項的檢視內,或許你需要遠端獲取配置的標題
// First, prepare a navigation prop for your child, or re-use one if already available.
const childNavigation = addNavigationHelpers({
// In this case we use navigation.state.index because we want the title for the active route.
state: navigation.state.routes[navigation.state.index],
dispatch: navigation.dispatch,
})
const screenTitle = this.props.router.getScreenConfig(childNavigation, 'title');
StackRouter
管理navigation堆疊的邏輯,包括入棧,出棧,操作路徑解析建立深層次的堆疊.
讓我們看看簡單的stack router
const MyApp = StackRouter({
Home: { screen: HomeScreen },
Profile: { screen: ProfileScreen },
}, {
initialRouteName: 'Home',
})
RouteConfig
最簡單的stack router期待的引數是一個config物件,這裡是示例配置
const MyApp = StackRouter({ // This is the RouteConfig:
Home: {
screen: HomeScreen,
path: '',
},
Profile: {
screen: ProfileScreen,
path: 'profile/:name',
},
Settings {
// This can be handy to lazily require a screen:
getScreen: () => require('Settings').default,
// Note: Child navigators cannot be configured using getScreen because
// the router will not be accessible. Navigators must be configured
// using `screen: MyNavigator`
path: 'settings',
},
});
每一個在config中的條目有如下內容
path
-設定條目的路徑和引數可以在stack中被解析screen
-設定screen元件或者子navigatorgetScreen
-為screen元件設定惰性載入的設定
StackConfig
配置的選項也被傳遞進入stack router.
initalRouteName
-stack首次載入的預設路由的routeNameinitialRouteParams
-初始化route的預設引數paths
-提供routeName到path配置的對映,將會重寫routeConfigs裡的path設定
Supported Actions
stack router可以對下面的導航actions作為響應.如果有可能,router將會代理到子代router的action操作.
- Navigate-如果routeName和router的routerConfigs其中之一匹配,將會push一個新的route到堆疊.
- Back-返回(props)
- Reset-清除堆疊,提供一個新的actions建立新的navigation state
- SetParams-screen dispatch一個action去改變當前route的引數
TabRouter
管理應用中的一套tabs,處理tabs之間的跳轉,處理back鍵的操作返回到初始化的tab.
看看簡單的tabs router
const MyApp = TabRouter({
Home: { screen: HomeScreen },
Settings: { screen: SettingsScreen },
}, {
initialRouteName: 'Home',
})
RouteConfig
tabs router有為每一個tab的routeConfig
const MyApp = TabRouter({ // This is the RouteConfig:
Home: {
screen: HomeScreen,
path: 'main',
},
Settings: {
// This can be handy to lazily require a tab:
getScreen: () => require('./SettingsScreen').default,
// Note: Child navigators cannot be configured using getScreen because
// the router will not be accessible. Navigators must be configured
// using `screen: MyNavigator`
path: 'settings',
},
});
config中的每一個config可能有
config
-每一個tab的pathscreen
-定製screen元件或者子代navigatorgetScreen
-為一個screen元件設定惰性載入的設定(navigator沒有這樣的配置)
Tab Router Config
被傳遞到router的可配置選項
initialRouteName
-首次載入的tab的routeNameorder
-tabs的順序path
-提供routeName到path config的對映,對映重寫routeConfig中的path設定backBehavior
-點選back按鈕應該返回到初始化的tab嗎?如果是的話,設定initialRoute
,否則就是none
,預設到initialRoute
的行為.
Support Actions
tabs router會對下面的navigation actions做出響應.如果有可能,router將代理到子代router的action.
- Navigate-如果和tab的routeName匹配,就會跳轉到對應的tab
- Back-如果不是第一個預設的tab,就跳轉到第一個tab
- SetParams-screen dispatch一個Action來改變當前route的state
相關推薦
React-navigation導航系統(5)-Router
tags: React-Native Routers Router定義一個元件的navigation state,允許開發者定義路徑和可以操作的actions. 內建的Routers StackRouterTabRouter 使用Routers 為了手動定製一
react-navigation 導航、路由
outer dsta one erp 頁面設置 png stack raw params 1,首先,下載,安裝,引入react-navigation npm install --save react-navigation 或者 yarn add rea
React Native之React Navigation導航器
最近在學習React Native,關於介面跳轉這一塊,文件上面寫的並不清晰,自己也是研究了很久才搞清楚用法,這裡記錄下。 譯註:從0.44版本開始,Navigator被從react native的核心元件庫中剝離到了一個名為react-native-depr
專案實踐中的react-navigation導航器
React-Native給前端帶來了新視野,可以使用web開發語言javascript來實現Native開發(ios/android),現在的前端能做的事情就更多了。 react-navigation的使用 react-native中使用導航器來實現na
Unity之Navigation導航系統
Navigation系統的使用原理 NavMesh(導航網格)是3D遊戲世界中用於實現動態物體自動尋路的一種技術,將遊戲中複雜的結構組織關係簡化為帶有一定資訊的網格,在這些網格的基礎上通過一系列的計算來實現自動尋路。 在場景中搭建一個斜坡。例如: 建立好後,選中三個物件,
react-navigation android 導航標題居中
mmu github tile reac oid comm and roi image 先貼下代碼供參考: 安卓默認導航的titile 是在左側的,為了和iOS保持一致,需要添加 alignSelf:‘center‘,這個 屬性 但是會遇到title有點偏右的情況 添
react-native導航器 react navigation 介紹
開發環境搭建 部署 ica sam native 找不到 組件 getting start 開發環境搭建好之後,想要進一步了解react-native,可以先從react-native官網上的電影列表案例入手: https://reactnative.cn/docs/0
react navigation 任意地方觸發導航,不需要 navigation 屬性
Navigating without the navigation prop https://reactnavigation.org/docs/en/navigating-without-navigation-prop.html Calling functions such as
react-naitve0.57.5 與react-navigation
react-naitve0.57.5 與react-navigation3.0.0可能不相容,總報什麼Guester什麼的問題 使用react-naitve0.57.4 與react-navigation2.18.2 ,2.18.0也不行 react-native init --
react-native 導航器 react-navigation 3.x 使用
React-navigation 介紹 React Navigation 源於 React Native 社群對一個可擴充套件且易於使用的導航解決方案的需求,它完全使用 JavaScript 編寫。 安裝 在你的 React Native 專案中安裝 react-navigati
react-native react-navigation的用法 react native 導航路由元件react-navigation的使用
一、問題背景 react-navigation是react-native官方推薦的,基於Javascript的可擴充套件且使用簡單的導航,功能強大且完備 回顧一下,react-navigation包含以下功能來幫助我們建立導航器: StackN
react-native配置導航react-navigation
外掛選擇 最近又在看新的跨平臺解決方案Flutter,技術真是日新月異。順便整理一下之前專案上的react-native導航配置問題,導航器現在首選官方推薦的 ,支援多種導航模式,可參照英文文件編寫可執行的基礎demo。 初始化 假設當前已經配置好reac
導航器 React Navigation
一 .react-navigation包含以下功能來幫助你建立導航器: StackNavigator : 一次只渲染一個頁面,並提供頁面之間跳轉的方法。 當開啟一個新的頁面時,它被放置 TabNavigator : 渲染一個選項卡,讓使用者可以在幾個頁面
如何實現 React Native 裡的頁面導航系統
我們在新起的專案中決定用純 React Native 實現,以儘量減少對 native 的依賴,並且避免因 hybrid app 中 native 頁面的層次結構(iOS 中 view controllers,Android 中 activities)在 React 側不可知、不
【共享單車】—— React後臺管理系統開發手記:Router 4.0路由實戰演練
前言:以下內容基於React全家桶+AntD實戰課程的學習實踐過程記錄。最終成果github地址:https://github.com/66Web/react-antd-manager,歡迎star。 一、React Router 4.0核心概念 4
react-navigation 安卓上導航標題居中顯示
導航設定里加上下面這句程式碼即可。 static navigationOptions = ({navigation}) =>({ headerTitleStyle:{alignSelf:'center'}, });
React Native之Android 5.0以下系統WebView訪問https頁面變成空白頁
在我們的React Native專案中,需要開發一個tab頁面專門配置三方h5連結,供使用者瀏覽。自動化測試:Android 5.0以下系統此tab頁面為空白頁面。看效果: 而我們去檢視這個三方的
React Native導航器之react-navigation使用
在上一節Navigation元件,我們使用系統提供的導航元件做了一個跳轉的例子,不過其實戰能力不強,這裡推薦一個超牛逼的第三方庫:react-navigation。在講react-navigation之前,我們先看一下常用的導航元件。 導航控制元件 常見
React Native--使用React Navigation實現介面導航與跳轉
在瀏覽器中我們可以通過<a>標籤與url實現不同頁面之間的跳轉,利用瀏覽器的返回按鈕返回之前瀏覽的頁面,但是在React Native中卻沒有整合內嵌的全域性棧來實現這個介面的跳轉,因此需要使用第三方庫來實現這個功能。React Navigatio
ReactNative導航器react-navigation的使用心得總結
開場白:react-navigation導航器已經發布許久,相信有不少朋友都已經體驗到了它的方便之處,現在僅做一下個人總結,早在2017年1月份,新開源的react-natvigation庫備受矚目。在短短不到3個月的時間,github上星數已達4000+。Fb