antd 级联选择- 多选

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 }}
      />
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值