1.zIndex

在Android上使用zIndex来控制组件的层级,会遇到元素不显示的问题。
解决方案:
尽量改变组件的顺序,而不用zIndex
尽量不要使用zIndex来控制组件的层级,默认情况下,使用position: 'absolute'后,后面的元素会默认覆盖在前面的元素之上。所以删除zIndex,改变一下组件的顺序就OK啦。
issues: https://github.com/facebook/react-native/issues/8968

2.borderStyle:'dashed'

目前,Android上,如果想要实现一条水平方向的虚线,一开始想到的肯定是:

border: {
borderColor: 'red',
borderWidth: 0,
borderBottomWidth: 1,
borderStyle: 'dashed'
}

但是实际上,这样是不会生效的,目前Android还不支持某一边设置虚线。
解决方案:
方案一:假设我们想要一个线宽为h的水平虚线,设置一个高度为h的view,里面给一个view设置四边都是dashed的边框,borderWidth为h,高度为0,然后外层设置overflow: 'hidden'但是,你会发现,不管你怎么overflow,都是没用的,Android照样会渲染出两个边框,看起来overflow也没有起作用。
方案二:换一种思路,再弄一个view,高度为h,背景颜色设置成你想要的颜色,然后把下面的border覆盖掉。
此外,也可以关注下这个issue: Border is invisible when using borderStyle='dashed' with borderBottom #7838

3.TouchableOpacity等可点击组件,有时候点击不触发onPress

这个问题,如果你只是在代码里面放了类似下面的代码:

<TouchableOpacity
style={styles.btn}onPress={this.onPress.bind(this)}>
<Text>立即预定</Text>
</TouchableOpacity>

并且onPress回调里面,并没有做太多的逻辑,或者导致重新渲染。
那么,你没有必要怀疑是你代码的问题。RN对部分国产手机那些自定义的手势支持不好。

4.[style]Android上Text默认的字体颜色,不是black,不是black,不是black

如果在Android上面,不显示地给Text添加color,那么显示出来的字体颜色就是灰色。跟iOS的表现不一致;
解决方案:
方案一:给每个Text都设置color

不足:每次都设置color。比较繁琐

方案二:写一个自定义组件

比如MyText,这个Text设置颜色,每次使用xxx就默认为你设置的颜色了。
不足:多出来了一个新的组件,也比较繁琐。
多出来了一个新的组件,也比较繁琐。

方案三:设置默认props

在入口文件里面写上默认的style,比如:
Text.defaultProps.sytle = { 'color': '#212121'}

5.[ListView] renderRow 使用 this.state.xxx 属性,setState({xxx:'xxx'})的时候 ListView没有重新渲染

解决方案 重新设置 ListView 的 dataSource

6.[console] console.log()打印出来的对象,值不是最准确的,可能会受后面执行代码的影响。

7.[网络请求] 安卓机型连代理,有时抓不到请求

RN-andriod 用的网络模块是okhttp。这个模块有一个类似代理路由的功能。通过代理(比如charles)发送一个请求时,如果该请求timeout或者error了(比如abort),okhttp在下次发送请求时可能不走charles。导致请求发出去了,但是charles抓不到。

8.[ios模拟器] 配置localhost:port之后,请求不到js

如果没有提示说服务没有启动,提示404。基本上就是你电脑上没有配置localhost对应的host。可能有写hosts工具切换的时候,把localhost弄掉了。自己加回来:

127.0.0.1 localhost

9.RN0.46以上版本,使用touchable视图包裹TextInput组件,touchable视图上的onPress事件不能触发

<TouchableOpacity>
<TextInput /> <---- touch not working here
<Text>Text</Text> <---- touch working here
</TouchableOpacity>

这个属于官方未修复的问题,详见https://github.com/facebook/react-native/issues/14958
临时解决方案
TextInput包裹在一个View中,给这个视图的pointEvents的属性设置为none

<TouchableOpacity
onPress={()=>{console.log('press')}}>
<View pointerEvents='none'>
<TextInput editable={false} />
</View>
</TouchableOpacity>

10.TextInput问题

TextInput在安卓上默认有一个底边框,同时会有一些padding。如果要想使其看起来和iOS上尽量一致,则需要设置padding: 0,同时设置underlineColorAndroid="transparent"来去掉底边框。

11.内容对齐问题

新增的展示内容与原有的结构往往不同,上下对齐需要通过margin和padding来调整。以下是调整中遇到的问题及解决:

1.ios和adr的表现不一致,测试时需要两种机型都看下,在style中根据platform分别调整数值。

2.开发完后可能肉眼看觉得ok,但ui那边是通过画线验收,如上图所示。所以我们最好完了也用线对齐看看,减少修改的次数。

3.一行文字中同时存在汉字、数字、特殊符号时,它们有时不会底对齐,又或者ui要求垂直居中。这个可以通过lineHeight和paddingTop来调整。

