reactjs - 在等待承诺解决时添加一个 Spinner
问题描述
const fetchMusic= () => {
return new Promise((resolve) =>
setTimeout(() => {
const music = musicList.sort(() => 0.5 - Math.random()).slice(0, 4);
resolve({ data: music});
}, 300)
);
};
export default fetchMusic;
const getRandomMusic = () => {
return fetchMusic().then((result) => result.data);
};
const Button = (props) => {
return (
<div>
<Button {...props} onClick={getRandomMusic.bind(this)} />
<SomeComponent />
<p>Some text here</p>
</div>
);
};
我想在等待 promise 解决时添加一个微调器。fetchMusic 在其他文件中。我将它导入到一个组件中。
解决方案
TLDR
怎么样使用
useState
和useCallback
那个动作
回答
在反应方面,State
用于加载动作是正确的用例。
所以,什么时候启动函数,使用cansetLoading(true)
和after action就可以setLoading(false)
实现加载效果了
const fetchMusic= () => {
return new Promise((resolve) =>
setTimeout(() => {
const music = musicList.sort(() => 0.5 - Math.random()).slice(0, 4);
resolve({ data: music});
}, 300)
);
};
export default fetchMusic;
const Button = (props) => {
const [loaidng, setLoading] = useState(false);
const getRandomMusic = useCallback(() => {
setLoading(true)
return fetchMusic().then((result) => {
setLoading(false);
result.data
});
},[]);
return (
<div>
<Button {...props} onClick={getRandomMusic.bind(this)} />
{loading && <Sipinner/>}
<SomeComponent />
<p>Some text here</p>
</div>
);
};
参考
ETC
如果您还有其他问题。请给我评论。
推荐阅读
- python - 释放元组的元素?
- javascript - 如何在 jQuery 类的每个函数中使用“this”访问该类?
- ios - 使用标签栏控制器时在视图控制器之间传递数据
- typescript - 如何在本地文件中导入数组以用于 Vue 3 TypeScript 项目?
- macos - 如何限制 SwiftUI macOS 应用程序中的窗口实例?
- python - 多处理暂停 1 个代码,而另一个处于活动状态?
- java - SpringBoot:EclipseLink 与 H2
- git - VSCode:提交 VSCode 在项目中使用的扩展列表的最佳方式是什么?
- flutter - Flutter with Translator:为什么参数类型是“未来”
'不能分配给参数类型'String'? - sql - Oracle Case 语句在查询返回 null 时写入零