react native 常见问题

1. 使用 react native 用不用配置 Android Studio

使用 React Native 是否需要配置 Android Studio,取决于你使用哪种开发方案

(1)如果使用 Expo(推荐初学者):

❗不需要配置 Android Studio 也能开发和运行 React Native 项目!

🌟 特点:

  • 快速启动,开箱即用;

  • 可以直接在手机上运行(通过 Expo Go App 扫码预览);

  • 不需要配置原生开发环境(Android Studio / Xcode);

  • 适合开发 不需要原生模块 的项目。

你需要做的:

npm install -g expo-cli
npx create-expo-app my-app
cd my-app
npx expo start

扫码后可直接在真机中预览和调试。

(2)如果使用 React Native CLI(原生开发):

需要配置 Android Studio(或 Xcode),才能运行和构建项目。

2. 使用 React Native做开发,避免了我们使用Kotlin 或者Swift么

是的,使用 React Native 做开发,确实可以避免直接使用 Kotlin 或 Swift 进行大部分 App 的开发工作,原因如下:

 React Native 避免使用 Kotlin / Swift 的原因:

对比项Kotlin / SwiftReact Native
平台Kotlin:Android
Swift:iOS
一套代码跨平台(iOS + Android)
语言原生语言(分别为 Android 和 iOS)JavaScript / TypeScript
开发体验需学习两个平台的开发体系使用熟悉的 React 技术栈
UI 构建使用原生 View(XML / Storyboard)使用 React 组件(JSX)
状态管理自行维护(如 ViewModel + LiveData)可以用 Redux、MobX 等前端生态
热更新原生不支持支持热重载 / Fast Refresh

 

❗但注意:React Native 不是完全替代原生开发

虽然大多数业务场景都能用 React Native 完成,但 某些高性能或硬件相关场景 可能还是需要编写部分 Kotlin / Swift 原生代码,例如:

  • 视频处理、音视频播放

  • 蓝牙、传感器、AR 相关

  • 与已有原生 SDK 的集成(如支付宝 SDK)

  • 深度定制 UI 控件

不过这些情况可以通过 Native Module(原生模块)进行扩展,React Native 提供了 JS 与原生代码的通信机制(Bridge / TurboModule)。

3. Stack.Navigator 和 Tab.Navigator 区别

Stack.NavigatorTab.Navigator 是 React Navigation 提供的两种不同类型的导航器(Navigator),它们的核心区别在于 UI 样式、导航行为和使用场景不同

(1)Stack.Navigator:栈式导航(Stack Navigation)

原理:

模拟浏览器前进/后退机制,每个页面压入一个“栈”,点击“返回”就弹出当前页面。

UI 表现:

  • 页面从右侧滑入(iOS 风格)

  • 默认有返回按钮

适用场景:

  • 登录注册流程

  • 表单填写流程

  • 多步操作页面(如提交订单)

示例代码:

import { createNativeStackNavigator } from '@react-navigation/native-stack';

const Stack = createNativeStackNavigator();

<Stack.Navigator>
  <Stack.Screen name="Login" component={LoginScreen} />
  <Stack.Screen name="Register" component={RegisterScreen} />
</Stack.Navigator>

 

✅ (2) Tab.Navigator:底部标签导航(Tab Navigation)

原理:

固定底部的 Tab 栏,每个 Tab 是一个独立页面,点击切换页面而不是压栈。

