当前位置:首页 > React

react实现单选全选

2026-01-26 22:04:00React

实现单选与全选功能

在React中实现单选和全选功能通常涉及状态管理和事件处理。以下是一个完整的实现方案:

基础状态设置

const [items, setItems] = useState([
  { id: 1, name: 'Item 1', checked: false },
  { id: 2, name: 'Item 2', checked: false },
  { id: 3, name: 'Item 3', checked: false }
]);

const [selectAll, setSelectAll] = useState(false);

处理单选逻辑

const handleSingleSelect = (id) => {
  setItems(prevItems => 
    prevItems.map(item => 
      item.id === id ? { ...item, checked: !item.checked } : item
    )
  );

  // 检查是否所有项都被选中
  const allSelected = items.every(item => item.checked);
  setSelectAll(allSelected);
};

处理全选逻辑

const handleSelectAll = (e) => {
  const isChecked = e.target.checked;
  setSelectAll(isChecked);

  setItems(prevItems => 
    prevItems.map(item => ({ ...item, checked: isChecked }))
  );
};

渲染组件

return (
  <div>
    <label>
      <input 
        type="checkbox" 
        checked={selectAll} 
        onChange={handleSelectAll} 
      />
      全选
    </label>

    {items.map(item => (
      <div key={item.id}>
        <label>
          <input 
            type="checkbox" 
            checked={item.checked} 
            onChange={() => handleSingleSelect(item.id)} 
          />
          {item.name}
        </label>
      </div>
    ))}
  </div>
);

优化与注意事项

  1. 派生状态selectAll状态可以从items派生,避免状态不一致
const selectAll = items.length > 0 && items.every(item => item.checked);
  1. 性能优化:对于大型列表,使用React.memo优化子组件
const Item = React.memo(({ item, onSelect }) => (
  <div>
    <label>
      <input 
        type="checkbox" 
        checked={item.checked} 
        onChange={() => onSelect(item.id)} 
      />
      {item.name}
    </label>
  </div>
));
  1. 不可变更新:确保状态更新时创建新对象/数组,而非直接修改原状态

完整组件示例

import React, { useState } from 'react';

function SelectDemo() {
  const [items, setItems] = useState([
    { id: 1, name: 'Item 1', checked: false },
    { id: 2, name: 'Item 2', checked: false },
    { id: 3, name: 'Item 3', checked: false }
  ]);

  const handleSingleSelect = (id) => {
    setItems(prevItems => 
      prevItems.map(item => 
        item.id === id ? { ...item, checked: !item.checked } : item
      )
    );
  };

  const selectAll = items.length > 0 && items.every(item => item.checked);

  const handleSelectAll = (e) => {
    const isChecked = e.target.checked;
    setItems(prevItems => 
      prevItems.map(item => ({ ...item, checked: isChecked }))
    );
  };

  return (
    <div>
      <label>
        <input 
          type="checkbox" 
          checked={selectAll} 
          onChange={handleSelectAll} 
        />
        全选
      </label>

      {items.map(item => (
        <Item 
          key={item.id} 
          item={item} 
          onSelect={handleSingleSelect} 
        />
      ))}
    </div>
  );
}

const Item = React.memo(({ item, onSelect }) => (
  <div>
    <label>
      <input 
        type="checkbox" 
        checked={item.checked} 
        onChange={() => onSelect(item.id)} 
      />
      {item.name}
    </label>
  </div>
));

export default SelectDemo;

这种方法提供了清晰的单选和全选功能实现,同时考虑了性能优化和状态一致性。

react实现单选全选

标签: 全选单选
分享给朋友:

相关文章

vue全选实现

vue全选实现

Vue 全选实现方法 在 Vue 中实现全选功能通常涉及数据绑定和事件处理。以下是几种常见的实现方式: 基础实现方式 <template> <div> <…

vue 实现全选

vue 实现全选

实现全选功能的方法 在 Vue 中实现全选功能通常涉及以下关键步骤: 数据绑定与状态管理 使用 v-model 绑定全选复选框的状态,并通过计算属性或方法管理子项的选中状态。例如: data(…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

vue 实现单选

vue 实现单选

实现单选功能的方法 在Vue中实现单选功能可以通过多种方式完成,以下是几种常见的方法: 使用v-model绑定单选按钮 通过v-model可以轻松实现单选功能。将v-model绑定到一个变量,…

vue实现 单选

vue实现 单选

实现 Vue 单选功能 在 Vue 中实现单选功能可以通过多种方式完成,常见的有使用原生 HTML 的 <input type="radio"> 结合 Vue 的数据绑定,或使用第三方 U…

vue实现选择全选

vue实现选择全选

Vue 实现全选功能 全选功能通常用于表格或列表,允许用户一键选中所有选项。以下是基于 Vue 的实现方法: 基础实现方式 <template> <div> &l…