reactjs - 使用 React JS 中的钩子未按时在状态上设置数据
问题描述
我正在做一个 Instagram 克隆项目。我正在做个人资料页面部分并遇到了一些问题。我正在尝试使用钩子(useState)来设置来自服务器的用户文档的响应。我的问题是,当我使用 useEffect (仅使用 [] 一次)时,未设置用户名状态。我让 useEffect 无限运行,我发现状态在一段时间后被设置。
const getUser = async () => {
await axios.get(`/user/getbyusername/${props.match.params.username}`)
.then(res => {
console.log(res.data) // PRINTS DATA CORRECTLY
setProfileUser({
_id: res.data._id,
username: res.data.username,
fullName: res.data.fullName,
followersCount: res.data.followersCount,
followingCount: res.data.followingCount,
profileImage_PublicId: res.data.profileImage_PublicId,
bio: res.data.bio
})
console.log(profileUser)
})
}
// DOES NOT SET ANY DATA
useEffect(() => {
getUser(); // async function and awaits for the server response
// HERE, I call getUserPosts using profileUser._id, and it profileUser._id is not set yet
getPosts(); // async function as well
}, [])
检查 setProfileUser(...) 是否正确,这是因为它设置了数据,但经过一段时间后,即使我可以在第一次使用 [] 时正确使用 console.log(res.data)。
// WORKS, sets the user state after two runs. NOT GOOD PRACTICE
useEffect(() => {
getUser();
})
解决方案
添加另一个useEffect
在更改时运行的钩子profileUser
,以便它在setProfileUser
完成后运行:
useEffect(getUser, []);
useEffect(() => {
if (profileUser) {
getPosts();
}
},
[profileUser],
);
推荐阅读
- python - AES在python中加密在php中解密
- c# - WPF 嵌套扩展器未正确调整父 ListBox 滚动条
- java - 如何使用最新的 Java LTS 11 运行老式 Java 程序?
- regex - 正则表达式:匹配除数字、空格、逗号、分号、'am' 和 'pm' 之外的任何内容
- javascript - Discord js检测其他机器人的消息
- types - 试图证明一个类型是 `euclidean_semiring` 的一个实例(在 Isabelle 中)
- monitoring - 具有历史数据的 Prometheus 导出器
- reactjs - 什么是 npm make?
- mysql - 如何从主机执行mysqldump命令到mysql docker容器
- python - Python Dash - 同一回调函数中的动态和静态输入选项