UI 表现:

  • 底部有按钮切换(常见的:首页我的设置

  • 页面不会被“覆盖”,而是“切换”

适用场景:

  • 主界面导航

  • 多功能模块平级切换(如微信的聊天/发现/我)

示例代码

import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';

const Tab = createBottomTabNavigator();

<Tab.Navigator>
  <Tab.Screen name="Home" component={HomeScreen} />
  <Tab.Screen name="Profile" component={ProfileScreen} />
</Tab.Navigator>

 

 (3) 区别总结表

对比点Stack.NavigatorTab.Navigator
导航方式栈式压入(前进/返回)标签切换(平级跳转)
UI 表现页面滑动进入,有返回按钮底部栏切换,通常无返回按钮
常用场景登录页、详情页、操作流程页首页、我的、设置等主模块
页面状态页面切换后销毁(默认)页面保留状态(除非配置卸载)

(4) React Navigation 导航类型一览

类型用途UI 表现场景
Stack.Navigator栈式导航页面前进/后退表单、详情页
Tab.Navigator底部导航标签切换首页、我的
Drawer.Navigator抽屉菜单左右滑出菜单设置页、侧边栏导航
MaterialTopTabNavigator顶部 Tab顶部切换 + 滑动新闻类、分类切换
嵌套导航灵活组合多层级结构大型 App
NavigationContainer导航容器无 UI所有导航的入口

 

(5) 导航操作函数(Navigation API)

📦 常见操作:

  • navigation.navigate('Page') → 跳转

  • navigation.goBack() → 返回

  • navigation.replace() → 替换当前页

  • navigation.reset() → 重置整个导航栈

4. React Native 中的核心组件,是对原生组件的封装

(1) 什么是“核心组件”?

React Native 提供了一些内置组件(也叫核心组件,Core Components),如:

组件名功能对应平台原生控件
View布局容器iOS: UIView / Android: ViewGroup
Text显示文字iOS: UILabel / Android: TextView
Image图片展示iOS: UIImageView / Android: ImageView
ScrollView滚动容器iOS: UIScrollView / Android: ScrollView
TextInput文本输入框iOS: UITextField / Android: EditText
Pressable / TouchableOpacity可点击区域iOS: UIButton / Android: Button

这些组件是 JavaScript 层的封装形式,它们的底层本质,最终会渲染成原生平台上的 UI 组件

(2) 为什么要“封装原生组件”?

React Native 的目标是:用 JS 编写跨平台 App,最终呈现原生体验

为了实现这一点,它把 iOS / Android 各自的原生控件 用统一的 API(如 <View>)包装起来,让开发者可以:

  • 不用直接写原生代码(如 Swift / Kotlin)

  • 通过 React 风格的组件来控制原生界面

 你写的 JSX:

<View>
  <Text>Hello World</Text>
</View>

 最终通过 React Native 框架,被转译为原生控件:

  • 在 iOS 中是一个 UIView + UILabel

  • 在 Android 中是一个 ViewGroup + TextView

 

 (3) 这背后发生了什么?

React Native 框架内部有一个桥(Bridge)机制,会把你写的 JS 代码转换为原生组件的命令。

即:你在 JS 写 <Text>Hello</Text>,React Native 会通过 Bridge 告诉系统“创建一个 TextView,内容是 Hello”。

React Native 的运行时将自动完成:

  • 组件渲染 → 转换成原生 UI 控件

  • 样式转换(JS 中写 style={{ color: 'red' }} → 原生的属性样式)

  • 事件绑定(比如点击事件、滚动事件)

(4) 举个简单类比

你可以把 React Native 理解为:

一种 中介层,它把“前端 React 风格的语法”翻译成“iOS / Android 的原生控件”。

就像:

你写的实际呈现
<Text>iOS:UILabel
<Image>Android:ImageView
<Button>iOS/Android:系统原生按钮控件
<FlatList>iOS:UITableView / Android:RecyclerView

(5) 为什么这种封装很重要?

它带来了几个好处:

  • 跨平台开发统一 API(你写一份代码,两个平台都能跑)

  • 性能好(底层是原生控件,不是网页 WebView)

  • 学习成本低(只要会 React 和 JS 就能写 App)

总结一句话:

React Native 的核心组件(如 View、Text、Image 等),本质是 React 层的 JavaScript 包装器,它们会映射到底层 iOS/Android 的原生控件,从而实现跨平台的原生 UI 渲染效果

5. ExpoReact Native 的关系

(1) Expo 是什么?

Expo 是一个 React Native 的开发工具链和平台,它基于 React Native,帮你简化了项目的搭建、打包、测试、发布流程。

一句话解释:Expo 是构建 React Native App 的“加速器”和“打包助手”

它帮你省掉了以下麻烦事:

功能如果不用 Expo 要做什么有了 Expo 之后
环境搭建手动安装 Android Studio、Xcode、配置 SDK一行命令 npx create-expo-app 就行
真机预览配置模拟器或 USB 调试扫码即开,无需模拟器
打包发布需要配置原生打包脚本、证书等一条命令 npx expo export 自动搞定
原生模块管理需要配置原生代码(如相机、推送)Expo 已封装大多数常用功能(如摄像头、定位)

 

(2) Expo 与 React Native 的关系

  • React Native 是底层框架(核心):提供 <View> <Text> <Image> 等核心组件,桥接 JS 与原生 UI。

  • Expo 是上层工具平台:基于 React Native 提供“更友好的开发体验”。

我们可以这样比喻:

React Native 就像 Android 原生系统
Expo 就像小米定制的 MIUI 系统(基于安卓,但加入了很多便捷工具)

 

✅ React Native 是必须的,Expo 是可选的。

你可以:

方式说明
用 React Native 原生方式搭建你要手动配置 iOS/Android 原生环境、手动引入原生模块
用 Expo 搭建零配置,快速开发,但默认不能写原生代码(可通过 eject 弹出)

(3) Expo 有什么优点?

优点说明
📦 零配置开发环境不用安装 Xcode / Android Studio 也能写 App
📱 手机扫码预览使用 Expo Go app 实时查看代码效果(连真机都不用连接)
🛠 丰富的内置 API拍照、推送、定位等常用原生功能都内置好了
🧪 热重载和调试开发时支持 HMR 热重载、Web 控制台调试
☁️ 一键打包和发布你不需要动原生打包工具就能打包 APK / IPA 上传商店

(4) Expo 有什么限制?

限制说明
❌ 无法使用不支持的原生模块如果你需要自定义原生代码(写 Java/Swift),Expo 默认不支持
✅ 可通过 eject 解决Expo 支持一键 eject,把项目变成纯 React Native 项目,获得原生能力

(5) 总结一句话

**Expo 是构建 React Native 应用的开发平台,它简化了 React Native 的开发流程,适合快速开发和体验原型。**React Native 是底层核心框架,Expo 是它的开发加速器。

(6) 什么时候该用 Expo?

适合用 Expo 的场景不适合用 Expo 的场景
刚入门 React Native你需要写原生模块(如蓝牙、支付 SDK)
做 MVP 原型开发项目对体积和性能极致要求
想快速上线 App需要对 Android/iOS 原生系统做高度定制
不熟悉 Android Studio/Xcode-

6. FlatList, SectionList, VirtualizedList

(1) FlatList:适合“扁平数据”列表

  • 使用场景:纯列表数据,比如消息列表、商品列表。

  • 数据结构:一维数组。

<FlatList
  data={[{ id: '1', title: 'Item1' }, { id: '2', title: 'Item2' }]}
  renderItem={({ item }) => <Text>{item.title}</Text>}
  keyExtractor={item => item.id}
/>

 

(2) SectionList:适合“分组数据”列表

  • 使用场景:有分组(section header)需求的列表,比如城市索引列表、聊天记录(按日期分组)。

  • 数据结构:嵌套数组(每一组是一个 section)。

<SectionList
  sections={[
    { title: 'A', data: ['Apple', 'Avocado'] },
    { title: 'B', data: ['Banana', 'Blueberry'] },
  ]}
  renderItem={({ item }) => <Text>{item}</Text>}
  renderSectionHeader={({ section: { title } }) => (
    <Text style={{ fontWeight: 'bold' }}>{title}</Text>
  )}
  keyExtractor={(item, index) => item + index}
/>

 

总结对比表:

比较项FlatListSectionList
数据结构一维数组多维数组(带 titledata
是否支持分组❌ 不支持✅ 支持(带分组标题)
场景聊天记录、商品列表城市索引、分类菜单、历史记录(按天)
Header 支持✅ 支持 ListHeaderComponent✅ 支持 renderSectionHeader

(3) VirtualizedList

VirtualizedList 是 React Native 中所有高性能列表组件(如 FlatListSectionList)的底层基础组件,它是最通用、可定制性最高的虚拟列表实现

FlatListSectionList 是对 VirtualizedList 的封装,简化了使用场景。
如果你有复杂数据结构或者特别的性能需求,可以直接使用 VirtualizedList

✅ 为什么叫 “Virtualized”

“Virtualized” 的意思是“虚拟化渲染” —— 只渲染可视区域的列表项,随着滚动懒加载其他内容,以提高性能、避免卡顿。

import { VirtualizedList, Text } from 'react-native';

const MyVirtualizedList = () => {
  const data = Array.from({ length: 1000 }, (_, i) => `Item ${i + 1}`);

  return (
    <VirtualizedList
      data={data}
      initialNumToRender={10}
      renderItem={({ item }) => <Text>{item}</Text>}
      keyExtractor={(item, index) => index.toString()}
      getItemCount={() => data.length}
      getItem={(data, index) => data[index]}
    />
  );
};

 

和 FlatList 的区别?

特性FlatListVirtualizedList
数据结构扁平数组任意结构(只需提供 getItem 等)
使用难度简单较复杂,需手动实现 getItem 等
推荐使用场景绝大多数常规列表场景特殊数据结构、大型数据处理场景
是否底层组件❌ 封装后的组件✅ 是 FlatList、SectionList 的基础

使用建议

  • 常规列表 → 用 FlatList

  • 有分组 → 用 SectionList

  • 非常规结构 / 高级需求 → 用 VirtualizedList

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值