当前位置:首页 > 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 };
}

虚拟列表优化

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

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
  • 图片懒加载需考虑占位符和加载失败处理
  • 分页加载需注意重复请求和边界条件处理
  • 虚拟列表需准确计算元素尺寸
  • 所有懒加载实现都应考虑错误处理机制

react数据懒加载如何实现

分享给朋友:

相关文章

vue如何实现登录

vue如何实现登录

实现登录功能的基本步骤 使用Vue实现登录功能通常需要结合后端API、状态管理以及路由控制。以下是常见的实现方式: 创建登录表单组件 在Vue组件中构建包含用户名和密码输入框的表单: <…

vue项目如何实现

vue项目如何实现

Vue项目实现步骤 环境搭建 确保已安装Node.js和npm。使用Vue CLI创建项目: npm install -g @vue/cli vue create my-project cd my…

vue底层如何实现

vue底层如何实现

Vue 底层的核心实现机制 Vue 的底层实现主要围绕响应式系统、虚拟 DOM 和组件化架构展开。以下是关键技术的详细解析: 响应式系统 依赖追踪与发布订阅模式 通过 Object.define…

vue如何实现到期提醒

vue如何实现到期提醒

实现思路 在Vue中实现到期提醒功能,可以通过计算日期差、定时检查和通知用户三个核心步骤完成。需要结合Vue的响应式特性和JavaScript的日期处理能力。 计算日期差 使用JavaScript…

vue实现懒加载的方法

vue实现懒加载的方法

Vue 实现懒加载的方法 路由懒加载 通过动态导入语法拆分路由组件,减少初始加载时间。适用于 Vue Router 配置: const routes = [ { path: '/hom…

如何实现vue

如何实现vue

安装 Vue.js 使用 npm 或 yarn 安装 Vue.js。确保已安装 Node.js 环境。 npm install vue # 或 yarn add vue 创建 Vue 实例 在 H…