reactjs - ComponentDidMount 中的 axios.get 函数未按预期设置状态
问题描述
在我的标题组件中,我设置了条件渲染以根据用户是否登录来显示不同的链接。条件渲染工作得很好,除了它会在显示正确的链接集之前闪烁一组链接。
我突然意识到这是因为axios.get
我有一个调用来检索用户的状态。状态变量最初设置为 false。如果用户已登录,get 调用将指示这一点,并且状态变量将设置为 true。短暂的延迟使得“未登录”链接在“已登录”链接显示之前短暂显示。
我在这两种方法中都尝试了很多推荐的方法componentDidMount
-componentWillMount
似乎没有任何效果:
componentDidMount() {
axios.get('http://localhost:8000/api/login', {
withCredentials: true
}).then(res => {
if (res.data.loggedIn) {
this.setState({isLogged: true});
} else {
this.setState({isLogged: false});
}
}).catch(error => {
this.setState({isLogged: false});
});
}
下一个方法:
async componentDidMount() {
const res = await axios.get('http://localhost:8000/api/login', {
withCredentials: true
});
const logged = await res.data.loggedIn;
if (logged) {
this.setState({isLogged: true});
} else {
this.setState({isLogged: false});
}
}
我尝试过具有相同结果的回调函数。
条件渲染是典型的:
{this.state.isLogged && <LoggedIn />}
我显然没有看到异步函数如何工作的基本内容——我只是不确定那是什么!
提前致谢!!
解决方案
在这种情况下,您可以做的最好的事情是在请求完成之前不显示任何内容或显示微调器。不管你做什么(异步/等待、承诺、回调)请求都需要一些时间。
推荐阅读
- facebook - 使用图形 api 以用户身份发布内容
- ruby-on-rails - 使用 docker-machine 通过 Docker 在 AWS EC2 中更新 Rails 应用程序的工作流程是什么?
- javascript - WebRTC 有多少个通道以及使用了哪些传输?
- c# - 需要帮助提高 SQL DELETE 性能
- windows - 当您作为修饰键时,我的功能/Fn 键不起作用
- java - 如何在不知道 DPI 的情况下获得以英寸为单位的图像尺寸?
- javascript - 尝试使用间隔更改 React Hooks 中的状态
- javascript - Paypal 付费墙自定义文本 css
- python - 不处理词云停用词
- sql - Redshift 跳过 split_part() 的第一个字符