首页 > 其他分享 >antd Cascader实现多选功能

antd Cascader实现多选功能

时间:2022-11-21 14:37:14浏览次数:48  
标签:const 多选 value label vv Cascader antd selectedRelation selectedValue

antd中的组件cascader用于联级选择,但是只支持单选,在项目过程中经常会遇到多选的情况。这边将多选情况进行总结,以及附上实现代码。

antd实现的单选功能如下:https://3x.ant.design/components/cascader-cn/

 

 

多选一般有两种情况:

1. 支持所有二级的多选

 

 2.支持任意多级的多选

 

 

代码实现如下:

1.支持所有二级的多选

【一级/二级, 一级/二级,..........】

配置内容:

      {
        type: 'levelTwoCascaders',
        label: '转诊原因',
        key: 'referralReason',
        defaultValue: [],
        selectedValue: selectedValue, // 选中的值【value1, value2】
        selectedRelation: selectedRelation, // 选择值的值和文本对应关系 【[value1,text1], [value2, text2]】
        changeHandle: this.changeHandle,
        deleteChangeHandle: this.deleteChangeHandle,
        options: options
       }

对于levelTwoCascaders的实现:

  // 联级选择(二级选择的多选)
  levelTwoCascaders: value => {
    const { changeHandle, options, selectedValue, selectedRelation, deleteChangeHandle } = value
    return (
      <div>
        <Cascader
          allowClear={false}
          options={options}
          value={selectedValue}
          onChange={(itemValue, itemInitial) => {
            // 没有该值时,进行加入
            // itemValue -> [一级value, 二级value], itemInitial -> [{label: 一级label, value: 一级value, children: []}, {label: 二级label, value: 二级value}]
            if (!(selectedValue.includes(itemValue[1]))) {
              // 展示的值为一级/二级的格式
              const showValue = itemValue.reduce(
                (previousValue, currentValue, currentIndex) => currentIndex ? previousValue + '/' + itemInitial[currentIndex]['label']
                 : previousValue + itemInitial[currentIndex]['label'],
                ''
              )
              changeHandle(itemValue[1], showValue)
            }
          }}
        >
          <div style={{
              // 设置最大高度,当内容过多时进行滚动显示
              maxHeight: '60px',
              height: selectedValue.length === 0 && '30px',
              overflow: 'auto',
              border: '1px solid #d9d9d9',
              borderRadius: '4px'
            }}> {(selectedRelation || []).map((item, index) => {
              return (
                <Tag
                closable
                key={item[0]}
                onClose={(e) => {
                  // 删除对应索引元素
                  deleteChangeHandle(index)
                }}
                >
                  {item[1]}
                </Tag>
              )
            })}</div>
        </Cascader>
      </div>
    )
  },

对于changeHandle, deleteChangeHandle的实现

   changeHandle = (value, text) => {
   // 选中元素
    const handleArray = [value, text]
    const { selectedValue, selectedRelation } = this.state
    selectedValue.push(value)
    selectedRelation.push(handleArray)
    this.setState({
      selectedValue,
      selectedRelation
    })
   }
   deleteChangeHandle = (index) => {
    // 删除元素
    const { selectedValue, selectedRelation } = this.state
    selectedValue.splice(index, 1)
    selectedRelation.splice(index, 1)
    this.setState({
      selectedValue,
      selectedRelation
    })
   }

 

 

2.支持任意级数的多选

【一级, 一级, 一级/二级, 一级/二级/三级,一级/二级,...........】

内容配置如下:

      {
         type: 'multipleCascaders',
         key: 'areaidList',
         label: '区域名称',
         onchangeValue: this.changeValue,
         onchangevalueCode: this.changeCode,
         className: 'cascaderMaxHeight',
         nowvalue: this.state.areaValue,
         valueLabel: this.state.valueCode,
         loadData: this.loadCascadeData, // 选择框的内容为动态加载
         changeOnSelect: true,
         options: addressList
       },

multipleCascaders的实现如下:

  // 下面引用的方法引入于lodash-es   import { get, reduce, includes, filter } from 'lodash-es'

