# expo-demo **Repository Path**: chenbool/expo-demo ## Basic Information - **Project Name**: expo-demo - **Description**: expo 学习案例 - **Primary Language**: JavaScript - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-06 - **Last Updated**: 2026-09-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Expo React Native 应用项目 ## 项目介绍 这是一个基于 Expo 和 React Native 的移动应用项目,使用了 Expo Router 实现导航和路由管理。项目采用 Tab 导航作为主要导航结构,并支持模态页面、参数传递等高级导航功能。 本项目旨在展示 Expo 和 React Native 的核心功能,包括导航、路由、组件构建、状态管理等,为开发者提供一个完整的参考示例。 ## 技术栈 - **React Native**: 用于构建跨平台移动应用的框架 - **Expo**: React Native 的开发平台,提供丰富的原生功能 - **Expo Router**: 基于文件系统的导航库,简化路由配置 - **React**: JavaScript 库,用于构建用户界面 - **expo-image**: 高性能图片组件 - **@expo/vector-icons**: 图标库 - **react-native-safe-area-context**: 安全区域上下文处理 - **react-native-screens**: 原生屏幕组件优化 ## 项目结构 ``` . ├── app/ # 应用页面和路由目录 │ ├── (tabs)/ # Tab 导航页面 │ │ ├── _layout.js # Tab 导航布局配置 │ │ ├── index.js # 首页(发现页面) │ │ ├── users.js # 用户中心页面 │ │ └── videos.js # 视频课程页面 │ ├── articles/ # 通知相关页面 │ │ └── index.js # 通知列表页面 │ ├── courses/ # 课程相关页面 │ │ └── [id].js # 课程详情页面(动态路由) │ ├── search/ # 搜索相关页面 │ │ └── index.js # 搜索页面 │ ├── settings/ # 设置相关页面 │ │ └── index.js # 设置页面 │ ├── teachers/ # 教师相关页面 │ │ └── [id].js # 教师详情页面(模态展示) │ ├── _layout.js # 应用根布局配置 │ └── details.js # 详情页面 ├── assets/ # 静态资源目录 │ ├── adaptive-icon.png # Android 自适应图标 │ ├── favicon.png # 网页 favicon 图标 │ ├── icon.png # 应用图标 │ ├── logo.png # 应用 Logo │ └── splash-icon.png # 启动页图标 ├── app.json # Expo 应用配置文件 ├── package.json # 项目依赖和脚本配置 └── README.md # 项目说明文档 ``` ## 核心功能详解 ### 1. 导航结构 #### Tab 导航 - **底部标签导航**: 包含"发现"、"视频课程"、"我的"三个主要功能模块 - **自定义导航栏**: 使用 Logo 作为标题,左右两侧分别放置通知、搜索和设置按钮 - **图标支持**: 使用 SimpleLineIcons 图标库为每个 Tab 提供视觉标识 #### 堆栈导航 - **页面堆栈管理**: 支持页面间的前进和后退操作 - **自定义转场动画**: 不同页面间使用不同的页面切换动画效果 - **标题配置**: 支持为每个页面单独配置标题和样式 #### 模态导航 - **模态页面展示**: 支持从底部滑入的模态页面展示(如教师详情页) - **自定义关闭按钮**: 在模态页面中提供关闭按钮,提升用户体验 ### 2. 页面功能详解 #### 首页 (app/(tabs)/index.js) - **多种导航示例**: 展示了 Link 组件导航、编程式导航、带参数导航等多种方式 - **交互组件**: 使用 TouchableOpacity 提供点击反馈 - **参数传递**: 演示了 URL 参数和 params 对象两种传参方式 #### 视频课程页 (app/(tabs)/videos.js) - **内容展示**: 展示视频课程相关内容 #### 用户中心页 (app/(tabs)/users.js) - **个人中心**: 展示用户相关信息 #### 通知列表页 (app/articles/index.js) - **信息展示**: 展示系统通知列表 #### 搜索页 (app/search/index.js) - **搜索功能**: 提供搜索功能入口 #### 设置页 (app/settings/index.js) - **应用设置**: 提供应用设置功能 #### 详情页 (app/details.js) - **通用详情**: 通用详情页面,包含返回功能 #### 课程详情页 (app/courses/[id].js) - **动态路由**: 根据 ID 展示特定课程信息 - **参数解析**: 使用 useLocalSearchParams 获取路由参数 #### 教师详情页 (app/teachers/[id].js) - **模态展示**: 以模态形式展示教师详细信息 ### 3. 导航示例详解 #### Link 组件导航 ```jsx 跳转到 详情页 (Link) ``` #### Link 组件与自定义组件结合 ```jsx 跳转到 详情页(Link + asChild) ``` #### 编程式导航 ```jsx router.navigate('/details')}> 跳转(navigate) ``` #### 带参数导航 ```jsx // URL 参数方式 跳转传参(Link) // params 对象方式 跳转传参(Link 使用 params) ``` ## 项目配置详解 ### app.json 配置说明 ```json { "expo": { "name": "test", // 应用名称 "slug": "test", // 应用唯一标识符 "version": "1.0.0", // 应用版本号 "scheme": "test", // 应用自定义 URL scheme "orientation": "portrait", // 屏幕方向,设置为竖屏 "icon": "./assets/icon.png", // 应用图标路径 "userInterfaceStyle": "light", // 用户界面样式,设置为浅色模式 "newArchEnabled": true, // 启用新架构 "splash": { "image": "./assets/splash-icon.png", // 启动页图片路径 "resizeMode": "contain", // 图片缩放模式 "backgroundColor": "#ffffff" // 启动页背景色 }, "ios": { "supportsTablet": true // iOS 平台是否支持平板 }, "android": { "adaptiveIcon": { "foregroundImage": "./assets/adaptive-icon.png", // Android 自适应图标前景图 "backgroundColor": "#ffffff" // Android 自适应图标背景色 }, "edgeToEdgeEnabled": true // Android 是否启用边缘到边缘显示 }, "web": { "favicon": "./assets/favicon.png" // 网页 favicon 图标路径 }, "plugins": [ "expo-router" // 使用的 Expo 插件,这里使用了 expo-router ] } } ``` ### package.json 配置说明 ```json { "name": "test", // 项目名称 "version": "1.0.0", // 项目版本 "main": "expo-router/entry", // 应用入口文件 "scripts": { "start": "expo start", // 启动开发服务器 "android": "expo start --android", // 在 Android 设备上启动 "ios": "expo start --ios", // 在 iOS 设备上启动 "web": "expo start --web" // 在网页浏览器中启动 }, "dependencies": { "expo": "~53.0.22", // Expo 核心库 "expo-status-bar": "~2.2.3", // 状态栏组件 "react": "19.0.0", // React 核心库 "react-native": "0.79.6", // React Native 核心库 "expo-router": "~5.1.5", // Expo 路由库 "react-native-safe-area-context": "5.4.0", // 安全区域上下文 "react-native-screens": "~4.11.1", // 原生屏幕组件 "expo-linking": "~7.1.7", // 链接处理 "expo-constants": "~17.1.7", // 常量访问 "expo-image": "~2.4.0" // 高性能图片组件 }, "devDependencies": { "@babel/core": "^7.20.0" // Babel 核心编译器 }, "private": true // 私有包,不会被发布到 npm } ``` ## 安装和运行 ### 环境要求 - Node.js (推荐 LTS 版本) - npm 或 yarn 包管理器 - Expo CLI (可选,Expo Go 应用也可用于开发) ### 安装步骤 1. 克隆项目到本地 2. 进入项目目录 3. 安装依赖: ```bash npm install # 或 yarn install ``` ### 运行项目 ```bash # 启动开发服务器 npm start # 或 yarn start # 在 Android 设备上运行 npm run android # 或 yarn android # 在 iOS 设备上运行 npm run ios # 或 yarn ios # 在网页浏览器中运行 npm run web # 或 yarn web ``` ### 开发工具推荐 - **Expo Go**: 在真实设备上预览应用 - **Android Studio**: Android 模拟器 - **Xcode**: iOS 模拟器 (仅限 macOS) - **VS Code**: 代码编辑器,推荐安装 React Native 扩展包 ## 项目架构设计 ### 文件系统路由 本项目使用 Expo Router 的文件系统路由功能,路由结构与文件结构一一对应: - `app/index.js` 对应根路径 `/` - `app/details.js` 对应路径 `/details` - `app/courses/[id].js` 对应动态路径 `/courses/:id` ### 布局系统 - **根布局** (`app/_layout.js`): 定义应用的整体导航结构 - **Tab 布局** (`app/(tabs)/_layout.js`): 定义底部标签导航 ### 组件设计 - **函数组件**: 使用 React 函数组件和 Hooks - **样式系统**: 使用 React Native StyleSheet - **图标系统**: 使用 @expo/vector-icons 提供的图标库 ## 开发指南 ### 添加新页面 1. 在 `app/` 目录下创建新的页面文件 2. 文件名即为路由路径(如 `about.js` 对应 `/about` 路由) 3. 动态路由使用方括号命名(如 `[id].js` 对应 `/xxx/123` 路由) ### 导航配置 1. 根布局 `_layout.js` 配置全局页面选项 2. Tab 布局 `(tabs)/_layout.js` 配置 Tab 导航选项 3. 每个页面可通过 `Stack.Screen` 组件配置页面特定选项 ### 样式规范 - 使用 React Native StyleSheet 创建样式对象 - 颜色值采用十六进制格式 - 尺寸单位使用 dp(自动适配不同屏幕密度) - 样式命名采用 BEM 规范(块-元素-修饰符) ### 组件复用 - **自定义组件**: 将可复用的 UI 元素封装为组件 - **布局组件**: 创建通用布局组件提高开发效率 - **工具函数**: 将通用逻辑封装为工具函数 ## 最佳实践 ### 性能优化 - **图片优化**: 使用 expo-image 组件提升图片加载性能 - **列表优化**: 使用 FlatList 或 SectionList 渲染长列表 - **内存管理**: 及时清理定时器和事件监听器 ### 代码质量 - **代码注释**: 为复杂逻辑添加详细注释 - **类型检查**: 使用 PropTypes 或 TypeScript 进行类型检查 - **代码格式化**: 使用 Prettier 统一代码风格 ### 错误处理 - **异常捕获**: 使用 try/catch 处理异步操作异常 - **边界处理**: 使用 ErrorBoundary 处理组件渲染错误 - **用户提示**: 为用户提供友好的错误提示 ## 贡献指南 1. Fork 本仓库 2. 创建功能分支 (`git checkout -b feature/AmazingFeature`) 3. 提交更改 (`git commit -m 'Add some AmazingFeature'`) 4. 推送到分支 (`git push origin feature/AmazingFeature`) 5. 开启 Pull Request ## 常见问题 ### 1. 启动时报错 确保所有依赖已正确安装: ```bash npm install ``` ### 2. 图标不显示 检查 @expo/vector-icons 是否正确安装,并确认图标名称是否正确。 ### 3. 页面跳转异常 检查路由路径是否正确,确保目标页面文件存在。 ## 许可证 本项目仅供学习和参考使用。 ## 联系方式 如有问题,请提交 Issue 或联系项目维护者。