当前位置:首页 > React

react数据懒加载如何实现

2026-01-25 15:08:52React

React 数据懒加载实现方法

使用 React.lazySuspense 实现组件懒加载

React.lazy 允许动态导入组件,配合 Suspense 实现懒加载效果。适用于路由组件或大型组件。

import React, { Suspense } from 'react';

const LazyComponent = React.lazy(() => import('./LazyComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

图片懒加载实现

通过 IntersectionObserver API 监听元素是否进入视口,动态加载图片资源。

import React, { useEffect, useRef } from 'react';

function LazyImage({ src, alt }) {
  const imgRef = useRef();

  useEffect(() => {
    const observer = new IntersectionObserver((entries) => {
      entries.forEach(entry => {
        if (entry.isIntersecting) {
          const img = entry.target;
          img.src = img.dataset.src;
          observer.unobserve(img);
        }
      });
    });

    observer.observe(imgRef.current);
    return () => observer.disconnect();
  }, []);

  return <img ref={imgRef} data-src={src} alt={alt} />;
}

数据分页加载

结合滚动事件或按钮点击实现数据分批加载,常见于长列表场景。

import React, { useState, useEffect } from 'react';

function LazyList() {
  const [items, setItems] = useState([]);
  const [page, setPage] = useState(1);

  const loadMore = () => {
    fetch(`/api/items?page=${page}`)
      .then(res => res.json())
      .then(data => {
        setItems(prev => [...prev, ...data]);
        setPage(prev => prev + 1);
      });
  };

  useEffect(() => {
    loadMore();
  }, []);

  return (
    <div>
      <ul>
        {items.map(item => (
          <li key={item.id}>{item.name}</li>
        ))}
      </ul>
      <button onClick={loadMore}>Load More</button>
    </div>
  );
}

自定义 Hook 实现数据懒加载

封装可复用的懒加载逻辑,适用于各种数据加载场景。

import { useState, useEffect } from 'react';

function useLazyLoad(loadFn, initialData = []) {
  const [data, setData] = useState(initialData);
  const [loading, setLoading] = useState(false);
  const [hasMore, setHasMore] = useState(true);

  const loadMore = async () => {
    if (loading || !hasMore) return;
    setLoading(true);
    const newData = await loadFn();
    setData(prev => [...prev, ...newData]);
    setHasMore(newData.length > 0);
    setLoading(false);
  };

  return { data, loading, hasMore, loadMore };
}

虚拟列表优化

对于超长列表,使用虚拟列表技术只渲染可见区域元素,大幅提升性能。

react数据懒加载如何实现

import { FixedSizeList as List } from 'react-window';

function VirtualList({ items }) {
  return (
    <List
      height={500}
      itemCount={items.length}
      itemSize={50}
      width={300}
    >
      {({ index, style }) => (
        <div style={style}>
          {items[index]}
        </div>
      )}
    </List>
  );
}

注意事项

  • 懒加载组件需搭配 Suspense 使用并提供 fallback UI
  • 图片懒加载需考虑占位符和加载失败处理
  • 分页加载需注意重复请求和边界条件处理
  • 虚拟列表需准确计算元素尺寸
  • 所有懒加载实现都应考虑错误处理机制

分享给朋友:

相关文章

vue中如何实现循环

vue中如何实现循环

循环渲染列表数据 在Vue中,使用v-for指令实现循环渲染。基本语法为v-for="(item, index) in items",其中items是数据源数组,item是当前遍历的元素,index是…

vue如何实现mvvm

vue如何实现mvvm

Vue 的 MVVM 实现原理 Vue 通过数据绑定和响应式系统实现 MVVM(Model-View-ViewModel)模式。其核心在于将数据模型(Model)与视图(View)通过 ViewMod…

前段vue如何实现

前段vue如何实现

Vue 前端实现方法 Vue 是一款流行的前端框架,用于构建用户界面。以下是一些常见的 Vue 实现方法: 组件化开发 Vue 的核心思想是组件化开发。每个组件可以独立封装逻辑、模板和样式,便于复用…

vue如何实现加减

vue如何实现加减

在 Vue 中实现加减功能 使用数据绑定和事件处理 通过 Vue 的数据绑定和事件处理机制可以轻松实现加减功能。定义一个数据变量存储数值,通过方法增减该变量。 <template>…

React如何实现通知

React如何实现通知

React 实现通知的方法 使用状态管理 在 React 组件中通过 useState 或 useReducer 管理通知状态,触发状态更新时显示通知。适合简单场景,无需额外依赖。 import {…

java是如何实现跨平台的

java是如何实现跨平台的

Java 跨平台的实现原理 Java 实现跨平台的核心机制基于 “一次编写,到处运行” 的理念,主要通过以下技术实现: 字节码与 JVM Java 源代码编译后生成字节码(.class 文件),而非…