全局loading控制可通过axios拦截器配合状态管理实现一次配置处处生效:1.创建响应式isloading变量并封装setloading函数;2.请求拦截器中按需调用setloading(true);3.响应拦截器中统一调用setloading(false);4.请求时通过{showloading:true}启用。

全局 Loading 控制不需要手动在每个请求前后写 showLoading() 和 hideLoading(),用 Axios 拦截器配合一个状态管理变量,就能实现“一次配置、处处生效”。核心思路是:拦截所有请求和响应,自动控制 Loading 显示与隐藏。
1. 创建共享的 Loading 状态
用一个响应式变量(如 Vue 的 ref 或 React 的 useState)保存当前加载状态,并提供统一的修改入口。推荐封装成可被拦截器调用的函数:
- Vue 示例(组合式 API):
const isLoading = ref(false)
export const setLoading = (value) => { isLoading.value = value } - React 示例:
const [isLoading, setIsLoading] = useState(false)
export const setLoading = (value) => setIsLoading(value)
2. 在 Axios 请求拦截器中开启 Loading
只对非 GET 请求(或按需过滤)触发 Loading,避免列表刷新等高频请求频繁闪烁:
- 判断
config.method !== 'get'再调用setLoading(true) - 可加白名单逻辑,例如仅对带
showLoading: true配置的请求启用:
if (config.showLoading !== false) setLoading(true)
3. 在响应拦截器中关闭 Loading
无论请求成功或失败,都应关闭 Loading,否则容易残留。注意:需确保在 finally 语义下执行:
- 使用
axios.interceptors.response.use(..., error => { setLoading(false); return Promise.reject(error); }) - 更稳妥的方式是用
Promise.finally包裹响应处理(Axios 0.27+ 支持interceptors.response.use的第三个参数)
4. 使用时“一行代码”激活 Loading
发起请求时,只需在 config 中添加 { showLoading: true } —— 这就是你想要的“一行代码”:
- axios.post('/api/submit', data, { showLoading: true })
- GET 请求默认不触发,如需强制显示,同样加该字段即可
- 想彻底禁用某次请求的 Loading?传
{ showLoading: false }
不复杂但容易忽略:Loading 状态要防抖、防重入,比如连续快速点击提交,应确保只有一个 Loading 处于激活态;实际项目中建议加个计数器(requestCount++ / --),而非简单布尔值切换。









