react-native-router-flux使用技巧

3 篇文章 0 订阅

强烈推荐使用该三方

如果在使用过程中遇到什么问题,可以加入react-native兴趣交流群群号:397885169一起讨论学习,也欢迎在评论区评论。

RN项目模板,还未完成,但react-native-router-flux的Demo在里面

本文会持续更新,只要该库作者不停止更新,那么我也不会停下脚步。

可能很多人之前就用过这个三方,也可能有些人听过没用过。在这系列文章中,我将重点推荐使用该三方,有这样几方面原因:

  1. 通用性:在最新的V4版本中是基于react-navigation实现的,如果使用过react-native-router-flux那么使用新版本的学习成本会低很多;

  2. 实用性:react-navigation虽然是官方推荐的导航库,但其库内部提供的,可以直接使用的功能很简单,有些还需要配合redux来实现需要的功能。而react-native-router-flux基于react-navigation实现其没有提供的APIpopTo(跳回指定页面)refresh(刷新页面)replaceModal(类似iOS从底部弹出个新页面的效果)等常用到的功能,在下面的翻译中有详细说明;

  3. 更新维护:这点上我很佩服库的作者,从V1更新到V4,从未背离作者的初衷,一直在对react-native的导航进行优化、封装,而且最让我佩服的一点是,作者好似将react-navigationIssues全都翻看过,库里面将react-navigation可能存在或者已经存在的坑都填上了,而且实时更新。如果有时间,可以查看一下CHANGELOG.md,里面有着全部的更新记录。

稍后我会提供一个相对完整的Demo来作为对本文的补充,当然,其实作者提供的Demo已经很棒了,但作者将很多功能放在了一起,第一次接触的时候,很可能会被绕进去。

Available imports

  • Router
  • Scene
  • Tabs
  • Stack
  • Tabbed Scene
  • Drawer
  • Modal
  • Lightbox
  • Actions
  • ActionConst

Router:

PropertyTypeDefaultDescription
childrenrequired页面根组件
wrapByFunction允许集成诸如Redux(connect)和Mobx(observer)之类的状态管理方案
sceneStyleStyle适用于所有场景的Style(可选)
backAndroidHandlerFunction允许在Android中自定义控制返回按钮(可选)。有关更多信息,请查看BackHandler
uriPrefixstring通过uri来深层链接,从App外跳入App内的某个页面,如果您想支持www.example.com/user/1234/的深度链接,可以通过example.com将路径匹配到/user/1234/

backAndroidHandler用法:

const onBackPress = () => {
    if (Actions.state.index !== 0) {
      return false
    }
    Actions.pop()
    return true
}

backAndroidHandler={onBackPress}

Scene:

此路由器的最重要的组件, 所有 <Scene> 组件必须要有一个唯一的 key。父节点<Scene>不能将component作为prop,因为它将作为其子节点的组件。

