
React Native 踩坑记录
常见问题快问快答
文字组件内容超出边界
如何解决Text文字内容超出父组件问题?
尝试添加flexShrink: 1到容器和文字的样式.
路由堆栈重置
如何跳转到某个页面,并删除之前的所有页面历史?(比如退出登录后回到首页)
1 | import { useNavigation, CommonActions } from '@react-navigation/native'; |
输入框键盘控制
TextInput默认情况下会在点击输入框范围之外消失,如何禁止这种行为?(比如点击输入框右侧的按钮清空文字,默认情况下,需要点击两次才能达到效果)
如果不介意使用ScrollView的话,可以设置keyboardShouldPersistTaps={'always'},然后keyboardDismissMode={'on-drag'},这样点击就不会收回键盘了,拖动页面的时候才会收回。
如果用了ScrollView但是不希望页面滚动的话,可以设置scrollEnabled={false}禁止滚动;
ref转发
如何转发ref?(外部传入一个ref,我想将其绑定到我的一个子组件上?)
使用React.forwardRef<Ref类型,Props类型>()
示例代码:
1 | const SingleSelectBottomSheet = React.forwardRef<BottomSheetModal, SingleSelectBottomSheetProps>((props, ref) => { |
如何ref我的子组件本身?我想调用子组件的方法?
使用useImperativeHandlehook :
1 | interface LoadingToastProperties { |
React Navigation泛型
怎么写
useRoute以及useNavigation的泛型?
升级到react-navigation v6后,泛型必须要写了,否则会报错
useRoute泛型:
1 | const route = useRoute<RouteProp<any, any>>(); |
useNavigation泛型:
1 | const navigation = useNavigation<NavigationProp<any>>(); |
注意事项
状态异步
使用hooksetState之后,不要立即使用新的state,新的state会在下一次渲染的时候才有效;
1 | setCountries(value.data.data); |
一些棘手的问题
报错
invalid language tag
这个是NumberFormatter的报错,一般是参数传错了。
Reanimated 2 failed to create a worklet, maybe xxxxx
- 首先检查是不是安装了expo支持的reanimated版本,目前expo SDK 41支持的版本是2.1.0
- 这个似乎不重要,主要看下面两个
- 然后要检查
babel.config.js里面有没有添加reanimated的plugin,注意plugin要放在数组最后一个 - 最后如果还是有问题,尝试启动的时候使用
expo start --clear清除缓存,这条真的有用;输入框输入一个字符后,就会失去焦点
这个问题发生在TextInput渲染在列表内。问题的解决方案是,传参数的时候,不要传render function,传这个render function的执行结果,React Element
1 | ListHeaderComponent={makeListHeaderView} |
- 标题: React Native 踩坑记录
- 作者: Aron
- 创建于 : 2021-07-25 01:46:11
- 更新于 : 2025-10-14 09:29:25
- 链接: https://likeso.github.io/2021/07/25/react-native-cai-keng-ji-lu/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。