React + Ionic 5:选项卡导航问题
React + Ionic 5: Tab navigation problems
我无法使标签导航正常工作。
到目前为止,这是我的代码:
App.tsx:
const App: React.FC = () =>
<IonApp>
<IonReactRouter>
<IonRouterOutlet id="main">
<Route exact path="/" render={() => <Redirect to="/home"/>}/>
<Route path="/home" render={(props) => <Home {...props}/>} exact={true}/>
</IonRouterOutlet>
</IonReactRouter>
</IonApp>
)
Home.tsx:
const Home: React.FC<RouteComponentProps> = (props: RouteComponentProps) => (
<IonPage>
<IonTabs>
<IonRouterOutlet id='tabs'>
<Route path='/:tab(myDecks)' render={(props) => <MyDecks {...props} />} exact/>
<Route path='/:tab(explore)' render={(props) => <Explore {...props} />} exact/>
<Redirect from='/home' to='/myDecks'/>
</IonRouterOutlet>
<IonTabBar slot='bottom'>
<IonTabButton tab='myDecks' href='/myDecks'>
<IonLabel>My Decks</IonLabel>
</IonTabButton>
<IonTabButton tab='explore' href='/explore'>
<IonLabel>Explore</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonPage>
);
MyDecks.tsx:
const MyDecks: React.FunctionComponent<RouteComponentProps> = (props: RouteComponentProps) => {
return <>
<IonHeader>
<IonToolbar>
<IonTitle>My Decks</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent className='ion-padding'>
My Decks
</IonContent>
</>
};
当前行为是:
- 用户权限/
- 用户被重定向到 /home
- 另一个重定向到 /myDeck,选择了 "My Deck" 选项卡并且 URL 是好的。
- 如果用户单击 "Explore" 选项卡,URL 会发生变化,取消选择 "My Deck" 选项卡并选择 "Explore" 选项卡,但是,页面内容不会'改变。
如果我改变 <IonRouterOutlet>
中的路由顺序,那么最初选择 "My Decks" 选项卡,当用户第一次单击 "Explore" 选项卡时,它呈现正常,但永远不会回到 "My Decks" 选项卡。
我还注意到,在 /myDeck 或 /explore 刷新时根本没有内容呈现。
According to the React Tabs starter template 您必须将 IonRouterOutlet
嵌套在 IonTabs
中,后者嵌套在 IonReactRouter
.
中
他们的 App.tsx 长这样:
<IonApp>
<IonReactRouter>
<IonTabs>
<IonRouterOutlet>
<Route path="/tab1" component={Tab1} exact={true} />
<Route path="/tab2" component={Tab2} exact={true} />
<Route path="/tab3" component={Tab3} />
<Route path="/" render={() => <Redirect to="/tab1" />} exact={true} />
</IonRouterOutlet>
<IonTabBar slot="bottom">
<IonTabButton tab="tab1" href="/tab1">
<IonIcon icon={triangle} />
<IonLabel>Tab 1</IonLabel>
</IonTabButton>
<IonTabButton tab="tab2" href="/tab2">
<IonIcon icon={ellipse} />
<IonLabel>Tab 2</IonLabel>
</IonTabButton>
<IonTabButton tab="tab3" href="/tab3">
<IonIcon icon={square} />
<IonLabel>Tab 3</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonReactRouter>
</IonApp>
对我来说就是这样。不管怎样,Ionic+React 的文档对于类似的事情不是很详细。还是要多找找
解决方案是用 <IonPage>
包裹标签内容。
const MyDecks: React.FunctionComponent<RouteComponentProps> = (props: RouteComponentProps) => {
return <IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>My Decks</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent className='ion-padding'>
My Decks
</IonContent>
</IonPage>
};
<IonApp>
<IonPage>
<IonReactRouter>
<Menu />
<IonTabs>
<IonRouterOutlet id="main">
<Route path="/Login" exact={true}>
<Login />
</Route>
<Route path="/" exact={true}>
<Redirect to="/Login"></Redirect>
</Route>
<Route path="/settings" exact={true}>
<UserSettings />
</Route>
<Route path="/page/:name" exact={true}>
<Page />
</Route>
</IonRouterOutlet>
<IonTabBar slot="bottom">
<IonTabButton tab="home" href="/page/Inbox">
<IonLabel>Home</IonLabel>
</IonTabButton>
<IonTabButton tab="settings" href="/settings">
<IonLabel>Settings</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonReactRouter>
</IonPage>
</IonApp>
我无法使标签导航正常工作。
到目前为止,这是我的代码:
App.tsx:
const App: React.FC = () =>
<IonApp>
<IonReactRouter>
<IonRouterOutlet id="main">
<Route exact path="/" render={() => <Redirect to="/home"/>}/>
<Route path="/home" render={(props) => <Home {...props}/>} exact={true}/>
</IonRouterOutlet>
</IonReactRouter>
</IonApp>
)
Home.tsx:
const Home: React.FC<RouteComponentProps> = (props: RouteComponentProps) => (
<IonPage>
<IonTabs>
<IonRouterOutlet id='tabs'>
<Route path='/:tab(myDecks)' render={(props) => <MyDecks {...props} />} exact/>
<Route path='/:tab(explore)' render={(props) => <Explore {...props} />} exact/>
<Redirect from='/home' to='/myDecks'/>
</IonRouterOutlet>
<IonTabBar slot='bottom'>
<IonTabButton tab='myDecks' href='/myDecks'>
<IonLabel>My Decks</IonLabel>
</IonTabButton>
<IonTabButton tab='explore' href='/explore'>
<IonLabel>Explore</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonPage>
);
MyDecks.tsx:
const MyDecks: React.FunctionComponent<RouteComponentProps> = (props: RouteComponentProps) => {
return <>
<IonHeader>
<IonToolbar>
<IonTitle>My Decks</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent className='ion-padding'>
My Decks
</IonContent>
</>
};
当前行为是:
- 用户权限/
- 用户被重定向到 /home
- 另一个重定向到 /myDeck,选择了 "My Deck" 选项卡并且 URL 是好的。
- 如果用户单击 "Explore" 选项卡,URL 会发生变化,取消选择 "My Deck" 选项卡并选择 "Explore" 选项卡,但是,页面内容不会'改变。
如果我改变 <IonRouterOutlet>
中的路由顺序,那么最初选择 "My Decks" 选项卡,当用户第一次单击 "Explore" 选项卡时,它呈现正常,但永远不会回到 "My Decks" 选项卡。
我还注意到,在 /myDeck 或 /explore 刷新时根本没有内容呈现。
According to the React Tabs starter template 您必须将 IonRouterOutlet
嵌套在 IonTabs
中,后者嵌套在 IonReactRouter
.
他们的 App.tsx 长这样:
<IonApp>
<IonReactRouter>
<IonTabs>
<IonRouterOutlet>
<Route path="/tab1" component={Tab1} exact={true} />
<Route path="/tab2" component={Tab2} exact={true} />
<Route path="/tab3" component={Tab3} />
<Route path="/" render={() => <Redirect to="/tab1" />} exact={true} />
</IonRouterOutlet>
<IonTabBar slot="bottom">
<IonTabButton tab="tab1" href="/tab1">
<IonIcon icon={triangle} />
<IonLabel>Tab 1</IonLabel>
</IonTabButton>
<IonTabButton tab="tab2" href="/tab2">
<IonIcon icon={ellipse} />
<IonLabel>Tab 2</IonLabel>
</IonTabButton>
<IonTabButton tab="tab3" href="/tab3">
<IonIcon icon={square} />
<IonLabel>Tab 3</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonReactRouter>
</IonApp>
对我来说就是这样。不管怎样,Ionic+React 的文档对于类似的事情不是很详细。还是要多找找
解决方案是用 <IonPage>
包裹标签内容。
const MyDecks: React.FunctionComponent<RouteComponentProps> = (props: RouteComponentProps) => {
return <IonPage>
<IonHeader>
<IonToolbar>
<IonTitle>My Decks</IonTitle>
</IonToolbar>
</IonHeader>
<IonContent className='ion-padding'>
My Decks
</IonContent>
</IonPage>
};
<IonApp>
<IonPage>
<IonReactRouter>
<Menu />
<IonTabs>
<IonRouterOutlet id="main">
<Route path="/Login" exact={true}>
<Login />
</Route>
<Route path="/" exact={true}>
<Redirect to="/Login"></Redirect>
</Route>
<Route path="/settings" exact={true}>
<UserSettings />
</Route>
<Route path="/page/:name" exact={true}>
<Page />
</Route>
</IonRouterOutlet>
<IonTabBar slot="bottom">
<IonTabButton tab="home" href="/page/Inbox">
<IonLabel>Home</IonLabel>
</IonTabButton>
<IonTabButton tab="settings" href="/settings">
<IonLabel>Settings</IonLabel>
</IonTabButton>
</IonTabBar>
</IonTabs>
</IonReactRouter>
</IonPage>
</IonApp>