如何在 Ion React 中将侧边菜单与选项卡导航结合起来

How to combine side menu with tab navigation in Ion React

我在 ionic React 应用程序中有一个选项卡导航页面,我想向该页面添加一个侧边菜单,我知道我必须使用 IonMenu 组件,但我正在努力将两者合并。这是我的代码,说明我是如何实现标签导航的:

import React, { Component } from "react";
 import {
  IonIcon,
  IonLabel,
  IonRouterOutlet,
  IonTabBar,
  IonTabButton,
  IonTabs,
} from "@ionic/react";

import { Redirect, Route } from "react-router-dom";
import { IonReactRouter } from "@ionic/react-router";
import { home, at, albums,addCircleOutline } from "ionicons/icons";

import Tab1 from "./Tab1";
import Tab2 from "./Tab2";
import Tab3 from "./Tab3";
import Tab4 from "./Tab4";

class Home extends Component {
  render() {
    return (
      <IonReactRouter>
        <IonTabs>
          <IonRouterOutlet>
            <Route path="/tab1" component={Tab1} exact={true} />
            <Route path="/tab2" component={Tab2} exact={true} />
            <Route path="/tab3" component={Tab3} />
            <Route path="/tab4" component={Tab4} />
            <Route
              path="/"
              render={() => <Redirect to="/tab1" />}
              exact={true}
            />
          </IonRouterOutlet>
          <IonTabBar slot="bottom">
            <IonTabButton tab="tab1" href="/tab1">
              <IonIcon icon={home} />
              <IonLabel>Home</IonLabel>
            </IonTabButton>
            <IonTabButton tab="tab2" href="/tab2">
              <IonIcon icon={albums} />
              <IonLabel>Saved</IonLabel>
            </IonTabButton>
            <IonTabButton tab="tab4" href="/tab4">
              <IonIcon icon={addCircleOutline} />
              <IonLabel>Request</IonLabel>
            </IonTabButton>
            <IonTabButton tab="tab3" href="/tab3">
              <IonIcon icon={at} />
              <IonLabel>About</IonLabel>
            </IonTabButton>
          </IonTabBar>
        </IonTabs>
      </IonReactRouter>
    );
  }
}

export default Home;

我需要知道如何向此页面添加侧边菜单以及如何添加按钮,以便在我单击它时按钮会打开侧边菜单

只需用拆分窗格包裹整个内容即可。

<IonReactRouter>
  <IonSplitPane contentId="main">
    <Menu />
    <IonRouterOutlet id="main">
      <Route path="/page/:name" component={Page} exact />
      <Route path="/tabs" component={TabRootPage} />
      <Redirect from="/" to="/tabs" exact />
    </IonRouterOutlet>
  </IonSplitPane>
</IonReactRouter>

参见此处示例 - https://github.com/aaronksaunders/ionic-sidemenu-tabs-auth-starter

首先,对于要添加到选项卡菜单中的所有页面,设置以 /tabs/* 开头的路径,例如 /tabs/tab1、/tabs/tab2、/tabs/tab3等

您需要创建一个具有名称的组件,例如,将具有选项卡导航的 MainTabs 和仅包含选项卡导航中页面路由的 IonRouterOutlet。它可能看起来像这样:

<IonTabs>
    <IonRouterOutlet>
      <Route path="/tabs/tab1" component={Tab1} exact/>
      <Route path="/tabs/tab2" component={Tab2} exact/>
      <Route path="/tabs/tab3" component={Tab3} exact/>
    </IonRouterOutlet>
    <IonTabBar slot="bottom">
      <IonTabButton tab="tab1" href="/tabs/tab1">
        <IonLabel>Tab 1</IonLabel>
      </IonTabButton>
      <IonTabButton tab="tab2" href="/tabs/tab2">
        <IonLabel>Tab 2</IonLabel>
      </IonTabButton>
      <IonTabButton tab="tab3" href="/tabs/tab3">
        <IonLabel>Tab 3</IonLabel>
      </IonTabButton>
    </IonTabBar>
  </IonTabs>

然后在 App.tsx 中,您可以添加一个典型的侧边菜单代码,但有一个重要的路线:

<Route path="/tabs" component={MainTabs} />

此路由器出口没有 'exact' 属性,它将选择所有以 /tabs/ 开头且在 MainTabs 组件的路由器出口中定义的路由。所以,App.tsx 文件看起来像这样:

<IonReactRouter>
  <IonSplitPane contentId="main">
    <IonMenu contentId="main">
      <IonContent>
        <IonList>
          // here you can put your side menu items with router links
        </IonList>
      </IonContent>
    </IonMenu>
    <IonRouterOutlet id="main">
      // Important route for tabs navigation!
      <Route path="/tabs" component={MainTabs} />
      // and here are defined every other route in your app
      <Route path="/sideMenu1" component={SideMenu1} exact />
      <Route path="/sideMenu2" component={SideMenu2} exact />
      <Route path="/sideMenu3" component={SideMenu3} exact />
    </IonRouterOutlet>
  </IonSplitPane>
</IonReactRouter>

要添加侧边菜单切换按钮,您需要在 IonToolbar 组件中使用 IonMenuButton 组件。 示例:

<IonPage>
  <IonHeader>
    <IonToolbar>
      <IonButtons slot="start">
        <IonMenuButton />
      </IonButtons>
      <IonTitle>My profile</IonTitle>
    </IonToolbar>
  </IonHeader>
  <IonContent className="ion-padding">
    // page content
   </IonContent>
</IonPage>

希望对您有所帮助!