react-navigation
安卓端React Navigation的TabNavigator选项卡与react-native-scrollable-tab-view、FlatList一起使用,只显示第一页的内容。
解决方案: 给TabNavigator增加lazy: true 属性,官方解释,whether to lazily render tabs as needed as opposed to rendering them upfront
FlatList 初始化时不显示列表,需要拖拽一下才显示当 React Navigation 与 FlatList 配合使用时,会出现初始化时不显示列表的bug,必须要拖拽一下,才会正常显示
解决方案: 此时需要给FlatList设置removeClippedSubviews={false} 属性,即可解决问题(目前最新版0.46貌似已经解决了此bug),官方文档解释如下:
注意:removeClippedSubviews属性目前是不必要的,而且可能会引起问题。如果你在某些场景碰到内容不渲染的情况(比如使用LayoutAnimation时),尝试设置removeClippedSubviews={false}。我们可能会在将来的版本中修改此属性的默认值。
快速点击重复跳转
react-navigation目录下src/addNavigationHelpers.js
export default function<S: *>(navigation: NavigationProp<S, NavigationAction>) {
// 添加点击判断
let debounce = true;
return {
...navigation,
goBack: (key?: ?string): boolean =>
navigation.dispatch(
NavigationActions.back({
key: key === undefined ? navigation.state.key : key,
}),
),
navigate: (routeName: string,
params?: NavigationParams,
action?: NavigationAction,): boolean => {
if (debounce) {
debounce = false;
navigation.dispatch(
NavigationActions.navigate({
routeName,
params,
action,
}),
);
setTimeout(
() => {
debounce = true;
},
500,
);
return true;
}
return false;
},
/**
* For updating current route params. For example the nav bar title and
* buttons are based on the route params.
* This means `setParams` can be used to update nav bar for example.
*/
setParams: (params: NavigationParams): boolean =>
navigation.dispatch(
NavigationActions.setParams({
params,
key: navigation.state.key,
}),
),
};
}
单页面设置navigationOptions中, 使用this
static navigationOptions = ({navigation, screenProps}) => ({
headerTitle: '登录',
headerLeft:(
<Text onPress={()=>navigation.state.params.navigatePress()} style={{marginLeft:5, width:30, textAlign:"center"}} >
<Icon name='ios-arrow-back'size={24} color='white' />
</Text>
)
});
_onBackAndroid=()=>{
alert('点击headerLeft');
}
componentDidMount(){
//在static中使用this方法
this.props.navigation.setParams({ navigatePress:this._onBackAndroid })
}
大多数页面都是push(从右往左),某些页面想从下往上
const TransitionConfiguration = () => ({
screenInterpolator: (sceneProps) => {
const { scene } = sceneProps;
const { route } = scene;
const params = route.params || {};
const transition = params.transition || 'forHorizontal';
return CardStackStyleInterpolator[transition](sceneProps);
},
});
const Navigator = StackNavigator (
{
// Root:{screen: FilterNews},
Root: {screen: Tab},
CompanyDetail: {screen: CompanyDetail},
LawOption: {screen: LawOption},
},
{
transitionConfig: TransitionConfiguration,
initialRouteName: 'Root',
navigationOptions: { //不要在此处设置 否则后面全部被覆盖
headerStyle: [Style.shadow, {backgroundColor: 'white',borderBottomColor:'white'}],
headerBackTitle: null,
headerTintColor: '#192847',// 返回箭头颜色
showIcon: true,
swipeEnabled: true,//是否可以滑动返回
animationEnabled: true,//是否带动画
gesturesEnabled: true,// 是否支持手势返回
headerTitleStyle: {fontSize: 18, color: Color.textBlack, alignSelf:'center'},//定义title的样式
cardStyle: {
backgroundColor: 'transparent',
},
},
// transitionConfig: (): Object => ({
// containerStyle: {
// backgroundColor: 'transparent',
// },
// }),
}
)
// 使用的时候 ,参数加一个 transition: 'forVertical'
this.props.navigation.navigate('Login', {transition: 'forVertical', someValue: 0})
从下往上背景色是黑色
react-navigation/src/views/CardStack/TransitionConfigs.js
里 ModalSlideFromBottomIOS -> backgroundColor 改为 ‘#fff’
android 有键盘的时候会把 tabBar 顶起来(tabBar悬浮在键盘上方)
工程目录->android->app->src->main->AndroidManifest.xml-> <activity android:name=".MainActivity"
android:windowSoftInputMode="adjustResize"
替换为
android:windowSoftInputMode="stateAlwaysHidden|adjustPan"
返回指定页面
tabA 跳转到 tabB (tabNavigator, tabA页面内点击某个按钮跳转到tabB)
android 标题不居中
方案一:
const Stack = StackNavigator(
{
Tab: {
screen: Tab,
navigationOptions: ({navigator}) => ({
// drawerLockMode: 'locked-closed',
})
},
First: {screen: First},
},
{
navigationOptions: {
headerBackTitle: null,
headerTitleStyle: {fontSize: Common.headrTitleSize, alignSelf: 'center', textAlign: 'center'},//定义title的样式
headerRight: (
<View />
)
},
}
)
总处设置, 基本 OK
具体页面内设置的navigationOptions 会覆盖上面总处 navigationOptions 的选项
具体页面内 navigationOptions 如果重新设置了 headerTitleStyle, 就需要在具体处headerTitleStyle 添加 alignSelf: 'center'
另外方案一在没有返回按钮的页面中标题可能会偏左,解决方案就是类似,在页面设置 headerLeft 为一个空View
headerLeft: (
<View />
)
方案二:
MyProject/node_modules/react-navigation/src/views/Header/Header.js
Line 392
alignItems: Platform.OS === 'ios' ? 'center' : 'flex-start',
替换为
alignItems: 'center',
Line 196
_renderTitle 方法中注销掉安卓部分的判断,或者把下面整段都注销
if (Platform.OS === 'android') {
// if (!options.hasLeftComponent) {
// style.left = 0;
// }
// if (!options.hasRightComponent) {
// style.right = 0;
// }
}
相对来说方案二更省事,高效,污染少,但是每次 npm install 后都需要重新来一遍
react-navigation的更多相关文章
- react-native 学习 ----- React Navigation
很久没有的登陆博客园了,密码都是找回的,从当年的大学生已经正常的走上了程序员的道路,看到之前发的博客还是写的android,现在自己已经在使用了react-native了. 大学毕业了,做了java后 ...
- react-native导航器 react navigation 介绍
开发环境搭建好之后,想要进一步了解react-native,可以先从react-native官网上的电影列表案例入手: https://reactnative.cn/docs/0.51/sample- ...
- React Navigation & React Native & React Native Navigation
React Navigation & React Native & React Native Navigation React Navigation https://facebook. ...
- [RN] 04 - React Navigation
react-navigation和react-router的对比: 支持的平台: react-navigation: react-native react-router: react-native.r ...
- React Native常用组件之TabBarIOS、TabBarIOS.Item组件、Navigator组件、NavigatorIOS组件、React Navigation第三方
以下内容为老版本React Native,faceBook已经有了新的导航组件,请移步其他博客参考>>[我是传送门] 参考资料:React Navigation react-native ...
- React-native 导航插件React Navigation 4.x的使用
React-native 导航插件React Navigation 4.x的使用 文档 英文水平可以的话,建议直接阅读英文文档 简单使用介绍 安装插件 yarn add react-navigatio ...
- [RN] React Navigation 使用中遇到的显示 问题 汇总
React Navigation 使用中遇到的显示 问题 汇总 https://www.jianshu.com/p/8b1f18affc5d
- react navigation goBack()返回到任意页面(不集成redux) 一
方案一: 一.适用场景:在app端开发的时候,相反回到某一个页面的时候保持跳转页面的所有状态不更新,也就是说不触发新的生命周期. 例如:A——>B——>C——>D 要想从D页面直接返 ...
- React Navigation / React Native Navigation 多种类型的导航结合使用,构造合理回退栈
React Navigation 更新到版本5已经是非常完善的一套导航管理组件, 提供了Stack , Tab , Drawer 导航方式 , 那么我们应该怎样设计和组合应用他们来构建一个完美的回退栈 ...
- React Navigation基本用法
/** * Created by apple on 2018/9/23. */ import React, { Component } from 'react'; import {AppRegistr ...
随机推荐
- HAproxy+Keepalived实现高可用
HAproxy+Keepalived实现高可用 说明: HA1:HAproxy+Keepalived(master) HA2:HAproxy+Keepalived(backup) 1.HA1上keep ...
- DvaJS构建配置React项目与使用
DvaJS构建配置React项目与使用 一,介绍与需求分析 1.1,介绍 dva 首先是一个基于redux 和redux-saga的数据流方案,然后为了简化开发体验,dva 还额外内置了react-r ...
- 所谓guard进程不能启动
1.网络开关的配置是true还是false? 2.服务里有个循环,所以不用打messagebox也是可以调试的. 3.虽然调式时条件变量已经变化,可以把断点拉到促成这个变化的逻辑路径上. 4.可以在调 ...
- 为什么说是时候拥抱.NET CORE了?
微软和社区已经做了大量艰苦的工作,使.Net Core成为市场上具有竞争力的框架,帮助开发人员快速开发具有最佳性能和可扩展性的强大应用程序.做的最棒的事情是.Net Framework开发人员不需要任 ...
- Excel催化剂开源第38波-json字符串转多个表格结构
作为开发者来说,面对json字符一点不陌生,但对于普通用户来说,更合适的是数据表结构的数据,最好数据已经躺在Excel表格内,不用到处导入导出操作.所以开发者和用户之间是有不同的数据使用思维和需求的. ...
- TensorFlow笔记-线程和队列
线程和队列 在使用TensorFlow进行异步计算时,队列是一种强大的机制. 为了感受一下队列,让我们来看一个简单的例子.我们先创建一个“先入先出”的队列(FIFOQueue),并将其内部所有元素初始 ...
- 用python输出回文数
一个b站上的朋友问我,怎么返回五位数的回文数的个数. 我首先百度回文数的概念,就是正读和倒读都一样的数字,例如:10001,99899 等等 数字的位数拆分一头雾水,思来想去,用字符串的方法完美解决! ...
- myeclipse中更改默认jdk版本出错( Target is not a JDK root. System library was not found)
原因是我的本地jdk版本是9.0,将jdk版本更改至8.0即可导入成功. jdk9.0导入myeclipse中去会有此类问题的发生,因此没有必要使用最新的jdk版本.
- Python之父新发文,将替换现有解析器
花下猫语: Guido van Rossum 是 Python 的创造者,虽然他现在放弃了"终身仁慈独裁者"的职位,但却成为了指导委员会的五位成员之一,其一举一动依然备受瞩目.近日 ...
- JavaScript-基本语法和数据类型
前奏:在HTML中使用JavaScript 1_推荐src引用外部JavaScript文件,方便管理与维护,标签位置在页面最下面,使浏览器更优先加载页面内容. 2_HTML页面需要有标准 ...