React + Antd 自定义Select选择框 全选、清空功能

实现代码

import React, { useState, useEffect } from 'react';
import { Select, Space, Divider, Button } from 'antd';

export default function AllSelect (props) {
  const {
    fieldNames, // 自定义节点labbel、value、options、grouLabel
    options, // 数据化配置选项内容,{label,value}[]

    value, // 指定当前选中的条目,多选时为一个数组
    onChange, // 选中option或input的value变化时
    ...restProps
  } = props;

  // console.log('AllSelect', mode);

  const [selectValue, setSelectValue] = useState([]);
  const [isShowAll, setIsShowAll] = useState(false);

  const selectAll = () => {
    let values = options.map(option => {
      return fieldNames.value
        ? option[fieldNames.value]
        : option.value || option;
    });
    setSelectValue(values);
    onChange(values);
  };

  const clearAll = () => {
    setSelectValue([]);
    onChange([]);
  };

  // 选中option或input的value变化时
  const handleChange = (values, option) => {
    console.log('handleChange', values);
    setSelectValue(values);
    onChange(values);
  };

  // 页面加载完成时调用
  useEffect(() => {
    if (props.mode) {
      setIsShowAll(true);
    } else {
      setIsShowAll(false);
    }
  }, []);

  return (
    <Select
      placeholder='请选择'
      fieldNames={fieldNames}
      value={selectValue}
      options={options}
      onChange={handleChange}
      dropdownRender={menu => (
        <>
          {menu}

          {isShowAll ? (
            <>
              <Divider style={{ margin: '8px 0' }} />
              <Space>
                <Button type='link' onClick={selectAll}>
                  全选
                </Button>
                <Button type='link' onClick={clearAll}>
                  清空
                </Button>
              </Space>
            </>
          ) : (
            ''
          )}
        </>
      )}
      {...restProps}
    ></Select>
  );
}

使用

import { useState } from "react";

export default function SelectDemo() {
  const { optionList, setOptionList } = useState([
    {
      id: 1,
      name: "律师",
    },
    {
      id: 2,
      name: "教师",
    },
    {
      id: 3,
      name: "厨师",
    },
    {
      id: 4,
      name: "会计",
    },
  ]);
  return (
    <AllSelect
      style={{ width: 300 }}
      options={optionList}
      mode="multiple"
      defaultValue={[]}
      maxTagCount="responsive"
      fieldNames={{ label: "name", value: "id" }}
    ></AllSelect>
  );
}

参考:
https://blog.csdn.net/likepoems/article/details/128549643
https://www.cnblogs.com/likepoems/p/17025233.html
https://blog.csdn.net/qq_41620887/article/details/129985339

