reactjs - React - 条件渲染效果不佳
问题描述
我在此处添加的组件在登录后呈现。我只需要在会话过期时重定向到登录。我的问题主要在渲染内部。成功登录后,页面将被重定向到主页,this.state.success.toString()
如果会话已过期,则显示为 true 和 false。到这,就好了。当我取消注释我留下注释的行并注释掉最后一行时,渲染功能是在主页中显示一条消息或重定向到登录。但是代码不是这样工作的。它转到 Home 路由并再次被重定向到 Login。甚至该componentDidUpdate()
方法也没有被调用。我不明白为什么。你能帮忙解决这个问题吗?
import React from 'react';
import './App.css';
import axios from 'axios';
import { Redirect } from 'react-router-dom'
export default class Home extends React.Component {
_isMounted = false;
constructor(props) {
super(props);
this.state = {
success: "",
message: "",
user: "",
cookies: ""
}
}
componentDidMount() {
this._isMounted = true;
axios.get('http://localhost:8080/auth/login/success', { withCredentials: true }).then((res) => {
console.log(res);
let data = res.data;
if (this._isMounted) {
this.setState({
success: data.success,
message: data.message,
user: data.user ? data.user : "",
cookies: data.cookies ? data.cookies : ""
})
}
}).catch((err) => {
let data = err.response.data;
if (this._isMounted)
this.setState({
success: data.success,
message: data.message,
user: data.user ? data.user : "",
cookies: data.cookies ? data.cookies : ""
});
})
}
componentWillUnmount() {
this._isMounted = false;
}
render() {
// if (this.state.success)
// return <h1>{this.state.message}</h1>
// else {
// return <Redirect to="/login"></Redirect>
// }
return <h1>{this.state.success.toString()}</h1>
}
componentDidUpdate(previousProps, previousState) {
console.log(this.state);
}
}
解决方案
由于您进行 API 调用并且数据检索是异步的,因此一旦接收到数据,您必须维护一个加载指示器来处理您的逻辑,否则在初始渲染期间,success
状态将为 false,并且您的组件将由于Redirect
正在渲染的组件而被重定向
export default class Home extends React.Component {
_isMounted = false;
constructor(props) {
super(props);
this.state = {
isLoading: true,
success: "",
message: "",
user: "",
cookies: ""
}
}
componentDidMount() {
this._isMounted = true;
axios.get('http://localhost:8080/auth/login/success', { withCredentials: true }).then((res) => {
console.log(res);
let data = res.data;
if (this._isMounted) {
this.setState({
isLoading: false,
success: data.success,
message: data.message,
user: data.user ? data.user : "",
cookies: data.cookies ? data.cookies : ""
})
}
}).catch((err) => {
let data = err.response.data;
if (this._isMounted)
this.setState({
isLoading: false,
success: data.success,
message: data.message,
user: data.user ? data.user : "",
cookies: data.cookies ? data.cookies : ""
});
})
}
componentWillUnmount() {
this._isMounted = false;
}
render() {
if(isLoading) return <div>Loading...</div>
if (this.state.success)
return <h1>{this.state.message}</h1>
else {
return <Redirect to="/login"></Redirect>
}
}
componentDidUpdate(previousProps, previousState) {
console.log(this.state);
}
}
推荐阅读
- php - Updating foreign key with PDO OOP
- python - 阻止 Python enumerate() 将字符串拆分为字符
- ios - NSDateFormatter dateFromString returns nil in iOS 13 issue
- continuous-integration - Using Jenkins to send Slack messages
- python - 在二维数组中查找重复数组并将数字添加到元组
- python - 修复“AttributeError:模块'tensorflow'没有属性'get_default_graph'”
- c# - WPF Prism Unity - RegisterType with InjectionConstructor
- javascript - 用子组件替换父组件
- amazon-web-services - 如何测试 Kubernetes 集群网络的性能?
- azure-logic-apps - Using a variable to call a nested workflow