Reactjs 反应-条件渲染工作不正常
我在这里添加的组件在登录后呈现。我所需要的只是在会话过期时重定向到登录。我的问题主要是内部渲染。成功登录后,页面将被重定向到主页,并将Reactjs 反应-条件渲染工作不正常,reactjs,Reactjs,我在这里添加的组件在登录后呈现。我所需要的只是在会话过期时重定向到登录。我的问题主要是内部渲染。成功登录后,页面将被重定向到主页,并将this.state.success.toString()显示为true,如果会话已过期,则显示为false。在这之前,一切都很好。 当我取消注释我留下的注释行,并注释掉最后一行时,呈现函数要么在Home中显示消息,要么重定向到login。 但代码不是这样工作的。它转到主路由,然后再次被重定向到登录。甚至没有调用componentDidUpdate()方法。我不明
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);
}
}
从“React”导入React;
导入“/App.css”;
从“axios”导入axios;
从“react router dom”导入{Redirect}
导出默认类Home扩展React.Component{
_isMounted=错误;
建造师(道具){
超级(道具);
此.state={
成功:“,
消息:“”,
用户:“”,
饼干:“
}
}
componentDidMount(){
这个。_isMounted=true;
axios.get()http://localhost:8080/auth/login/success“,{withCredentials:true})。然后((res)=>{
控制台日志(res);
设data=res.data;
如果(此项已安装){
这是我的国家({
成功:数据,成功,
message:data.message,
用户:data.user?data.user:“”,
cookies:data.cookies?data.cookies:“
})
}
}).catch((错误)=>{
让data=err.response.data;
如果(此项已安装)
这是我的国家({
成功:数据,成功,
message:data.message,
用户:data.user?data.user:“”,
cookies:data.cookies?data.cookies:“
});
})
}
组件将卸载(){
这个。_isMounted=false;
}
render(){
//如果(此.状态.成功)
//返回{this.state.message}
//否则{
//返回
// }
返回{this.state.success.toString()}
}
componentDidUpdate(previousProps,previousState){
console.log(this.state);
}
}
由于您进行了API调用且数据检索是异步的,因此在收到数据后,您必须维护一个加载指示器来处理您的逻辑,否则在初始渲染期间,成功
状态将为false,并且由于正在渲染重定向
组件,您的组件将被重定向
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);
}
}
导出默认类Home.Component{
_isMounted=错误;
建造师(道具){
超级(道具);
此.state={
孤岛加载:是的,
成功:“,
消息:“”,
用户:“”,
饼干:“
}
}
componentDidMount(){
这个。_isMounted=true;
axios.get()http://localhost:8080/auth/login/success“,{withCredentials:true})。然后((res)=>{
控制台日志(res);
设data=res.data;
如果(此项已安装){
这是我的国家({
孤岛加载:false,
成功:数据,成功,
message:data.message,
用户:data.user?data.user:“”,
cookies:data.cookies?data.cookies:“
})
}
}).catch((错误)=>{
让data=err.response.data;
如果(此项已安装)
这是我的国家({
孤岛加载:false,
成功:数据,成功,
message:data.message,
用户:data.user?data.user:“”,
cookies:data.cookies?data.cookies:“
});
})
}
组件将卸载(){
这个。_isMounted=false;
}
render(){
如果(正在加载)返回加载。。。
如果(此.状态.成功)
返回{this.state.message}
否则{
回来
}
}
componentDidUpdate(previousProps,previousState){
console.log(this.state);
}
}
尝试将重定向逻辑存储在componentDidMount
中,而不是render