Expo Router的核心用法汇总

2025年5月30日 Mr 焦 245

以下是 Expo Router 的核心用法汇总,涵盖路由配置、导航、参数传递等关键功能(基于 Expo SDK 49+):


🗺️ 路由配置(文件系统路由)

app/
├── (tabs)/          # 嵌套布局组
│   ├── index.js     # /tabs/
│   └── [user].js    # /tabs/{user}
├── _layout.js       # 全局布局
├── index.js         # 首页 (/)
├── search/          
│   ├── index.js     # /search
│   └── [term].js    # /search/{term}
└── modal.js         # 模态屏 (/modal)

🔄 核心导航方法

import { Link, router, useRouter } from 'expo-router';

// 1. 组件导航
<Link href="/profile">前往个人页</Link>

// 2. 编程式导航
router.push('/settings');      // 跳转
router.replace('/login');      // 替换当前路由
router.back();                 // 返回

// 3. 获取路由对象
const { push, back, replace } = useRouter();

📌 动态路由参数

文件命名[param].js
获取参数

// app/user/[id].js
import { useLocalSearchParams } from 'expo-router';

export default function User() {
  const { id } = useLocalSearchParams(); // 获取 /user/123 中的 id
  return <Text>用户ID: {id}</Text>;
}

🖼️ 布局系统

全局布局 (app/_layout.js):

export default function Layout() {
  return (
    <Stack>
      <Stack.Screen name="index" options={{ title: '首页' }} />
      <Stack.Screen name="profile" options={{ headerShown: false }} />
    </Stack>
  );
}

嵌套布局

// app/(tabs)/_layout.js
export default function TabsLayout() {
  return (
    <Tabs>
      <Tabs.Screen name="home" />
      <Tabs.Screen name="settings" />
    </Tabs>
  );
}

🔐 路由守卫(认证控制)

// app/_layout.js
import { Redirect } from 'expo-router';

export default function RootLayout() {
  const { isAuthenticated } = useAuth();

  if (!isAuthenticated) {
    return <Redirect href="/login" />;
  }

  return <Stack />;
}

🌐 深层链接配置

  1. 配置 app.json

    {
    "expo": {
    "scheme": "myapp",
    "plugins": [
      ["expo-router", { "origin": "https://yourapp.com" }]
    ]
    }
    }
  2. 处理链接

    
    // app/index.js
    import { useUrl } from 'expo-router';

export default function Home() {
const url = useUrl(); // 获取 deep link 参数
// 处理类似 myapp://user/123 的链接
}


---

### 🧩 高级路由操作
```jsx
// 1. 传递对象参数
router.push({
  pathname: '/user',
  params: { id: 123, name: 'Alice' }
});

// 2. 预加载路由
import { usePreload } from 'expo-router';
usePreload('/heavy-screen'); // 提前加载资源

// 3. 监听路由事件
import { useFocusEffect } from 'expo-router';
useFocusEffect(() => {
  console.log('屏幕已聚焦');
});

🧭 路由类型(TypeScript)

// 定义路由参数类型
export type RootStackParamList = {
  index: undefined;
  profile: { userId: string };
};

// 在组件中使用
const { userId } = useLocalSearchParams<{ userId: string }>();

⚠️ 注意事项

  1. 文件约定

    • index.js 代表目录默认路由
    • _layout.js 为布局文件
    • (group) 目录名用于逻辑分组(不显示在URL)
  2. 路由行为

    • 所有路由默认使用 栈导航(可配置为 Tabs/Drawer)
    • 路径匹配规则:app/**/*.js/path
  3. 开发工具

    npx expo start    # 启动开发服务器
    Ctrl + R          # 查看路由调试面板

官方文档:Expo Router Docs
示例项目:GitHub - expo/router-example


💡 实用代码片段

模态屏实现

// app/modal.js
export default function Modal() {
  return (
    <View style={{ flex: 1 }}>
      <Text>模态内容</Text>
      <Link href="../">关闭</Link> {/* 返回上级 */}
    </View>
  );
}

强制横屏页面

// app/game/_layout.js
import * as ScreenOrientation from 'expo-screen-orientation';

export default function GameLayout() {
  useLayoutEffect(() => {
    ScreenOrientation.lockAsync(
      ScreenOrientation.OrientationLock.LANDSCAPE
    );
    return () => ScreenOrientation.unlockAsync();
  }, []);

  return <Stack />;
}
分类:
标签:
版权属于Mr 焦
本文链接:https://www.mtsws.cn/post-15.html
评论
暂无评论数据
相关推荐
react-native-reanimated用法清单
以下是 react-native-reanimated 的用法清单和核心文档说明,涵盖主要功能、API 和使用示例: 一、核心概念 工作线程:动画在 UI 线程执行(非 JS 线程),避免卡顿 共享值(Shared Values):动画的驱动数据(代替 Animated.Value) 动画修饰器:定义动画行为(如 withTiming, withSpring...
Mr 焦 2952025年5月29日
js 基础语法
ECMAScript 源码文本会被从左到右扫描,并被转换为一系列的输入元素,包括标识符、控制符、行终止符、注释和空白符。 同样地,ECMAScript 也定义了一些关键字、字面量以及行尾分号补全的规则。 字符集 JavaScript 程序使用 Unicode 字符集编写。Unicode 是 ASCII 和 Latin-1 的超集,并支持地球上几乎所有在使用的...
Mr 焦 2072025年5月27日 js
Node.js中Joi的详细用法
Joi 在 Node.js 中的详细用法 Joi 是一个强大的 JavaScript 对象模式验证库,常用于 Node.js 应用中验证和转换数据。下面详细介绍 Joi 的用法。 安装 npm install joi 基本用法 1. 基本验证 const Joi = require( joi ); // 定义 schema const schema = Jo...
Mr 焦 2002025年6月8日
浏览器架构
浏览器架构 计算机核心元素 为了了解浏览器运行的环境,我们需要了解几个计算机部件以及它们的作用。 CPU 第一个需要了解的计算机部件是 中央处理器(Central Processing Unit),或简称为 CPU。CPU 可以看作是计算机的大脑。一个 CPU 核心如图中的办公人员,可以逐一解决很多不同任务。它可以在解决从数学到艺术一切任务的同时还知道如何响...
Mr 焦 2432025年5月27日
Linux 系统-基本概要
基本概要 抽象级别和层次 最底层是硬件系统,包括内存和中央处理器(用于计算和从内存中读写数据),此外硬盘和网络接口也是硬件系统的一部分。 硬件系统之上是 内核,它是操作系统的核心。内核是运行在内存中的软件,它向中央处理器发送指令。内核管理硬件系统,是硬件系统和应用程序之间进行通信的接口。 进程 是指计算机中运行的所有程序,由内核统一管理,它们组成了最顶层,称...
Mr 焦 1272025年5月30日 Linux