页面栈与路由:React Navigation 与 Expo Router 深度实践

1. 移动端路由的概念映射

在原生 Android 中,页面的管理主要依赖于基于 Activity 的回退栈(Back Stack)或者基于 Fragment / Navigation Component 的导航图(NavGraph)。 在 Jetpack Compose 中,我们通常使用 Navigation for Compose

在 React Native 中,最主流的导航库是 React Navigation ,而伴随着 Expo 的兴起,基于文件系统的 Expo Router 正在成为新的趋势。

React Navigation 类似于 Android 的 Navigation Component,你需要在代码中显式声明所有的路由和页面栈。

核心概念:

  • Stack Navigator: 类似于 Android 的 Activity 栈,页面一层层叠加,按返回键出栈。
  • Tab Navigator : 类似于带有 BottomNavigationView 的主界面,通常作为应用的根页面之一。

Compose Navigation:

scss 复制代码
val navController = rememberNavController()
NavHost(navController, startDestination = "home") {
    composable("home") { HomeScreen(navController) }
    composable("details/{id}") { backStackEntry ->
        DetailsScreen(id = backStackEntry.arguments?.getString("id"))
    }
}
// 导航
navController.navigate("details/123")

React Navigation:

javascript 复制代码
const Stack = createNativeStackNavigator();
​
function App() {
  return (
    <NavigationContainer>
      <Stack.Navigator initialRouteName="Home">
        <Stack.Screen name="Home" component={HomeScreen} />
        <Stack.Screen name="Details" component={DetailsScreen} />
      </Stack.Navigator>
    </NavigationContainer>
  );
}
// 导航
navigation.navigate('Details', { id: 123 });

两者非常相似,都需要一个统一的地方注册所有路由,并通过 Controller/navigation 对象进行跳转。

3. 现代趋势:Expo Router(基于文件系统的路由)

如果你做过 Next.js 或者传统的 Web 开发,会熟悉基于文件系统的路由。Expo Router 将这一概念引入了 RN。 它不再需要像 React Navigation 那样写长长的注册代码,而是目录结构即路由

它是如何工作的?

  • app/index.tsx 对应路由 /
  • app/details.tsx 对应路由 /details
  • app/user/[id].tsx 对应动态路由 /user/123

这种方式极大地简化了深层链接(Deep Linking)的处理。在传统的 Android 中,处理 Deep Link 需要在 AndroidManifest.xml 中配置 Intent Filter,并在 Activity 中解析 URI。在 Expo Router 中,Deep Link 是开箱即用的,因为路由本来就是以 URL 形式组织的。

4. 我们应该选哪个?

  • 如果你在维护一个现有的纯 RN 项目,React Navigation 是唯一解。
  • 如果你启动一个全新的项目并使用了 Expo(强烈推荐),Expo Router 是最佳选择。它底层依然基于 React Navigation,但封装了繁琐的配置,带来了更好的开发体验。
相关推荐
子兮曰19 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰19 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万19 小时前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝19 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
千里马学框架20 小时前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台20 小时前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
三十而立洋20 小时前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
AFinalStone20 小时前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
卡布鲁21 小时前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
致远ccc21 小时前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试