react-navigation
它是facebook官方推荐的代替 < 0.43.0版本Navigator组件的解决方案 文档点这里
新人可能在这里会问,为什么我一定需要一些第三方的控件来写一个简单的功能,更甚者明明官方已经提供了一个NavigatorIOS了,它已经完全能胜任了?还要去下载一个第三方组件来增加包体积呢?其实意思是这样没错,只是最重要的一点,我们现在是做webApp,这是一个跨平台的解决方案,我们思维方式应该优先是wirte once, run everywhere。很多第三方其实都是内部实现了NavigatorIOS 还有 “NavigatorAndroid” ,我们只需要执行抽象过的公共方法来操作就好了,本质还是这两个控件。而我们的代码经过第三方的加工只需要编写一次,不需要进行额外的设备判断了。
stackNavigation
还是来看一段官方的解释,让我们能稍微通透点的知道这个是什么
Provides a way for your app to transition between screens where each new screen is placed on top of a stack.
如同名字一样stackNavigation,那么它是一个栈,大家都知道栈只有两种方式:压栈,出栈,而它是一个跳转,过渡两个场景的栈。
我们看到代码:
1.在全局我们创建了一个名为ModalStack的StackNavigator的对象,并且传递了一个对象
2.在HomeScreen组件内,我们定义了一个静态变量options。
我们一步一步的分析,我们这个stackNavigator的函数究竟做了些什么
StackNavigator(RouteConfigs,StackNavigatorConfig) 文档点这里
这是StackNavigator的构造函数,里面有两个参数 RouteConfigs,stackNavigatorConfig
routeConfigs
The route configs object is a mapping from route name to a route config, which tells the navigator what to present for that route.
我们了解到这个configs是一个映射表,通过这个映射表来让navigator可以有效的查找到跳转的组件或者界面,这个对象可以接受多个键值对,每个键值对的value是一个对象,而这个对象应该符合相应的格式才能供navigator解析
screen:用于映射目标对象或者界面
path: 用路由的方式来获取对象或者界面
Optional: When deep linking or using react-navigation in a web app, this path is used
navigationOptions:这个就是来override我们screen组件中的static options对象的
回头看我们的代码。这里的ModalStack是我们当前导航的外界接口,在实际程序中我们需要将它export出去供其他文件调用,虽然我们提供的是一个navigation对象,但是它实际上会我们展示routeconfigs的第一个键值对,也就是当前程序的Home
const{navigate}=this.props.navigation;
这句话可以类比为我取出this.props.navigation对象中的navigate,为什么会在this.props中?(持续更新....)我们stackNavigatior在构造的时候会将自身的对象当做参数一样传递到每个组件或者界面的props中去,方便每个组件或者界面能操作顶层的stack对象。
StackNavigatorConfig
这是一个optional对象,意味着我只有特定需求的时候才会去设置这个对象,详情请查看文档
TabNavigator
Used to easily set up a screen with several tabs with a TabRouter.
我们打开src/MainTabbar/maintabbar.js
TabNavigator(RouteConfigs,TabNavigatorConfig) 文档点这里
routeConfigs部分和stackNavigator一样
TabNavigatorConfig
tabBarPosition:position of the tab bar, can be 'top' or 'bottom' 这里的top是android的默认风格,bottom是iOS的默认风格
swipeEnabled:是否允许手势切换
animationEnabled:是否有动画效果
lazy:懒加载
whether to lazily render tabs as needed as opposed to rendering them upfront