multipleCascaders: value => { const { loadData, onchangeValue, onchangevalueCode, changeOnSelect, options = [], nowvalue = [] } = value // 根据数据拿到code的组合 const connectCode = (arr = []) => reduce(arr, (ss, vv) => (!ss ? vv.value : `${ss}-${vv.value}`), '') // 根据数据得到label的组合 const connectLabel = (arr = []) => reduce(arr, (ss, vv) => (!ss ? vv.label : `${ss}-${vv.label}`), '') const allCode = reduce(nowvalue, (ss, vv) => [...ss, get(vv, [vv.length - 1, 'curCode'])], []) return ( <div> <Cascader allowClear={false} options={options} value={nowvalue} loadData={loadData} changeOnSelect={changeOnSelect} onChange={(v, l) => { const curCode = connectCode(l) // 将code记录一下 const curLabel = connectLabel(l) l[l.length - 1].curCode = curCode l[l.length - 1].curLabel = curLabel // 已有的,不允许再选 // 如果当前curCode含有nowvalue的值,则需要进行删除掉多余数据 if (!includes(allCode || [], curCode)) { allCode.map((item, index) => { if (curCode.includes(item)) { allCode.splice(index, 1) nowvalue.splice(index, 1) } }) onchangeValue([...nowvalue, l]) onchangevalueCode([...allCode, curCode]) } }} > <div style={{ maxHeight: '60px', height: nowvalue.length === 0 && '30px', overflow: 'auto', border: '1px solid #d9d9d9', borderRadius: '4px' }} > {(nowvalue || []).map((v, i) => { return ( <Tag closable key={get(v, [v.length - 1, 'curCode'])} onClose={() => { onchangeValue(filter(nowvalue, (vv, ii) => ii !== i)) onchangevalueCode(filter(allCode, (vv, ii) => ii !== i)) }} > {get(v, [v.length - 1, 'curLabel'])} </Tag> ) })}{' '} </div> </Cascader> </div> ) },

其中nowvalue是选中数据的具体数据,

 

 allcode表示具体选中数据的code表示

 ['110000-110100', '110000', '120000-120100-120101', '120000-120100-120102']

具体实现思路也是: 将选中的内容需要保存的内容进行保存,需要注意的是 已经选过的内容不可再次选择,选中二级后需要将一级内容删除

完结:总之,具体思路都是将自己需要的内容进行保存,将后端需要的格式进行处理,然后保证正常的显示就可。

 

标签:const,多选,value,label,vv,Cascader,antd,selectedRelation,selectedValue
From: https://www.cnblogs.com/best-mll/p/16911297.html

相关文章

  • antd TextArea placeholder文案换行的几种方式
    constApp=()=>{constvalue=`例子:\n今天天气不错`;constvalue1=`例子:\r今天天气不错`;return(<><TextAreaplaceholder="例子:&#......
  • el-cascader回显始终显示第一级的数据
    这个功能用了好多次,第一次遇到这么个问题,当有五级数据的,都能正常回显,多了一级后就没法正常回显了,  后来发现每一项的最后一层数据有重复数据,我当时也是抱着试试的心......
  • Antd之表单label超出宽度增加省略号
    需求:Antd之表单label超出宽度增加省略号代码结构如下:使用.ant-form-item-label{text-overflow:ellipsis;}无效,原因是label的display:inline-flex值使其无效。......
  • react-router-dom v6+antd+react18配置
    官网地址:react-router1.安装的版本,antd版本4.24.12.项目目录结构3.入口文件index.js配置,react18版本发生了一些变化,改为以下写法importReactfrom'react';import......
  • Android实战简易教程-第四十七枪(ListView多选-实现点餐系统)
    一般在外卖的选单中常常会用到ListView的多选,大家可以改进后加入自己的项目中。下面看一下代码:一、代码1.main.xml:(由一个ListView和一个Button组成)<?xmlversion="1.0"enc......
  • antd table 树形数据动态加载
    antd的table组件支持树形结构的数据,不过前提是需要将整棵树的数据一次性全部返回,对于数据量比较大的情况下,可能会需要动态加载数据。exportdefaultfunctionDynamicT......
  • Antd Tree树形控件 自定义插槽
    使用titleRender属性自定义节点渲染函数,不需要处理树型数据,达到比如右侧新增按钮的需求(如图三)<Tree ... titleRender={(nodeData)=>{return(......
  • antdv (Ant Design of Vue) 复杂表单验证问题解决方法
    我们知道,在简单的表单中,都是一项一项往下排列的,验证的时候也按照字段一一对把规则写好就能验证,如下图  但是遇到了复杂场景的表单验证,比如一项由多个input、checkbox......
  • AntDB数据库与DSG强强联手,助力通信行业核心系统国产化
    日前,湖南亚信安慧科技有限公司(简称:亚信安慧科技)与迪思杰(北京)数据管理技术有限公司开展了产品兼容互认工作。图1:AntDB数据库与DSGSuperSyncV3.2兼容互认证明近年来,国家大......
  • 表单笔记-Antd(Form)
    antd表单使用笔记import{Form}from'antd'exportdefaultconstApp=()=>{constform=Form.useForm();//提交表单constonFinish=(val)=>{//val......