当前位置:首页 > React

react实现单选全选

2026-01-26 22:04:00React

实现单选与全选功能

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

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;

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

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

相关文章

用vue实现全选

用vue实现全选

实现全选功能的基本思路 在Vue中实现全选功能通常涉及以下核心逻辑:通过一个布尔值控制全选状态,遍历子选项并同步其选中状态。以下是具体实现方法。 使用v-model绑定全选状态 在模板中,使用v-m…

vue表格实现单选

vue表格实现单选

实现 Vue 表格单选功能 使用 v-model 绑定选中状态 在表格的每一行添加单选按钮或点击行触发选中,通过 v-model 绑定一个变量存储当前选中行的唯一标识(如 id)。 示例代码: &l…

vue实现列表全选

vue实现列表全选

实现全选功能的基本思路 在Vue中实现列表全选功能,通常需要结合v-model和计算属性来管理选中状态。全选按钮的状态与列表中所有项的选中状态相互关联。 基础实现方法 准备一个数据列表和对应的选中状…

vue实现全选 多选

vue实现全选 多选

Vue实现全选与多选功能 在Vue中实现全选和多选功能通常涉及数据绑定、事件处理和状态管理。以下是两种常见的实现方式: 基于v-model的双向绑定 使用v-model绑定复选框组,结合计算…

vue实现单选按钮组

vue实现单选按钮组

实现单选按钮组的方法 在Vue中实现单选按钮组可以通过多种方式完成,以下是几种常见的方法: 使用v-model绑定数据 通过v-model可以轻松实现单选按钮组的数据绑定。确保所有单选按钮的v-mo…

vue radio如何实现全选

vue radio如何实现全选

实现 Vue Radio 全选功能 在 Vue 中实现 Radio 全选功能,可以通过绑定动态数据和计算属性来实现。以下是一种常见的方法: 数据绑定与事件处理 <template>…