<think>好的,我现在需要在React中使用antd实现多个下拉框的全选功能。首先,我需要回顾一下用户提供的引用内容,看看有没有相关的例子或者提示。 用户提到了引用[2],里面是关于Vue和antd多选选择框添加全选功能的代码。虽然用的是Vue,但可能思路类似。在React中,antdSelect组件如何实现全选呢? 首先,我需要了解antdSelect组件在多选模式下如何工作。用户给出的例子中,Vue版本的代码是通过在选项中添加一个“全部”选项,并通过事件处理函数来控制选中状态。React版本应该也是类似的,但需要适应React的语法和状态管理。 接下来,我需要考虑如何构造组件的结构。可能需要在Select组件中添加一个“全选”的Option,然后通过onChange事件来处理用户的选择。当用户点击“全选”时,需要将所有的选项都选中,或者如果已经全选,则取消所有选择。 另外,用户提到在Vue代码中,通过selectedValues这个ref来管理选中的值,并在handleChange和handleSelectAll方法中处理逻辑。在React中,应该使用useState来管理选中的值,以及处理事件。 还需要注意的一点是,当用户选择“全部”时,可能需要排除其他选项,或者当用户手动选择所有选项时,自动勾选“全部”。这可能需要在onChange事件中进行判断,比如检查当前选中的值是否包含了所有选项的id,如果是的话,就自动添加“全部”选项,或者在用户点击“全部”时,将所有的选项id加入到选中的值中。 另外,用户提供的Vue代码中,当选中“全部”时,会过滤掉其他选项,只保留“全部”。但可能实际需求是,当选择“全部”时,选中所有选项,反之如果已经选中所有选项,则显示“全部”被选中。这可能需要更复杂的逻辑来处理。 在React中,可能需要使用useState来保存选中的值数组,然后在onChange时判断是否有“全部”选项被点击,并更新状态。同时,还需要处理当用户手动选择所有选项时,自动勾选“全部”的情况。 可能的步骤: 1. 使用Select组件的mode="multiple"来启用多选。 2. 在选项中添加一个“全部”选项,其value可能是一个特殊的值,比如null或者'all'。 3. 使用onChange事件处理函数来更新选中的值。 4. 在事件处理函数中,判断是否点击了“全部”选项,如果是,则切换所有选项的选中状态。 5. 同时,当用户手动选中的选项数量等于总选项数时,自动添加“全部”选项到选中值中,反之如果取消某个选项,则移除“全部”选项。 还需要注意,antdSelect组件在显示时可能会有maxTagCount的限制,比如只显示一个标签,其余用“+N”表示,这在用户提供的代码中也有体现。 现在,我需要将这些思路转化为React代码。例如,使用useState来管理selectedValues,然后在handleChange函数中处理逻辑。当用户选择“全部”时,如果当前选中的值包含“全部”,则替换为所有选项的值;如果用户取消“全部”,则清空选中的值。或者,当用户已经选中了所有选项,则自动显示“全部”被选中。 可能还需要处理选项的渲染,比如当用户选中所有选项时,显示“全部”而不是所有选项的标签。这可能需要自定义渲染或者利用antd的某些属性。 另外,需要注意防抖和性能问题,尤其是在选项很多的情况下,频繁更新状态可能会导致性能问题,但用户的问题中没有提到,可能暂时不需要处理。 最后,参考用户提供的React示例代码中的Select组件结构,结合全选功能的需求,整合出一个可行的解决方案。</think>在React中使用antd实现多选下拉框的全选功能,可以通过以下步骤实现: ### 实现步骤 1. **组件结构**:使用`Select`组件的`mode="multiple"`属性,并添加"全选"选项 2. **状态管理**:通过`useState`维护选中值集合 3. **事件处理**:通过`onChange`事件实现以下逻辑: - 选择"全部"时自动选中所有选项 - 已全选时取消任意选项则移除"全部"标识 - 手动全选时自动添加"全部"标识 ```jsx import { Select, Button } from 'antd'; import { useState } from 'react'; const { Option } = Select; const MultiSelectWithSelectAll = ({ options }) => { const [selectedValues, setSelectedValues] = useState([]); const allValues = options.map(opt => opt.value); const isAllSelected = selectedValues.includes('all') || selectedValues.length === options.length; const handleChange = (value) => { if (value.includes('all')) { // 点击全选时切换全选状态 setSelectedValues(isAllSelected ? [] : [...allValues, 'all']); } else { // 自动同步全选状态 const newIsAll = value.length === options.length; setSelectedValues(newIsAll ? [...value, 'all'] : value); } }; return ( <Select mode="multiple" value={selectedValues} onChange={handleChange} style={{ width: 300 }} maxTagCount={1} placeholder="请选择" > <Option key="all" value="all"> <Button type="link" style={{ padding: 0 }}> {isAllSelected ? '取消全选' : '全选'} </Button> </Option> {options.map(item => ( <Option key={item.value} value={item.value}> {item.label} </Option> ))} </Select> ); }; // 使用示例 const options = [ { value: 1, label: '选项1' }, { value: 2, label: '选项2' }, { value: 3, label: '选项3' }, ]; export default ()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值