React-navigation导航系统(5)-Router

2023-12-18 21:32

本文主要是介绍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)学习StackRouterTabRouter的API.
只要你愿意也可以重写router的函数.

定制Navigation的Actions

为了重写navigation的行为,你可以在getStateForAction中重写navigation state的逻辑,从而手动处理routesindex.

 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 statereturn 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=yesreturn 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 activeroutes: [{// 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组件或者子navigator
  • getScreen-为screen组件设定惰性加载的设定

StackConfig

配置的选项也被传递进入stack router.

  • initalRouteName-stack首次加载的默认路由的routeName
  • initialRouteParams-初始化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的path
  • screen-定制screen组件或者子代navigator
  • getScreen-为一个screen组件设定惰性加载的设置(navigator没有这样的配置)

Tab Router Config

被传递到router的可配置选项

  • initialRouteName-首次加载的tab的routeName
  • order-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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/509827

相关文章

使用vscode搭建pywebview集成vue项目实践

《使用vscode搭建pywebview集成vue项目实践》:本文主要介绍使用vscode搭建pywebview集成vue项目实践,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录环境准备项目源码下载项目说明调试与生成可执行文件核心代码说明总结本节我们使用pythonpywebv

使用Python和Tkinter实现html标签去除工具

《使用Python和Tkinter实现html标签去除工具》本文介绍用Python和Tkinter开发的HTML标签去除工具,支持去除HTML标签、转义实体并输出纯文本,提供图形界面操作及复制功能,需... 目录html 标签去除工具功能介绍创作过程1. 技术选型2. 核心实现逻辑3. 用户体验增强如何运行

CSS 样式表的四种应用方式及css注释的应用小结

《CSS样式表的四种应用方式及css注释的应用小结》:本文主要介绍了CSS样式表的四种应用方式及css注释的应用小结,本文通过实例代码给大家介绍的非常详细,详细内容请阅读本文,希望能对你有所帮助... 一、外部 css(推荐方式)定义:将 CSS 代码保存为独立的 .css 文件,通过 <link> 标签

使用Vue-ECharts实现数据可视化图表功能

《使用Vue-ECharts实现数据可视化图表功能》在前端开发中,经常会遇到需要展示数据可视化的需求,比如柱状图、折线图、饼图等,这类需求不仅要求我们准确地将数据呈现出来,还需要兼顾美观与交互体验,所... 目录前言为什么选择 vue-ECharts?1. 基于 ECharts,功能强大2. 更符合 Vue

Vue中插槽slot的使用示例详解

《Vue中插槽slot的使用示例详解》:本文主要介绍Vue中插槽slot的使用示例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、插槽是什么二、插槽分类2.1 匿名插槽2.2 具名插槽2.3 作用域插槽三、插槽的基本使用3.1 匿名插槽

springboot+vue项目怎么解决跨域问题详解

《springboot+vue项目怎么解决跨域问题详解》:本文主要介绍springboot+vue项目怎么解决跨域问题的相关资料,包括前端代理、后端全局配置CORS、注解配置和Nginx反向代理,... 目录1. 前端代理(开发环境推荐)2. 后端全局配置 CORS(生产环境推荐)3. 后端注解配置(按接口

Vue 2 项目中配置 Tailwind CSS 和 Font Awesome 的最佳实践举例

《Vue2项目中配置TailwindCSS和FontAwesome的最佳实践举例》:本文主要介绍Vue2项目中配置TailwindCSS和FontAwesome的最... 目录vue 2 项目中配置 Tailwind css 和 Font Awesome 的最佳实践一、Tailwind CSS 配置1. 安

CSS3 布局样式及其应用举例

《CSS3布局样式及其应用举例》CSS3的布局特性为前端开发者提供了无限可能,无论是Flexbox的一维布局还是Grid的二维布局,它们都能够帮助开发者以更清晰、简洁的方式实现复杂的网页布局,本文给... 目录深入探讨 css3 布局样式及其应用引言一、CSS布局的历史与发展1.1 早期布局的局限性1.2

使用animation.css库快速实现CSS3旋转动画效果

《使用animation.css库快速实现CSS3旋转动画效果》随着Web技术的不断发展,动画效果已经成为了网页设计中不可或缺的一部分,本文将深入探讨animation.css的工作原理,如何使用以及... 目录1. css3动画技术简介2. animation.css库介绍2.1 animation.cs

CSS引入方式和选择符的讲解和运用小结

《CSS引入方式和选择符的讲解和运用小结》CSS即层叠样式表,是一种用于描述网页文档(如HTML或XML)外观和格式的样式表语言,它主要用于将网页内容的呈现(外观)和结构(内容)分离,从而实现... 目录一、前言二、css 是什么三、CSS 引入方式1、行内样式2、内部样式表3、链入外部样式表四、CSS 选