当前位置:首页 > React

react如何控制全局loading

2026-01-24 07:40:04React

控制全局Loading的方法

在React中实现全局Loading控制,通常需要结合状态管理工具或上下文机制。以下是几种常见实现方式:

使用Context API

创建全局Loading状态上下文:

import React, { createContext, useContext, useState } from 'react';

const LoadingContext = createContext();

export const LoadingProvider = ({ children }) => {
  const [isLoading, setIsLoading] = useState(false);

  return (
    <LoadingContext.Provider value={{ isLoading, setIsLoading }}>
      {children}
    </LoadingContext.Provider>
  );
};

export const useLoading = () => useContext(LoadingContext);

在根组件中包裹Provider:

import { LoadingProvider } from './LoadingContext';

function App() {
  return (
    <LoadingProvider>
      {/* 其他组件 */}
    </LoadingProvider>
  );
}

在需要的地方使用:

import { useLoading } from './LoadingContext';

function SomeComponent() {
  const { isLoading, setIsLoading } = useLoading();

  const fetchData = async () => {
    setIsLoading(true);
    await apiCall();
    setIsLoading(false);
  };
}

使用Redux管理状态

创建loading相关的action和reducer:

// actions.js
export const SET_LOADING = 'SET_LOADING';

export const setLoading = (isLoading) => ({
  type: SET_LOADING,
  payload: isLoading
});

// reducer.js
const initialState = { isLoading: false };

export const loadingReducer = (state = initialState, action) => {
  switch(action.type) {
    case SET_LOADING:
      return { ...state, isLoading: action.payload };
    default:
      return state;
  }
};

在组件中使用:

import { useDispatch, useSelector } from 'react-redux';
import { setLoading } from './actions';

function Component() {
  const dispatch = useDispatch();
  const isLoading = useSelector(state => state.loading.isLoading);

  const handleClick = async () => {
    dispatch(setLoading(true));
    await fetchData();
    dispatch(setLoading(false));
  };
}

自定义Hook方案

创建可复用的loading hook:

import { useState } from 'react';

export const useGlobalLoading = () => {
  const [loadingCount, setLoadingCount] = useState(0);

  const isLoading = loadingCount > 0;

  const showLoading = () => setLoadingCount(prev => prev + 1);
  const hideLoading = () => setLoadingCount(prev => Math.max(0, prev - 1));

  return { isLoading, showLoading, hideLoading };
};

拦截HTTP请求

通过axios拦截器实现自动loading控制:

import axios from 'axios';
import { useLoading } from './LoadingContext';

const api = axios.create();

export const setupInterceptors = (setLoading) => {
  api.interceptors.request.use(config => {
    setLoading(true);
    return config;
  });

  api.interceptors.response.use(
    response => {
      setLoading(false);
      return response;
    },
    error => {
      setLoading(false);
      return Promise.reject(error);
    }
  );
};

全局Loading组件实现

创建可复用的UI组件:

import React from 'react';
import { useLoading } from './LoadingContext';

export const GlobalLoading = () => {
  const { isLoading } = useLoading();

  if (!isLoading) return null;

  return (
    <div className="fixed inset-0 bg-black bg-opacity-50 flex items-center justify-center z-50">
      <div className="text-white text-xl">Loading...</div>
    </div>
  );
};

在App组件中使用:

import { GlobalLoading } from './GlobalLoading';

function App() {
  return (
    <>
      <GlobalLoading />
      {/* 其他内容 */}
    </>
  );
}

注意事项

  • 考虑使用防抖或延迟显示机制避免闪烁
  • 对于并发请求场景,建议使用计数器而非布尔值
  • 可以结合Promise或async/await简化代码
  • 在SPA应用中注意路由切换时的loading状态清除

以上方案可根据项目规模和技术栈选择合适的方式组合使用。Context API适合中小型项目,Redux更适合复杂状态管理需求。

react如何控制全局loading

标签: 全局react
分享给朋友:

相关文章

如何优化react

如何优化react

优化 React 性能的方法 使用 React.memo 或 PureComponent 对于函数组件,使用 React.memo 进行记忆化,避免不必要的重新渲染。类组件可以使用 PureCompo…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…

如何开发react

如何开发react

开发React应用的基本步骤 安装Node.js和npm 确保系统中已安装Node.js(包含npm)。可通过官网下载安装包,安装后验证版本: node -v npm -v 创建React项目…

react如何迭代

react如何迭代

在 React 中迭代数组或对象 React 提供了多种方式来处理数组或对象的迭代,以下是常见的方法: 使用 map 方法迭代数组 map 是 JavaScript 数组的内置方法,常用于在 Re…

如何启动react

如何启动react

安装Node.js 确保系统已安装Node.js(建议使用LTS版本),可通过官网下载并安装。安装完成后,在终端运行以下命令验证版本: node -v npm -v 创建React项目 使用官方工…

react如何打包

react如何打包

打包 React 项目的基本步骤 React 项目通常使用 create-react-app 或类似的脚手架工具创建,这些工具内置了打包功能。以下是打包 React 项目的详细方法: 安装依赖并构…