当前位置:首页 > React

react 如何更新长列表

2026-01-24 19:47:27React

虚拟列表(Virtual List)

对于超长列表(如数千条数据),直接渲染所有DOM节点会导致性能问题。虚拟列表技术仅渲染可视区域内的元素,通过动态计算滚动位置更新显示内容。

实现方案:

  • react-windowreact-virtualized 库提供开箱即用的虚拟列表组件。

  • 示例代码(使用 react-window):

    import { FixedSizeList as List } from 'react-window';
    
    const Row = ({ index, style }) => (
      <div style={style}>Row {index}</div>
    );
    
    const LongList = () => (
      <List
        height={500}
        itemCount={1000}
        itemSize={35}
        width={300}
      >
        {Row}
      </List>
    );

分页加载(Pagination)

将长列表拆分为多页,用户滚动到底部时异步加载下一页数据。

关键点:

  • 监听滚动事件,判断是否接近列表底部。

  • 使用 useStateuseReducer 管理当前页数和加载状态。

  • 示例代码:

    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();
    }, []);

键值优化(Key Optimization)

确保列表项的 key 唯一且稳定,避免因 key 变化导致不必要的重新渲染。

建议:

  • 使用数据中的唯一标识(如 id)而非数组索引。
  • 示例:
    {items.map(item => (
      <div key={item.id}>{item.name}</div>
    ))}

不可变数据更新(Immutable Updates)

通过解构或库(如 immer)避免直接修改状态,减少不必要的渲染。

示例:

// 更新某项数据
setItems(prev => prev.map(item => 
  item.id === updatedItem.id ? updatedItem : item
));

防抖/节流(Debounce/Throttle)

对频繁触发的更新(如搜索过滤)使用防抖或节流控制频率。

示例(使用 lodash):

import { debounce } from 'lodash';

const handleSearch = debounce((query) => {
  setFilteredItems(items.filter(item => item.name.includes(query)));
}, 300);

性能监测工具

使用 React DevTools 和 Profiler 组件分析列表渲染性能,定位瓶颈。

示例:

import { Profiler } from 'react';

const onRender = (id, phase, duration) => {
  console.log(`渲染耗时: ${duration}ms`);
};

<Profiler id="LongList" onRender={onRender}>
  <LongList />
</Profiler>

react 如何更新长列表

标签: 列表react
分享给朋友:

相关文章

vue公共列表的实现

vue公共列表的实现

实现 Vue 公共列表组件 公共列表组件通常用于展示重复结构的数据,例如商品列表、用户列表等。以下是一个典型的实现方式: 基础实现 创建可复用的列表组件 List.vue: <templ…

react 如何引入jquery

react 如何引入jquery

安装 jQuery 库 在 React 项目中引入 jQuery 的第一步是安装 jQuery。可以通过 npm 或 yarn 安装: npm install jquery # 或 yarn a…

vue实现搜索列表

vue实现搜索列表

Vue 实现搜索列表 在 Vue 中实现搜索列表功能,通常需要结合数据绑定、计算属性和事件监听。以下是一个完整的实现方案: 数据准备与模板结构 <template> <div&…

vue实现列表权限

vue实现列表权限

实现列表权限的基本思路 在Vue中实现列表权限通常涉及根据用户角色或权限动态渲染列表内容。核心逻辑是通过权限判断控制列表项的显示、隐藏或操作权限。 权限数据管理 使用Vuex或Pinia存储全局权…

vue实现商品列表

vue实现商品列表

Vue实现商品列表的方法 使用Vue实现商品列表需要结合数据绑定、组件化和状态管理。以下是实现商品列表的几种常见方法: 基础数据绑定实现 在Vue组件中定义商品数据数组,使用v-for指令循环渲染商…

vue实现列表水印

vue实现列表水印

实现列表水印的方法 在Vue中为列表添加水印可以通过多种方式实现,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性为列表元素添加水印背景。水印可以是文字或…