当前位置:首页 > React

react hooks实现列表

2026-01-27 05:39:50React

使用 React Hooks 实现列表

React Hooks 提供了一种简洁的方式来管理状态和副作用,非常适合实现动态列表功能。以下是几种常见的实现方法:

基础列表实现

通过 useState 管理列表数据,结合 map 方法渲染列表项:

import React, { useState } from 'react';

function TodoList() {
  const [items, setItems] = useState(['Item 1', 'Item 2']);
  const [inputValue, setInputValue] = useState('');

  const addItem = () => {
    setItems([...items, inputValue]);
    setInputValue('');
  };

  return (
    <div>
      <input 
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
      />
      <button onClick={addItem}>Add</button>
      <ul>
        {items.map((item, index) => (
          <li key={index}>{item}</li>
        ))}
      </ul>
    </div>
  );
}

带删除功能的列表

扩展基础列表,添加删除功能:

const removeItem = (indexToRemove) => {
  setItems(items.filter((_, index) => index !== indexToRemove));
};

// 在渲染部分添加删除按钮
{items.map((item, index) => (
  <li key={index}>
    {item}
    <button onClick={() => removeItem(index)}>Delete</button>
  </li>
))}

性能优化列表

对于大型列表,使用 React.memouseCallback 优化性能:

const MemoizedItem = React.memo(function Item({ item, onDelete }) {
  return (
    <li>
      {item}
      <button onClick={onDelete}>Delete</button>
    </li>
  );
});

function OptimizedList() {
  const [items, setItems] = useState(/*...*/);

  const handleDelete = useCallback((index) => {
    setItems(prev => prev.filter((_, i) => i !== index));
  }, []);

  return (
    <ul>
      {items.map((item, index) => (
        <MemoizedItem 
          key={index}
          item={item}
          onDelete={() => handleDelete(index)}
        />
      ))}
    </ul>
  );
}

异步数据列表

使用 useEffectuseState 处理异步数据加载:

function AsyncList() {
  const [items, setItems] = useState([]);
  const [loading, setLoading] = useState(true);

  useEffect(() => {
    fetch('https://api.example.com/items')
      .then(res => res.json())
      .then(data => {
        setItems(data);
        setLoading(false);
      });
  }, []);

  if (loading) return <div>Loading...</div>;

  return (
    <ul>
      {items.map(item => (
        <li key={item.id}>{item.name}</li>
      ))}
    </ul>
  );
}

可排序列表

实现拖拽排序功能需要结合第三方库如 react-beautiful-dnd

import { DragDropContext, Droppable, Draggable } from 'react-beautiful-dnd';

function SortableList() {
  const [items, setItems] = useState(/*...*/);

  const onDragEnd = (result) => {
    if (!result.destination) return;

    const newItems = Array.from(items);
    const [removed] = newItems.splice(result.source.index, 1);
    newItems.splice(result.destination.index, 0, removed);

    setItems(newItems);
  };

  return (
    <DragDropContext onDragEnd={onDragEnd}>
      <Droppable droppableId="list">
        {(provided) => (
          <ul ref={provided.innerRef} {...provided.droppableProps}>
            {items.map((item, index) => (
              <Draggable key={item.id} draggableId={item.id} index={index}>
                {(provided) => (
                  <li
                    ref={provided.innerRef}
                    {...provided.draggableProps}
                    {...provided.dragHandleProps}
                  >
                    {item.content}
                  </li>
                )}
              </Draggable>
            ))}
            {provided.placeholder}
          </ul>
        )}
      </Droppable>
    </DragDropContext>
  );
}

关键注意事项

  • 始终为列表项提供稳定的 key 属性(避免使用索引作为 key 当列表会变化时)
  • 复杂状态更新使用函数式更新确保准确性:setItems(prev => [...prev, newItem])
  • 大型列表考虑虚拟滚动技术(如 react-window 库)
  • 表单输入需要受控组件管理(如示例中的 inputValue 状态)

react hooks实现列表

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

相关文章

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指阻止组件在特定条件下进行不必要的渲染。可以通过以下几种方式实现: 条件渲染 使用条件语句(如if或三元运算符)直接返回null,避免渲染组件内容。例如:…

vue列表查询实现

vue列表查询实现

实现 Vue 列表查询功能 基础列表渲染 在 Vue 中可以通过 v-for 指令实现列表渲染,结合计算属性动态过滤数据: <template> <div> &…

vue实现商品列表

vue实现商品列表

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

vue实现列表水印

vue实现列表水印

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

vue 实现长列表

vue 实现长列表

vue 实现长列表的优化方法 使用虚拟滚动技术,只渲染可视区域内的元素,大幅减少DOM节点数量。通过计算滚动位置动态更新显示内容,降低内存占用和渲染压力。 <template> &…

react native 如何

react native 如何

React Native 开发基础 React Native 是一个用于构建跨平台移动应用的框架,允许开发者使用 JavaScript 和 React 编写代码,同时生成原生 iOS 和 Androi…