reactjs - 减速器在 IonRouterOutlet 内无法正常工作
问题描述
这是我的 Ionic4 应用程序的主要组件(“PrivateRoute”组件来自 react-router-private):
const App: React.FC = (props: any) => {
const { userLogged } = props.logged;
return (
<IonApp>
<IonReactRouter>
<IonRouterOutlet id="principal">
<Route exact path="/" render={() => <Redirect to="/login" />} />
<Route exact path="/login" component={LoginPage} />
<PrivateRoute exact path="/dashboard" component={Dashboard} authStatus={userLogged.isLogged} redirectURL="/login" />
</IonRouterOutlet>
</IonReactRouter>
/>
</IonApp>
);
}
const mapStateToProps = (state: any) => {
return {
logged: state.logged,
};
}
export default connect(mapStateToProps)(App);
这是我的 LoginPage 组件:
const LoginPage: React.FC = (props: any) => {
const { userLogged } = props.logged;
const handleLogin = (inputs: any) => {
const user = {
"username": inputs.username,
"password": inputs.password,
};
axios.post(`URL`,
user,
)
.then(response => {
props.setLogged(response.data);
})
.catch(error => {});
}
return (
<>{userLogged.isLogged ?
<Redirect to="/dashboard" />
:
<IonPage>
<IonContent>
<>
<IonGrid>
<IonRow>
<IonCol
offsetXl="3" sizeXl="6"
offsetLg="2" sizeLg="8"
offsetMd="2" sizeMd="8"
offsetSm="1" sizeSm="10"
sizeXs="12">
<Login save={handleLogin} >
</Login>
</IonCol>
</IonRow>
</IonGrid>
</>
</IonContent>
</IonPage>
}
</>
);
};
const mapStateToProps = (state: any) => {
return {
logged: state.logged,
};
}
const mapDispatchToProps = {
setLogged,
};
export default connect(mapStateToProps, mapDispatchToProps)(LoginPage);
LoginPage里面的Login组件,只是一个表单,没有必要详细介绍。“setLogged”操作仅保存带有用户数据和会话令牌的 JSON,并将“isLogged”变量从 reducer 更改为“true”。此操作运行正常。
我遇到的问题如下。当用户登录时,“LoginPage”组件正确检测到状态变量“userLogged.isLogged”变为“true”,因此将其渲染<Redirect>
到“Dashboard”组件,但“Dashboard”组件的受保护路径没有检测到它(至少看起来如此)。如果我将受保护的路线放在“IonRouterOutlet”之外,它就可以完美运行。但我需要它位于“IonRouterOutlet”内,因为我需要访问 Ionic 页面的事件(useIonViewDidEnter)。我怎样才能解决这个问题?通过从“IonRouterOutlet”中正确操作受保护的路由,或以某种方式模拟“useIonViewDidEnter”。
我已经尝试了以下受保护的路线:
<Route exact path="/dashboard"
component={userLogged.isLogged ? Dashboard : LoginPage}
/>
<Route exact path="/dashboard"
render={props => {
return userLogged.isLogged ? <Dashboard {...props} /> : <LoginPage />;
}}
/>
提前致谢
解决方案
在最新版本之一中修复了一个错误,该错误刷新了为路线创建的闭包。将@ionic/react 和@ionic/react-router 升级到4.11.8 版本后,我可以确认该错误已修复。还必须将 @types/react 更新为 16.9.19,并将 @types/react-router 更新为 5.1.4,以避免出现此类问题
推荐阅读
- vue.js - 如何使用 Vuex 异步操作和变异进行身份验证?
- angular - Angular / Web API:将 FormFile 信息从客户端发送到 API
- python - 如何返回大于 x 的最后一个元素的值
- windows - 如何在 QT 安装程序框架中区分每个用户和系统范围的安装?
- heroku - Heroku 生成的 DNS 目标
- ide - OSDEV 有 IDE 吗?
- django - Python opencv等待相机空闲
- travis-ci - Travis CI 未定义对 SDL2 和 GLEW 函数的引用
- haskell - 两条线和两个平面的交点
- ruby-on-rails - 从 rails 应用程序提供编译的 javascript 和 css 文件以在外部站点中使用