基础概念
1. 什么是React Native?
答案:React Native是Facebook开发的一个开源框架,用于使用JavaScript和React构建原生移动应用程序。它允许开发者使用相同的代码库为iOS和Android平台开发应用,同时提供接近原生应用的性能和用户体验。
2. React Native和React有什么区别?
- React用于构建Web应用,而React Native用于构建移动应用
- React使用DOM和HTML标签,React Native使用原生组件
- React Native包含一些移动特定的API(如摄像头、地理位置等)
- React Native需要原生编译,而React直接在浏览器中运行
3. React Native的工作原理是什么?
答案:React Native使用JavaScriptCore引擎运行JavaScript代码,通过"桥接"(Bridge)机制与原生平台通信。UI组件被映射到原生组件,JavaScript线程和原生UI线程通过异步JSON消息进行通信。
4. 什么是JSX?
答案:JSX是JavaScript XML的缩写,是一种在JavaScript中编写类似HTML的语法扩展。它最终会被转译为React.createElement()调用,用于描述UI的结构。
5. React Native中的组件生命周期有哪些?
- 挂载阶段:constructor() → static getDerivedStateFromProps() → render() → componentDidMount()
- 更新阶段:static getDerivedStateFromProps() → shouldComponentUpdate() → render() → getSnapshotBeforeUpdate() → componentDidUpdate()
- 卸载阶段:componentWillUnmount()
核心组件与API
6. React Native中的核心组件有哪些?
答案:
- 基本组件:View, Text, Image, ScrollView, TextInput
- 列表组件:FlatList, SectionList
- 交互组件:Button, TouchableOpacity, TouchableHighlight
- 其他:ActivityIndicator, Modal, StatusBar, Switch
7. FlatList和ScrollView有什么区别?
答案:
- FlatList用于渲染长列表数据,只渲染当前可见项,性能更好
- ScrollView会一次性渲染所有子组件,适合内容不多的滚动视图
- FlatList支持分页加载、下拉刷新等列表特定功能
8. 如何在React Native中处理用户输入?
- 使用TextInput组件获取文本输入
- 使用Button或Touchable系列组件处理按钮点击
- 使用PanResponder处理复杂手势
- 使用onChangeText、onPress等回调处理用户交互
9. 什么是Flexbox布局?React Native中如何使用?
答案:Flexbox是一种CSS布局模型,React Native使用它来构建界面布局。主要属性包括:
- flex: 定义元素的伸缩能力
- flexDirection: 主轴方向(row/column)
- justifyContent: 主轴对齐方式
- alignItems: 交叉轴对齐方式
- flexWrap: 是否换行
10. 如何在React Native中处理图片?
答案:
- 使用Image组件显示图片
- 本地图片使用require()引入
- 网络图片使用uri属性指定URL
- 可以设置resizeMode控制图片显示方式
- 使用ImageBackground组件实现背景图片
状态管理与数据流
11. React Native中的状态(state)和属性(props)有什么区别?
答案:
- state是组件内部管理的可变数据
- props是从父组件传递下来的不可变数据
- 使用this.setState()更新state会触发重新渲染
- props变化也会触发重新渲染
- state适用于组件私有数据,props用于组件间通信
12. 什么是Context API?何时使用?
答案:Context API是React提供的一种跨组件层级传递数据的方式,避免"prop drilling"问题。适用于需要在组件树中多个层级共享的数据,如主题、用户认证状态等。
13. Redux在React Native中如何使用?
答案:
- 安装redux和react-redux
- 创建store、reducers和actions
- 使用Provider包裹根组件
- 使用connect或hooks(useSelector, useDispatch)连接组件
- 在组件中dispatch actions和访问state
14. React Hooks有哪些常用API?
答案:
- useState: 管理组件状态
- useEffect: 处理副作用
- useContext: 访问context
- useReducer: 复杂状态逻辑
- useCallback: 记忆函数
- useMemo: 记忆值
- useRef: 访问DOM或保存可变值
15. 如何优化React Native应用的性能?
答案:
- 使用PureComponent或React.memo减少不必要的渲染
- 正确使用key属性优化列表渲染
- 避免内联函数和对象
- 使用useCallback和useMemo记忆计算结果
- 减少桥接通信,避免频繁更新
- 使用Hermes引擎提升JS执行性能
导航与路由
16. React Navigation有哪些常用导航器?
答案:
- Stack Navigator: 提供基于堆栈的导航,新屏幕从右侧滑入
- Tab Navigator: 底部或顶部标签导航
- Drawer Navigator: 侧边抽屉导航
- Native Stack Navigator: 使用原生导航组件,性能更好
17. 如何在React Native中实现页面跳转?
答案:
使用React Navigation时:
navigation.navigate('RouteName', { params });
也可以使用:
navigation.push('RouteName'); // 允许重复跳转同一页面
navigation.goBack(); // 返回上一页
18. 如何传递参数给路由?
答案:
跳转时传递:
navigation.navigate('RouteName', { key: value });
接收参数:
const { key } = route.params;
19. 什么是深层链接(Deep Linking)?
答案:深层链接是指通过URL直接打开应用并导航到特定内容的功能。React Navigation提供了linking配置来处理深层链接,将URL映射到特定的导航状态。
20. 如何处理Android的返回按钮?
答案:
- 使用BackHandler API
- 在React Navigation中使用headerLeft自定义返回按钮
- 监听硬件返回按钮事件并处理
原生交互与模块
21. 什么是原生模块?如何创建?
答案:原生模块是React Native调用原生平台功能的桥梁。创建步骤:
- 创建继承ReactContextBaseJavaModule的Java类(Android)
- 创建实现RCTBridgeModule协议的Objective-C类(iOS)
- 使用@ReactMethod注解暴露方法
- 注册模块
- 在JavaScript中通过NativeModules访问
22. 如何调试React Native应用?
答案:
- 使用Chrome开发者工具调试JavaScript
- 使用React Native Debugger独立应用
- 使用Flipper进行高级调试
- 使用console.log输出日志
- 使用React DevTools检查组件层次结构
- 开启远程调试JS
23. 什么是Code Push?
答案:Code Push是微软提供的服务,允许开发者绕过应用商店直接向用户推送JavaScript代码和资源更新,实现热更新。
24. 如何处理不同平台的代码差异?
答案:
- 使用Platform模块检测平台
- 使用文件后缀(.ios.js/.android.js)区分平台代码
- 使用条件渲染
- 创建平台特定的组件封装
25. 如何集成第三方原生库?
答案:
- 使用npm/yarn安装JavaScript部分
- 链接原生依赖(react-native link或自动链接)
- 对于iOS可能需要pod install
- 可能需要手动配置(Android的gradle,iOS的podfile等)
- 遵循库的文档进行初始化
高级主题
26. 什么是Hermes引擎?
答案:Hermes是Facebook优化的JavaScript引擎,专门针对React Native应用优化,可提高启动时间、减少内存使用和缩小应用体积。
27. 如何实现动画效果?
答案:
- 使用Animated API创建基本动画
- 使用LayoutAnimation实现布局变化动画
- 使用react-native-reanimated库实现高性能动画
- 使用Lottie渲染After Effects动画
28. 什么是Fast Refresh?
答案:Fast Refresh是React Native的开发功能,可以在保存文件时快速更新应用,保持组件状态,提高开发效率。
29. 如何处理离线数据?
答案:
- 使用AsyncStorage存储简单数据
- 使用SQLite或realm处理结构化数据
- 使用redux-persist持久化Redux状态
- 实现离线优先策略,网络恢复后同步
30. React Native的未来发展趋势是什么?
答案:
- 新架构(Fabric、TurboModules、JSI)提升性能
- 更好的TypeScript支持
- 更紧密的原生集成
- 改进的热更新和部署流程
- 更丰富的原生组件和API
- 更强大的调试工具
希望这些问题和答案能帮助你准备React Native面试!根据具体职位要求,可能需要深入某些特定领域。