PropertyTypeDefaultDescription
keystringrequired将用于标识页面,例如Actions.name(params)。必须是独一无二的
pathstring将被用来匹配传入的深层链接和传递参数,例如:/user/:id/将从/user/1234/用params {id:1234}调用场景的操作。接受uri的模板标准https://tools.ietf.org/html/rfc6570
componentReact.Componentsemi-required要显示的组件,定义嵌套时不需要Scene,参见示例。
backbooleanfalse如果是true,则显示后退按钮,而不是由上层容器定义的左侧/drawer按钮。
backButtonImagestring设置返回按钮的图片
backButtonTintColorstring自定义后退按钮色调
initbooleanfalse如果是true后退按钮不会显示
clonebooleanfalse标有clone的场景将被视为模板,并在被推送时克隆到当前场景的父节点中。详情请参见示例。
contentComponentReact.Component用于呈现抽屉内容的组件(例如导航)。
drawerbooleanfalse载入DrawerNavigator内的子页面
failureFunction如果on返回一个“falsey”值,那么failure将被调用。
backTitlestring指定场景的后退按钮标题
backButtonTextStyleStyle用于返回按钮文本的样式
rightTitlestring为场景指定右侧的按钮标题
headerModestringfloat指定标题应该如何呈现:(float渲染单个标题,保持在顶部,动画随着屏幕的变化,这是iOS上的常见样式。)screen(每个屏幕都有一个标题,并且标题淡入,与屏幕一起出现,这是Android上的常见模式)如果为none(不会显示标题)
hideNavBarbooleanfalse隐藏导航栏
hideTabBarbooleanfalse隐藏标签栏(仅适用于拥有tabs指定的场景)
hideBackImagebooleanfalse隐藏返回图片
initialbooleanfalse设置为true后,会默认显示该页面
leftButtonImageImage替换左侧按钮图片
leftButtonTextStyleStyle左侧按钮的文字样式
leftButtonStyleStyle左侧按钮的样式
leftButtonIconStyleStyle左侧按钮的图标样式
modalbooleanfalse将场景容器定义为modal,即所有子场景都将从底部弹起到顶部。它仅适用于containers(与v3版本的语法不同)
navBarReact.Component可以使用自定义的React组件来定义导航栏
navBarButtonColorstring设置导航栏返回按钮的颜色
navigationBarStyleStyle导航栏的样式
navigationBarTitleImageObject导航栏中的图像中覆盖titleImage
navigationBarTitleImageStyleobject navigationBarTitleImage的样式
navTransparentbooleanfalse导航栏是否透明
onFunction又名 onEnter
onEnterFunctionScene要被跳转时调用。props将被作为参数提供。只支持定义了’component’的场景。
onExitFunctionScene要跳转离开时调用。只支持定义了’component’的场景。
onLeftFunction当导航栏左侧按钮被点击时调用。
onRightFunction当导航栏右侧按钮被点击时调用。
renderTitleReact.Component使用React组件显示导航栏的title
renderLeftButtonReact.Component使用React组件显示导航栏的左侧按钮
renderRightButtonReact.Component使用React组件显示导航栏的右侧按钮
renderBackButtonReact.Component使用React组件显示导航栏的返回按钮
rightButtonImageImage设置右侧按钮的图片
rightButtonTextStyleStyle右侧按钮文字的样式
successFunction如果on返回一个”真实”的值,那么success将被调用。
tabsbooleanfalse将子场景加载为TabNavigator。其他标签导航器属性也是适用的。
titlestring要显示在导航栏中心的文本。
titleStyleStyletitle的样式
typestringpush可选的导航操作。你可以使用replace来替换此场景中的当前场景
all other props此处未列出的其他属性将转交给Scenecomponent

Tabs (<Tabs> or <Scene tabs>)

标签栏组件。
你可以使用<Scene>中的所有props来作为<Tabs>的属性。 如果要使用该组件需要设置 <Scene tabs={true}>

PropertyTypeDefaultDescription
wrapbooleantrue自动使用自己的导航栏包装每个场景(如果不是另一个容器)。
activeBackgroundColorstring指定焦点的选项卡的选中背景颜色
activeTintColorstring指定标签栏图标的选中色调颜色
inactiveBackgroundColorstring指定非焦点的选项卡的未选中背景颜色
inactiveTintColorstring指定标签栏图标的未选中色调颜色
labelStyleobject设置tabbar上文字的样式
lazybooleanfalse在选项卡处于活动状态之前,不会渲染选项卡场景(推荐设置成true)
tabBarComponentReact.Component使用React组件以自定义标签栏
tabBarPositionstring指定标签栏位置。iOS上默认为bottom,安卓上是top
tabBarStyleobject标签栏演示
tabStyleobject单个选项卡的样式
showLabelbooleantrue是否显示标签栏文字
swipeEnabledbooleantrue是否可以滑动选项卡。
animationEnabledbooleantrue切换动画
tabBarOnPressfunction自定义tabbar点击事件
backToInitialbooleanfalse如果选项卡图标被点击,返回到默认选项卡。

Stack (<Stack>)

将场景组合在一起的组件,用于自己的基于堆栈实现的导航。使用它将为此堆栈创建一个单独的navigator,因此,除非您添加hideNavBar,否则将会出现两个导航条。

Tab Scene (child <Scene> within Tabs)

用于实现Tabs的效果展示,可以自定义icon和label。

PropertyTypeDefaultDescription
iconcomponentundefined作为选项卡图标放置的RN组件
tabBarLabelstringtabbar上的文字

Drawer (<Drawer> or <Scene drawer>)

用于实现抽屉的效果,如果要使用该组件需要设置 <drawer tabs={true}>

