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

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

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

相关文章

jquery 单选

jquery 单选

jQuery 单选按钮操作 在 jQuery 中,操作单选按钮(Radio Button)通常涉及选中状态、取值和事件绑定。以下是常见操作示例: 获取选中的单选按钮值 通过 :checked 选择器…

vue实现点击全选

vue实现点击全选

Vue 实现点击全选功能 在 Vue 中实现点击全选功能可以通过多种方式完成,以下是几种常见的实现方法: 使用 v-model 和计算属性 通过计算属性来实现全选和反选功能,适用于复选框列表…

vue实现商品全选

vue实现商品全选

实现全选功能的基本思路 在Vue中实现商品全选功能,通常需要维护一个商品列表数据和一个选中状态数组。通过计算属性判断是否全选,通过方法控制全选或取消全选。 定义数据模型 data() { ret…

vue实现单选弹窗

vue实现单选弹窗

Vue 实现单选弹窗的方法 使用 Element UI 的 Dialog 和 Radio 组件 安装 Element UI 后,可以通过 Dialog 和 Radio 组件快速实现单选弹窗功能。 &…

vue 实现图片单选

vue 实现图片单选

Vue 实现图片单选功能 在 Vue 中实现图片单选功能,可以通过结合 v-model 和自定义事件来实现。以下是具体实现方法: 方法一:使用 v-model 和计算属性 创建一个 Vue 组件,包…

vue 实现组单选

vue 实现组单选

Vue 实现单选组 在 Vue 中实现单选组可以通过多种方式,以下是几种常见的实现方法: 使用 v-model 绑定单选按钮组 通过 v-model 绑定一个变量,单选按钮的 value 属性对应…