加载失败时重试按钮没反应怎么办?
大家好,我在做一个图片加载组件时遇到了问题。当图片请求失败后,我按规范显示了错误提示和重试按钮,但点击重试按钮完全没反应,控制台也没有报错。
我用axios发起请求时这样写的:
this.axios.get('/api/image')
.then(response => this.setData(response.data))
.catch(error => {
this.setState({ status: 'error' });
});
重试按钮绑定的方法是这样的:
retryHandler() {
this.setState({ status: 'loading' }, () => this.axios.get('/api/image'));
}
已经检查过网络请求确实能正常返回数据,状态切换逻辑也没问题。但点击重试按钮后loading状态没变,请求也没重新发起,感觉是哪里没绑定好?
retryHandler方法里,this.axios.get请求没有正确处理状态更新和错误逻辑。你只调用了请求,但没重新绑定.then和.catch,所以即使请求成功或失败,组件的状态也不会更新。复制这个代码试试:
关键点是:
setState的回调函数里必须完整处理请求的逻辑,包括成功和失败的情况。你之前的代码只发起了请求,但没处理响应,导致状态卡在loading。另外吐槽一句,这种问题调试起来真是烦,建议以后在
catch里加个console.error(error),至少能快速定位问题。复制这个改一下,应该就没问题了。更关键的是,你 setState 的回调里直接扔了个 promise 进去,这不会触发任何数据更新逻辑。别走弯路,改法很简单:
把请求塞进 setState 的回调里,确保 loading 状态先更新,再重新发起请求,并且一定要接住 .then 和 .catch 来处理后续状态。不然你以为在重试,其实请求早就沉了。