4.必要时会用到0点几这种数值。

5.一行字里有文字有数字不对齐这种,也可以换个字体解决哈~ Helvetica Verdana Cochin 都可以。

12.RN中组件阴影解决方案

不知从什么时候开始,公司的UI偏爱给所有模块加上阴影效果,对于IOS系统,RN支持通过style设置阴影,但是Android系统着实让人头痛,在实践过程中先后使用过多种方法。

<View elevation={5} style={styles.container}>
<Text>Hello World !</Text>
</View>
  • IOS阴影实现方案

RN在ios系统上支持一系列阴影的样式属性,但这些属性在Andriod上不会生效。

container : {
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowRadius: 2,
shadowOpacity: 0.2
}
  • Android阴影实现方案

(1)使用elevation属性

<View elevation={2} style={styles.container}>
<Text>Hello World !</Text>
</Vie
container : {
shadowColor: '#000',
shadowOffset: { width: 0, height: 2 },
shadowRadius: 2,
shadowOpacity: 0.2,
elevation: 2
}

这个属性可以写在样式里也可以直接当做组件的属性,使用这个属性可以产生一定的阴影效果,但是阴影颜色、透明度等都不能定制,大多数情况下并不满足UI的要求。

(2)使用Image组件做背景

<Image style={styles.bgImg} source={{uri:bgImg}} resizeMode="stretch">
<YourView />
</Image>

或者

<View>
<Image style={styles.bgImg} source={{uri:bgImg}} resizeMode="stretch" />
<YourView />
</View>

设置Image的样式未绝对定位铺满容器,类似于下面的ImageBackground,RN0.46.4加入了一个组件ImageBackground,可以像上面类似的方式使用.源码非常简单,https://github.com/facebook/react-native/blob/master/Libraries/Image/ImageBackground.js

'use strict';
const Image = require('Image');
const React = require('React');
const StyleSheet = require('StyleSheet');
const View = require('View');
const ensureComponentIsNative = require('ensureComponentIsNative');
import type {NativeMethodsMixinType} from 'ReactNativeTypes'; class ImageBackground extends React.Component {
setNativeProps(props: Object) {
// Work-around flow
const viewRef = this._viewRef;
if (viewRef) {
ensureComponentIsNative(viewRef);
viewRef.setNativeProps(props);
}
} _viewRef: ?NativeMethodsMixinType = null; _captureRef = ref => {
this._viewRef = ref;
}; render() {
const {children, style, imageStyle, imageRef, ...props} = this.props;
return (
<View style={style} ref={this._captureRef}>
<Image
{...props}
style={[
StyleSheet.absoluteFill,
{
// Temporary Workaround:
// Current (imperfect yet) implementation of <Image> overwrites width and height styles
// (which is not quite correct), and these styles conflict with explicitly set styles
// of <ImageBackground> and with our internal layout model here.
// So, we have to proxy/reapply these styles explicitly for actual <Image> component.
// This workaround should be removed after implementing proper support of
// intrinsic content size of the <Image>.
width: style.width,
height: style.height,
},
imageStyle,
]}
ref={imageRef}
/>
{children}
</View>
);
}
} module.exports = ImageBackground;

类似这种使用图片都阴影背景的方式,一般设置里面内容的背景色为透明色,在实践过程中有时会出现背景图片还未加载完成,但里面的内容已加载完成的情况,会出现背景的一个跳变。

<Image style={styles.bgImg} source={{uri:bgImg}} resizeMode="stretch">
<View style={[styles.bg,StyleSheet.absoluteFill]}></View>
<YourView/>
</Image>

目前我采用的方案是使用一个单独的View垫底,较好的解决了这个问题。但是图片拉伸变形的问题估计没有好的解决方案了。

(3).使用“点9图(.9图)”封装一个Native组件
Android系统支持一个牛叉的东西叫“点9图”,以前真没听过,估计原生开发知道这个东西,它有一个特点是拉伸后不会变形,包括圆角。关于点9图的概念可以参考.9.PNG是啥?.关于如何原生封装一个带有点9图背景的组件,我也不知道啊,这部分是原生开发实现的。参考React Native显示点9图片,也许有帮助,现在我们业务线都是使用这种方式,效果比较好。

