You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Expo抽屉导航意外显示components目录内容,如何仅保留指定屏幕?

解决Expo Router抽屉导航自动添加components目录链接的问题

问题场景

我创建了一个React Native Expo应用,文件结构如下:

myApp
---- app/
-------- _layout.js
-------- screens/
-------- components/

在_layout.js中配置了抽屉导航,代码如下:

import { GestureHandlerRootView } from "react-native-gesture-handler";
import { Drawer } from "expo-router/drawer";

export default function Layout() {
    return (
        <GestureHandlerRootView style = {{ "flex": 1 }}>
            <Drawer screenOptions = {{ HEADER-AND-DRAWER-STYLE }}>
                <Drawer.Screen name = "index" options = {{ "drawerLabel": "Home", "title": "Home" }} />
                <Drawer.Screen name = "screens/screen1/screen1" options = {{ "drawerLabel": "Screen 1", "title": "Screen 1" }} />
                <Drawer.Screen name = "screens/screen2/screen2" options = {{ "drawerLabel": "Create Exercise", "title": "Create Exercise" }} />
        </GestureHandlerRootView>
    );
}

当前抽屉导航能正常跳转至定义的屏幕,但components目录下的所有内容也被自动添加到抽屉中,显示为路径文本,需要移除这些多余链接,只保留_layout.js中定义的屏幕。

解决方案

方法一:将components目录移出app目录

Expo Router默认会扫描app/目录下的所有文件生成路由,把components目录移到项目根目录(与app同级),就能避免被路由系统识别。调整后的文件结构:

myApp
---- app/
-------- _layout.js
-------- screens/
---- components/

方法二:在components目录下添加_layout.js文件

如果不想移动目录,在app/components/下创建_layout.js文件,通过配置阻止该目录下的内容被注册为路由:

export const unstable_settings = {
  initialRouteName: null,
};

export default function ComponentsLayout() {
  return null;
}

额外修正:补全Drawer组件闭合标签

原_layout.js代码存在语法错误,Drawer组件未闭合,修正后的代码如下:

import { GestureHandlerRootView } from "react-native-gesture-handler";
import { Drawer } from "expo-router/drawer";

export default function Layout() {
    return (
        <GestureHandlerRootView style={{ flex: 1 }}>
            <Drawer screenOptions={{ /* 替换为你的头部和抽屉样式 */ }}>
                <Drawer.Screen name="index" options={{ drawerLabel: "Home", title: "Home" }} />
                <Drawer.Screen name="screens/screen1/screen1" options={{ drawerLabel: "Screen 1", title: "Screen 1" }} />
                <Drawer.Screen name="screens/screen2/screen2" options={{ drawerLabel: "Create Exercise", title: "Create Exercise" }} />
            </Drawer>
        </GestureHandlerRootView>
    );
}

内容的提问来源于stack exchange,提问作者user27793975

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:17:19