reactnavigation V6 嵌套路由


前言

最近在写RN项目,浅浅记录一下react navigation的嵌套路由实现
大概实现效果如下
在这里插入图片描述
与一般的APP不同的是没有底部Tab而是换成了顶部菜单。

一、安装相关包

npm install @react-navigation/native
npm install react-native-screens react-native-safe-area-context
npm install @react-navigation/native-stack

二、编写菜单组件 Menu

import React from "react"
import { View, Image, Text, ScrollView } from "react-native"
import { getFocusedRouteNameFromRoute } from "@react-navigation/native"

import { LinkButton } from "./LinkButton"

export const Menu = React.memo(({ route }) => {
  const routeName = getFocusedRouteNameFromRoute(route) ?? "Home"

  return (
    <View className="flex-row items-center bg-blue-light text-white pt-36">
      <Image source={require("../images/logo.png")} style={{ width: 50, height: 40 }} resizeMode={"cover"} />
      <Text className={"text-white text-lg font-bold mx-10 mr-20"}>桌面管理系统</Text>
      <ScrollView horizontal={true} showsHorizontalScrollIndicator={false} showsVerticalScrollIndicator={false} directionalLockEnabled={true} bounces={false} scrollsToTop={false}>
        <View className={routeName === "Home" ? "bg-blue h-full flex-row items-center p-12" : " p-12"}>
          <LinkButton to={{ screen: "Home", params: { id: "jane" } }} icon={"home"}>
            首页
          </LinkButton>
        </View>
        <View className={routeName === "Workbench" ? "bg-blue h-full flex-row items-center p-12" : "p-12"}>
          <LinkButton to={{ screen: "Workbench", params: { id: "jane" } }} icon={"laptop"}>
            工作台
          </LinkButton>
        </View>
        <View className={routeName === "Members" ? "bg-blue h-full flex-row items-center p-12" : "p-12"}>
          <LinkButton to={{ screen: "Members", params: { id: "jane" } }} icon={"team"}>
            用户管理
          </LinkButton>
        </View>
        <View className={routeName === "Order" ? "bg-blue h-full flex-row items-center p-12" : "p-12"}>
          <LinkButton to={{ screen: "Order", params: { id: "jane" } }} icon={"table"}>
            订单管理
          </LinkButton>
        </View>
        <View className={routeName === "Settings" ? "bg-blue h-full flex-row items-center p-12" : "p-12"}>
          <LinkButton to={{ screen: "Settings", params: { id: "jane" } }} icon={"setting"}>
            设置
          </LinkButton>
        </View>
      </ScrollView>
    </View>
  )
})

三、配置路由

import React from "react"
import { createNativeStackNavigator } from "@react-navigation/native-stack"

import { Menu } from "../components"
import Home from "../pages/Home"
import Members from "../pages/members"
import Order from "../pages/orders"
import Settings from "../pages/settings"
import Workbench from "../pages/workbench"

const Stack = createNativeStackNavigator()
const Routes = () => {
  function ChildStack() {
    return (
      <Stack.Navigator
        screenOptions={{
          headerShown: false,
        }}
      >
        <Stack.Screen name="Home" component={Home} />
        <Stack.Screen name="Workbench" component={Workbench} />
        <Stack.Screen name="Members" component={Members} />
        <Stack.Screen name="Order" component={Order} />
        <Stack.Screen name="Settings" component={Settings} />
      </Stack.Navigator>
    )
  }
  return (
    <Stack.Navigator
      screenOptions={{
        headerStyle: {
          backgroundColor: "#234EC3",
        },
        headerTintColor: "#fff",
        headerTitleStyle: {
          fontWeight: "bold",
        },
        headerTitleAlign: "center",
        statusBarColor: "#234EC3",
      }}
    >
      <Stack.Screen
        name="Index"
        component={ChildStack}
        options={{
          header: ({ route }) => <Menu route={route} />,
        }}
      />
    </Stack.Navigator>
  )
}
export default Routes

四、在app.js中引用路由

import React from "react"
import { NavigationContainer } from "@react-navigation/native"
import { SafeAreaProvider } from "react-native-safe-area-context"

import Routes from "./src/router/Routes"

export default function App() {
  return (
    <SafeAreaProvider>
      <NavigationContainer>
        <Routes />
      </NavigationContainer>
    </SafeAreaProvider>
  )
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值