PropertyTypeDefaultDescription
drawerImageImage替换抽屉’hamburger’图标,你必须把它与drawer一起设置
drawerIconReact.Component用于抽屉’hamburger’图标的任意组件,您必须将其与drawer道具一起设置
hideDrawerButtonbooleanfalse是否显示drawerImage或者drawerIcon
drawerPositionstring抽屉是在右边还是左边。可选属性rightleft
drawerWidthnumber抽屉的宽度(以像素为单位)(可选)
drawerLockModeenum('unlocked', 'locked-closed', 'locked-open')指定抽屉的锁模式(https://facebook.github.io/react-native/docs/drawerlayoutandroid.html#drawerlockmode)

Modals (<Modal> or <Scene modal>)

想要实现模态,您必须将其<Modal>作为您Router的根场景。在Modal将正常呈现第一个场景(应该是你真正的根场景),它将渲染第一个元素作为正常场景,其他所有元素作为弹出窗口(当它们 被push)。

示例:在下面的示例中,root场景嵌套在<Modal>中,因为它是第一个嵌套Scene,所以它将正常呈现。如果要pushstatusModalerrorModal或者loginModal,他们将呈现为Modal,默认情况下会从屏幕底部向上弹出。重要的是要注意,目前Modal不允许透明的背景。

//... import components
<Router>
  <Modal>
    <Scene key="root">
      <Scene key="screen1" initial={true} component={Screen1} />
      <Scene key="screen2" component={Screen2} />
    </Scene>
    <Scene key="statusModal" component={StatusModal} />
    <Scene key="errorModal" component={ErrorModal} />
    <Scene key="loginModal" component={LoginModal} />
  </Modal>
</Router>

Lightbox是用于将组件渲染在当前组件上Scene的组件 。与Modal不同,它将允许调整大小和背景的透明度。

示例:
在下面的示例中,root场景嵌套在中<Lightbox>,因为它是第一个嵌套Scene,所以它将正常呈现。如果要pushloginLightbox,他们将呈现为Lightbox,默认情况下将放置在当前场景的顶部,允许透明的背景。

//... import components
<Router>
  <Lightbox>
    <Scene key="root">
      <Scene key="screen1" initial={true} component={Screen1} />
      <Scene key="screen2" component={Screen2} />
    </Scene>

    {/* Lightbox components will lay over the screen, allowing transparency*/}
    <Scene key="loginLightbox" component={loginLightbox} />
  </Lightbox>
</Router>

Actions

该对象的主要工具是为您的应用程序提供导航功能。 假设您的RouterScenes配置正确,请使用下列属性在场景之间导航。 有些提供添加的功能,将React道具传递到导航场景。

这些可以直接使用,例如,Actions.pop()将在源代码中实现的操作,或者,您可以在场景类型中设置这些常量,当您执行Actions.main()时,它将根据您的场景类型或默认值来执行动作。

PropertyTypeParametersDescription
[key]FunctionObject Actions将’自动’使用路由器中的场景key进行导航。如果需要跳转页面,可以直接使用Actions.key()Actions[key].call()
currentSceneString返回当前活动的场景
jumpFunction(sceneKey: String, props: Object)用于切换到新选项卡. For Tabs only.
popFunction回到上一个页面
popToFunction(sceneKey: String, props: Object)返回到指定的页面
pushFunction(sceneKey: String, props: Object)跳转到新页面
refreshFunction(props: Object)重新加载当前页面
replaceFunction(sceneKey: String, props: Object)从堆栈中弹出当前场景,并将新场景推送到导航堆栈。没有过度动画。
resetFunction(sceneKey: String, props: Object)清除路由堆栈并将场景推入第一个索引. 没有过渡动画。
drawerOpenFunction如果可用,打开Drawer
drawerCloseFunction如果可用,关闭Drawer

ActionConst

键入常量以确定Scene转换,这些是优先于手动键入其值,因为项目更新时可能会发生更改。

PropertyTypeValueShorthand
ActionConst.JUMPstring‘REACT_NATIVE_ROUTER_FLUX_JUMP’jump
ActionConst.PUSHstring‘REACT_NATIVE_ROUTER_FLUX_PUSH’push
ActionConst.PUSH_OR_POPstring‘REACT_NATIVE_ROUTER_FLUX_PUSH_OR_POP’push
ActionConst.REPLACEstring‘REACT_NATIVE_ROUTER_FLUX_REPLACE’replace
ActionConst.BACKstring‘REACT_NATIVE_ROUTER_FLUX_BACK’pop
ActionConst.BACK_ACTIONstring‘REACT_NATIVE_ROUTER_FLUX_BACK_ACTION’pop
ActionConst.POP_TOstring‘REACT_NATIVE_ROUTER_FLUX_POP_TO’popTo
ActionConst.REFRESHstring‘REACT_NATIVE_ROUTER_FLUX_REFRESH’refresh
ActionConst.RESETstring‘REACT_NATIVE_ROUTER_FLUX_RESET’reset
ActionConst.FOCUSstring‘REACT_NATIVE_ROUTER_FLUX_FOCUS’N/A
ActionConst.BLURstring‘REACT_NATIVE_ROUTER_FLUX_BLUR’N/A
ActionConst.ANDROID_BACKstring‘REACT_NATIVE_ROUTER_FLUX_ANDROID_BACK’N/A

Universal and Deep Linking

用例
  • 考虑这样一个web应用程序和app配对,这可能有一个urlhttps://thesocialnetwork.com/profile/1234/.
  • 如果我们同时构建一个web应用程序和一个移动应用程序,我们希望能够通过path /profile/:id/
  • 在web上,我们可能想要用一个路由器来打开我们的<Profile />和参数{ id: 1234 }
  • 在移动设备上,如果我们正确地设置了Android / iOS环境来启动我们的应用程序并打开RNRF<Router />,,那么我们还需要导航到我们的移动<Profile />场景和参数{ id: 1234 }
使用
<Router uriPrefix={'thesocialnetwork.com'}>
  <Scene key="root">
     <Scene key={'home'} component={Home} />
     <Scene key={'profile'} path={"/profile/:id/"} component={Profile} />
     <Scene key={'profileForm'} path={"/edit/profile/:id/"} component={ProfileForm} />
  </Scene>
</Router>

如果用户点击http://thesocialnetwork.com/profile/1234/在他们的设备,他们会打开<Router/ >,然后调用操作Actions.profile({ id:1234 })

react-native-redux-router是一个用于在React Native应用中管理路由和状态的库。它结合了React Native、Redux和React Navigation,提供了一种方便的方式来处理应用程序的导航和状态管理。 下面是一个简单的示例,演示了如何在React Native应用中使用react-native-redux-router: 1. 首先,安装所需的依赖项。在终端中运行以下命令: ```shell npm install react-native react-redux redux react-navigation react-native-router-flux --save ``` 2. 创建一个Redux store,并将其与React Native应用程序的根组件连接起来。在App.js文件中,添加以下代码: ```javascript import React from 'react'; import { Provider } from 'react-redux'; import { createStore } from 'redux'; import rootReducer from './reducers'; import AppNavigator from './navigation/AppNavigator'; const store = createStore(rootReducer); export default function App() { return ( <Provider store={store}> <AppNavigator /> </Provider> ); } ``` 3. 创建一个导航器组件,并定义应用程序的导航结构。在navigation/AppNavigator.js文件中,添加以下代码: ```javascript import { createAppContainer } from 'react-navigation'; import { createStackNavigator } from 'react-navigation-stack'; import { connect } from 'react-redux'; import { bindActionCreators } from 'redux'; import { Actions } from 'react-native-router-flux'; import HomeScreen from '../screens/HomeScreen'; import DetailsScreen from '../screens/DetailsScreen'; const MainNavigator = createStackNavigator({ Home: { screen: HomeScreen }, Details: { screen: DetailsScreen }, }); const AppNavigator = createAppContainer(MainNavigator); const mapStateToProps = state => ({ // 将Redux状态映射到导航器组件的props中 }); const mapDispatchToProps = dispatch => bindActionCreators(Actions, dispatch); export default connect(mapStateToProps, mapDispatchToProps)(AppNavigator); ``` 4. 创建屏幕组件,并在其中使用导航和Redux状态。在screens/HomeScreen.js文件中,添加以下代码: ```javascript import React from 'react'; import { View, Text, Button } from 'react-native'; import { Actions } from 'react-native-router-flux'; const HomeScreen = () => { return ( <View> <Text>Welcome to the Home Screen!</Text> <Button title="Go to Details" onPress={() => Actions.details()} /> </View> ); } export default HomeScreen; ``` 5. 创建其他屏幕组件,并在其中使用导航和Redux状态。在screens/DetailsScreen.js文件中,添加以下代码: ```javascript import React from 'react'; import { View, Text, Button } from 'react-native'; import { Actions } from 'react-native-router-flux'; const DetailsScreen = () => { return ( <View> <Text>Welcome to the Details Screen!</Text> <Button title="Go back" onPress={() => Actions.pop()} /> </View> ); } export default DetailsScreen; ``` 这是一个简单的示例,演示了如何在React Native应用中使用react-native-redux-router来管理路由和状态。你可以根据自己的需求进行扩展和定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值