当前位置:首页 > React

react如何控制loading状态

2026-02-26 18:56:57React

控制Loading状态的常见方法

在React中,控制loading状态通常通过组件状态管理实现,以下是几种常用方式:

使用useState钩子

import { useState } from 'react';

function DataFetcher() {
  const [isLoading, setIsLoading] = useState(false);
  const [data, setData] = useState(null);

  const fetchData = async () => {
    setIsLoading(true);
    const response = await fetch('api/data');
    const result = await response.json();
    setData(result);
    setIsLoading(false);
  };

  return (
    <div>
      {isLoading ? <p>Loading...</p> : <DisplayData data={data} />}
      <button onClick={fetchData}>Load Data</button>
    </div>
  );
}

使用自定义Hook封装

react如何控制loading状态

function useAsync(asyncFunction) {
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  const [result, setResult] = useState(null);

  const execute = async (...args) => {
    try {
      setLoading(true);
      const data = await asyncFunction(...args);
      setResult(data);
      setLoading(false);
    } catch (err) {
      setError(err);
      setLoading(false);
    }
  };

  return { execute, loading, error, result };
}

高级状态管理方案

结合Context API

const LoadingContext = createContext();

function LoadingProvider({ children }) {
  const [loadingCount, setLoadingCount] = useState(0);

  const value = {
    isLoading: loadingCount > 0,
    startLoading: () => setLoadingCount(c => c + 1),
    stopLoading: () => setLoadingCount(c => Math.max(0, c - 1))
  };

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

Redux方案

react如何控制loading状态

// actions.js
export const startLoading = () => ({ type: 'START_LOADING' });
export const stopLoading = () => ({ type: 'STOP_LOADING' });

// reducer.js
export default function loadingReducer(state = false, action) {
  switch(action.type) {
    case 'START_LOADING': return true;
    case 'STOP_LOADING': return false;
    default: return state;
  }
}

优化用户体验的技巧

延迟显示加载指示器 快速响应时避免闪烁,可使用setTimeout延迟显示:

useEffect(() => {
  const timer = setTimeout(() => {
    if (isLoading) setShowLoader(true);
  }, 300);

  return () => clearTimeout(timer);
}, [isLoading]);

骨架屏(Skeleton Screen) 在数据加载前预渲染内容轮廓:

function Skeleton() {
  return (
    <div className="skeleton">
      <div className="skeleton-header" />
      <div className="skeleton-content" />
    </div>
  );
}

并发模式下的Suspense React 18+推荐方式:

<Suspense fallback={<Spinner />}>
  <AsyncComponent />
</Suspense>

标签: 状态react
分享给朋友:

相关文章

react如何开发组件

react如何开发组件

React 组件开发基础 React 组件分为函数组件和类组件两种形式。函数组件是现代 React 开发的主流方式,结合 Hooks 可以实现完整功能。 函数组件示例: function Gree…

如何提高react

如何提高react

优化性能 使用React.memo对组件进行记忆化处理,避免不必要的重新渲染。对于类组件,可以使用PureComponent来达到类似效果。 利用useMemo缓存计算结果,避免重复计算。对于函数或…

react如何重写alert

react如何重写alert

重写 React 中的 alert 方法 在 React 中,直接使用原生 alert 会破坏用户体验,通常需要自定义弹窗组件替代。以下是实现方法: 使用自定义弹窗组件 创建可复用的弹窗组件,替代原…

如何封装表单react

如何封装表单react

封装 React 表单的方法 封装 React 表单可以通过创建可复用的表单组件或自定义 Hook 来实现。以下是几种常见的方法: 使用受控组件封装表单 通过状态管理表单数据,将表单字段的值与 Re…

react如何遍历树

react如何遍历树

遍历树结构的常用方法 在React中遍历树结构通常采用递归或迭代的方式。树结构可以是组件树、DOM树或自定义的数据结构。以下是几种常见的实现方法。 递归组件遍历 使用递归组件可以直观地渲染树形结构。…

react less如何配置

react less如何配置

在 React 项目中配置 Less 安装必要的依赖包,确保项目支持 Less 预处理样式。使用以下命令安装 less 和 less-loader: npm install less less-lo…