Я довольно новичок в React и Ioni c. Я пытаюсь создать «защищенный маршрут». Я создаю простой контекст с именем AuthContext
:
import { createContext, Dispatch } from 'react';
/**
* Context interface for AuthAuthentication/Authorization
*
* @property isAuthenticated
* @property dispatch
*
* @interface
*/
interface AuthDefaultContext {
isAuthenticated: boolean;
dispatch: Dispatch<any>
}
/**
* Authentication/Authorization context for managing
* authenticating/ed and authorizing/ed users
*/
export const AuthContext = createContext<AuthDefaultContext>({
isAuthenticated: false,
dispatch: () => {}
});
и FunctionalComponent с именем ProtectedRoute
:
interface ProtectedRouteProps {
ProtectedComponent: FunctionComponent,
routePath: string
}
export const ProtectedRoute: FunctionComponent<ProtectedRouteProps> = ({ ProtectedComponent, routePath }) => {
useEffect(() => {
console.log(`loading protected route '${routePath}' with component ${ProtectedComponent.name}`)
}, [ProtectedComponent, routePath] );
return (
<AuthContext.Consumer>
{
({ isAuthenticated }) => (
<Route path={ routePath } render={ () => isAuthenticated ? <ProtectedComponent/> : <Redirect to="/login" /> }/>
)
}
</AuthContext.Consumer>
);
}
В своем основном компоненте приложения я заключаю IonReactRouter
в AuthContext.Provider
вот так:
<IonApp>
<AuthContext.Provider value={{ isAuthenticated: authenticated, dispatch: dispatch }}>
<IonReactRouter>
<IonRouterOutlet>
<Route path="/login" component={ Login } exact={ true } />
<ProtectedRoute routePath="/welcome" ProtectedComponent={ Welcome }/>
<ProtectedRoute routePath="/search" ProtectedComponent={ Dummy }/>
</IonRouterOutlet>
</IonReactRouter>
</AuthContext.Provider>
</IonApp>
Проблема, с которой я столкнулся, заключается в том, что вышеописанное прекрасно работает для обычного Route и первого ProtectedRoute, но /search/
не работает. Путь uri изменяется в URL браузера на /search
, но фиктивный компонент не отображается.
Я заметил, что если вы поменяете <IonReactRouter>
& <IonRouterOutlet>
примерно так:
<IonRouterOutlet>
<IonReactRouter>
.....
</IonReactRouter>
</IonRouterOutlet>
все маршруты будут работать, но вы потеряете эффект анимации, предоставляемый IonRouterOutlet
. Документация по навигации на веб-сайте Ionics имеет IonReactRouter
упаковку IonRouterOutlet
, поэтому я предполагаю, что это правильная реализация.
Если я поменяю ProtectedRoute
на стандартные реакции Route
, все маршруты отлично работают с анимацией. Так что проблема должна быть в моей реализации компонента ProtectedRoute
, я просто не могу понять это. Любая помощь будет наиболее ценной. Спасибо!
ОБНОВЛЕНИЕ:
Я до сих пор не нашел решения для этой проблемы, поэтому я удалил IonRouterOutlet, который, кажется, является причиной root. При этом все работает как положено. Я разместил этот вопрос на форуме Ioni c, поэтому, когда / если я получу ответ, я опубликую его здесь.
Спасибо,