antd 级联选择- 多选

本文介绍了一个基于Ant Design的React组件——级联选择多选组件(CascaderMul)的实现方法。该组件允许用户从层级结构的数据中进行多选操作,并通过Tag展示已选选项。组件使用了lodash和antd库,提供了自定义的displayRender函数来渲染已选标签,并实现了根据已选数据阻止重复选择的功能。
摘要由CSDN通过智能技术生成

antd 级联选择- 多选

  1. 将选中或者取消的数据维护起来 ===> [ ]
  2. 在displayRender 中用Tag渲染 ===> displayRender={(label, selectedOptions) => { }
import React from "react";
import PropTypes from "prop-types";
import { get, isEmpty, reduce, includes, filter } from "lodash";
import { Cascader, Tag } from "antd";

const options = [
  {
    code: 'zhejiang',
    name: '浙江',
    items: [
      {
        code: 'hangzhou',
        name: '杭州',
      },
    ],
  },
  {
    code: 'jiangsu',
    name: '江苏',
    items: [
      {
        code: 'nanjing',
        name: '南京',
      },
    ],
  },
];

const CascaderMul = ({ value = [], onChange, style }) => {
  // 根据数据拿到code的组合
  const connectCode = (arr = []) =>
    reduce(arr, (ss, vv) => (!ss ? vv.code : `${ss}-${vv.code}`), "");

  return (
    <div>
      <Cascader
        style={style}
        allowClear={false}
        fieldNames={{ label: "name", value: "code", children: "items" }}
        options={options}
        value={value}
        onChange={(v, l) => {
          const curCode = connectCode(l); // 将code记录一下
          l[l.length - 1].curCode = curCode;
          const allCode = reduce(
            value,
            (ss, vv) => [...ss, get(vv, [vv.length - 1, "curCode"])],
            []
          );
          // 已有的,不允许再选
          if (!includes(allCode || [], curCode)) {
            onChange([...value, l]);
          }
        }}
        displayRender={(label, selectedOptions) => {
          const l = isEmpty(selectedOptions)
            ? value
            : [...value, selectedOptions];
          return (l || []).map((v, i) => (
            <Tag
              closable
              key={get(v, [v.length - 1, "curCode"])}
              onClose={() => onChange(filter(value, (vv, ii) => ii !== i))}
            >
              {get(v, [v.length - 1, "name"])}
            </Tag>
          ));
        }}
      />
    </div>
  );
};

CascaderMul.propTypes = {
  value: PropTypes.array,
  style: PropTypes.object,
  onChange: PropTypes.func.isRequired,
};

CascaderMul.defaultProps = {
  style: {},
  value: [],
};

export default CascaderMul;

/// 调用
import React, { useEffect, useState } from "react";
import CascaderMul from "./CascaderMul";
export default  () =>{
const [val, setVal] = useState([]);

useEffect(() => {
    console.log("val:", val);
 }, [val]);
  
return <CascaderMul
        value={val}
        onChange={(vv) => setVal(vv)}
        style={{ width: 300 }}
      />
}
antd(Ant Design)是一个企业级的UI设计语言和React组件库,它提供了一套完整的中后台产品解决方案,其中级联选择器(Cascader)是一个常用的组件,用于处理有层级关系的数据选择。在处理大量数据时,为了提高性能,antd提供了懒加载(Lazy Load)的功能,即按需加载数据,而不是一次性加载所有数据。 级联选择器的懒加载功能可以通过配置`loadData`属性来实现。`loadData`属性是一个函数,它会在需要加载下一级数据时被调用。这个函数接受当前节点(`Option`)作为参数,并返回一个Promise对象,该对象在解决后将包含该节点的下一级数据。 实现懒加载的级联选择器时,你需要准备一个能表示层级关系的数据源,并且设计好如何按需获取下一级数据的逻辑。当用户展开某个节点时,组件会调用你提供的`loadData`函数来获取数据,并渲染下一级选项。 以下是实现懒加载级联选择器的基本步骤: 1. 准备数据源,并确保每个节点有表示层级关系的属性,如`value`、`label`、`children`等。 2. 使用`Cascader`组件,并为其设置`loadData`属性,该属性指向一个函数,该函数根据当前节点信息来异步获取下一级的数据。 3. 在`loadData`函数中,根据当前节点的信息(通常是其`value`),向服务器请求对应的数据,并返回一个Promise对象。 使用懒加载可以显著提高应用性能,尤其是在数据量大的场景下,因为它避免了一开始就加载所有数据,减少了内存的消耗和初始加载时间。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值