// 这里插入之前的文章目录
这一篇我们继续介绍如何使用Ant Design的Table组件,关于前面的系列介绍,可以参考上面的目录。
为Table组件添加Loading效果
在实际开发中,表格数据通常是通过异步请求获取的,异步请求通常是耗时的,我们不能让用户干等,需要加上Loading以提高用户体验。Ant Design为Table组件提供了loading
属性来控制数据的加载状态,我们就利用这个属性来实现Loading效果。
首先定义一个loading
状态变量,用于控制表格的Loading状态。然后在获取用户数据时,将loading
设置为true
,请求完成后再设置为false
。
1 | export default function Users() { |
此时运行程序,表格数据加载时页面会显示Loading效果,等数据加载完成后,Loading会自动消失。
但是这段代码有一个非常隐蔽的问题,你看出来了吗?如果fetchUsers
产生了异常,也就是当.then
没有被调用时,loading
状态将一直保持为true
,导致表格一直处于Loading状态。为了避免这种情况,我们需要在.catch
中也将loading
设置为false
。
1 | useEffect(() => { |
这时候,无论用户数据获取成功还是失败,表格的Loading状态都会正确更新。但是上面的代码还是不太优雅,因为我们在每个分支中都重复了setLoading(false)
,这不是一个好的实践。我们可以使用finally
来简化代码。
1 | useEffect(() => { |
现在已经消除了重复代码,但是Promise的方式产生了很多的缩进,这就是所谓的“回调地狱”。我们再使用async/await
来重构一下代码。因为要使用async/await
,我们需要将useEffect
中的逻辑封装成一个新的async
函数 - getUsers
,然后在useEffect
中调用它。注意,我们不能直接在useEffect
中使用await
操作,如果非要那么做的话,只能将await
代码封装成一个IIFE
放到useEffect
中,但是那样可读性非常差。
使用async/await
重构后的代码如下, 是不是更清晰了呢?
1 | const getUsers = async () => { |
更友好的提示
回顾上面的代码,似乎一切都很完美了,但是如果用户获取数据失败,也就是走到catch
分支时,我们只是在控制台打印了错误信息,这个错误信息对我们分析程序错误很有帮助,但是对于用户来说,却没有得到任何提示,用户并不知道发生了什么,所以我们可以添加一个更友好的提示,比如使用Ant Design的message
组件来告知用户发生了错误。
1 | const getUsers = async () => { |
好了,今天就到这里了,我们明天继续。祝大家编程愉快!