React-Native采坑总结的更多相关文章

  1. React native采坑路 Running 1 of 1 custom shell scripts

    1. Running 1 of 1 custom shell scripts 卡住的问题. 分析: 四个文件没有下载完成. boost_1_63_0.tar.gz folly-2016.09.26.0 ...

  2. React Native之坑总结(持续更新)

    React Native之坑总结(持续更新) Genymotion安装与启动 之前我用的是蓝叠(BlueStack)模拟器,跑RN程序也遇到了一些问题,都通过搜索引擎解决了,不过没有记录. 但是Blu ...

  3. React Native 填坑一

    React Native 填坑一 关于RN的布局 分为主轴和交叉轴, 主轴可以是横向也可以是竖向,交叉轴也是对应的. 主轴默认是竖向.如果要更改用flexdirection 主轴对齐方式:justif ...

  4. React Native踩坑Tip

    最近在使用React Native(以下简称RN)中踩了个坑,RN只能异步调用原生方法,所以在原生方法直接调用UI刷新操作需要将任务递交到主线程才可以. RCT_EXPORT_METHOD(finis ...

  5. React Native填坑之旅--与Native通信之iOS篇

    终于开始新一篇的填坑之旅了.RN厉害的一个地方就是RN可以和Native组件通信.这个Native组件包括native的库和自定义视图,我们今天主要设计的内容是native库方面的只是.自定义视图的使 ...

  6. React Native填坑之旅--组件生命周期

    这次我们来填React Native生命周期的坑.这一点非常重要,需要有一个清晰的认识.如果你了解Android或者iOS的话,你会非常熟悉我们今天要说的的内容. 基本上一个React Native的 ...

  7. React Native填坑之旅--Flow篇(番外)

    flow不是React Native必会的技能,但是作为正式的产品开发优势很有必要掌握的技能之一.所以,算是RN填坑之旅系列的番外篇. Flow是一个静态的检查类型检查工具,设计之初的目的就是为了可以 ...

  8. React Native填坑之旅--重新认识RN

    如同黑夜里的一道光一样,就这么知道了F8. F8是每年一次Facebook每年一次的开发者大会.每次大会都会release相应的APP,iOS.Android都有.之前都是用Native开发的,但是2 ...

  9. React Native填坑之旅--布局篇

    代码在这里: https://github.com/future-challenger/petshop/tree/master/client/petshop/src/controller 回头看看RN ...

  10. React Native填坑之旅--Navigation篇

    React Native的导航有两种,一种是iOS和Android通用的叫做Navigator,一种是支持iOS的叫做NavigatorIOS.我们这里只讨论通用的Navigator.会了Naviga ...

随机推荐

  1. python基础3 字符串常用方法

    一. 基础数据类型 总览 int:用于计算,计数,运算等. 1,2,3,100...... str:'这些内容[]'    用户少量数据的存储,便于操作. bool: True, False,两种状态 ...

  2. 舵机&数据处理&stm32内存之堆栈溢出(遇到的问题)

    产品名称:TOWER PRO(辉盛)大扭力舵机MG996R (MG995升级产品)6v/11Kg厂家编号:MG996R产品净重: 55g产品尺寸: 40.7*19.7*42.9mm产品拉力: 9.4k ...

  3. LOJ2340 [WC2018] 州区划分 【FMT】【欧拉回路】

    题目分析: 这题是WC的题??? 令 $g[S] = (\sum_{x \in S}w_x)^p$ $h[S] = g[S]$如果$S$不是欧拉回路 $d[S] = \frac{f[S]}{g[All ...

  4. Codeforces 1077E Thematic Contests(二分)

    题目链接:Thematic Contests 题意:给出n道有类型的题目,每天组织一场专题比赛,该天题目数量必须是前一天的2倍,第一天的题目数量可以任意选择,求能消耗的最多题目数量. 题解:先整理成不 ...

  5. [SCOI2015]小凸想跑步

    题目描述 小凸晚上喜欢到操场跑步,今天他跑完两圈之后,他玩起了这样一个游戏. 操场是个凸 n 边形, nn 个顶点按照逆时针从 0 ∼n−1 编号.现在小凸随机站在操场中的某个位置,标记为p点.将 p ...

  6. 2018ICPC青岛现场赛 重现训练

    先贴代码,以及简要题解. 和一个队友下午双排打了一下,队友光速签到,我签的J被嫌弃写得慢以及演员...然后我秒出了E了思路然而难以置信这么简单的思路当时才过了十几个,于是发现D.F不是太好做.最后交了 ...

  7. Python3 与 C# 并发编程之~ 进程篇

      上次说了很多Linux下进程相关知识,这边不再复述,下面来说说Python的并发编程,如有错误欢迎提出- 如果遇到听不懂的可以看上一次的文章:https://www.cnblogs.com/dot ...

  8. mybatis的if判断integer

    昨天在使用mybatis的if判断integer时遇见一个小问题: <if test="isChoose != null and isChoose != '' and isChoose ...

  9. Django订单接入支付宝

    1.. 去支付宝申请 https://open.alipay.com/platform/home.htm 注:因为创建应用正式接入支付宝需要营业执照,所以我们可以使用沙箱环境来测试. 2. 一次选择管 ...

  10. MySQL_表锁_lock tables tableName read

    pre.环境准备 1.建立两个表S,T,并插入一些数据 --创建表S create table S(d int) engine=innodb; ); --创建表T create table T(c i ...