我建议在组件的开头声明这两个函数(你可以稍后通过useCallback
来优化它们,但在这个阶段并不是很重要)。
const getTracks = async () => {
await httpClient.get(`/track/${id}`)
.then((response) => {
setTrack(response.data);
})
}
const getUser = async() => {
await httpClient.get(`/profile/${track.user}/`)
.then((response) => {
setUser(response.data);
})
}
我会在 useEffect
钩子中调用一个 async
函数。有几种方法可以实现:你可以在 useEffect
钩子中声明一个 async
函数并立即调用它,或者你可以调用一个匿名的 async
函数。出于简洁性的考虑,我更喜欢后者,代码如下:
useEffect(() => {
(async () => {
await getTracks();
getUser();
})();
}, []);
现在当您调用getUser
时,您应该确保getTracks
已经设置了track
变量。
以下是完整的组件:
const Player = ({trackUrl, index, cover, id}) => {
const [track, setTrack] = useState({})
const [user, setUser] = useState({})
const getTracks = async () => {
await httpClient.get(`/track/${id}`)
.then((response) => {
setTrack(response.data);
})
}
const getUser = async() => {
await httpClient.get(`/profile/${track.user}/`)
.then((response) => {
setUser(response.data);
})
}
useEffect(() => {
(async () => {
await getTracks();
getUser();
})();
}, []);
}
EDIT 07/18/22
根据Noel的评论和链接的代码沙盒,我发现我的答案不起作用的原因是track
变量在执行getTrack()
钩子后不可用:它将在随后的渲染中可用。
我的解决方案是添加第二个useEffect
钩子,每次track
变量发生更改时执行。我创建了两个使用jsonplaceholder端点的解决方案,一个(见此处)保留了大部分原始解决方案但增加了复杂性,另一个(此处)通过将两个方法从setTrack
和setUser
钩子中解耦,大大简化了代码。
这里我会贴出更简单的一个版本,符合OP的要求。
export default function Player({ trackUrl, index, cover, id }) {
const [track, setTrack] = useState({});
const [user, setUser] = useState({});
const getTracks = async () => {
return await httpClient.get(`/track/${id}`);
};
const getUser = async (track) => {
console.log(track, track.id, 'test');
return await httpClient.get(`profile/${track.user}`);
};
useEffect(() => {
(async () => {
const trackResult = await getTracks();
setTrack(trackResult);
})();
}, []);
useEffect(() => {
(async () => {
if (track && Object.entries(track).length > 0) {
const userResult = await getUser(track);
console.log(userResult);
setUser(userResult);
}
})();
}, [track]);
return (
<div className="App">{user && user.id ? user.id : "Not computed"}</div>
);
}
getUser
函数?你只想在组件挂载时运行它吗?还是它将成为某个事件处理程序函数,比如当他们点击一个按钮时? - Jayce444