首页 > 其他分享 >vue3 el-cascader 实现 一级单选 ,二级多选,只能选择三个

vue3 el-cascader 实现 一级单选 ,二级多选,只能选择三个

时间:2023-01-31 16:03:03浏览次数:49  
标签:el code const item 单选 vue3 return data

实现效果如下
image

思路是
1.选择一个时,取出一级选中值code,首先把一级中code不是选中code的置灰,实现一级单选
2.当选择二级时,选中数组长度大于等于三,则把当前二级数据(不是选中的)置灰,其他不置灰

代码如下

<template>
  <div class="productCategory">
    <el-cascader
      v-model="selectedList"
      :options="options"
      :props="props"
      collapse-tags
      collapse-tags-tooltip
      clearable
      @change="change"
      :teleported="false"
    />
  </div>
</template>
<script lang="ts" setup>
import type { CascaderProps } from "element-plus";
import { onMounted, ref } from "vue";
import { categoryQueryAPI } from "@/api/material";
import { splitArray } from "@/utils/index";
import { isEmpty } from "@/utils/types";
//选中值 二维数组
const selectedList = ref([]);
//数据源
const options = ref([]);
//配置
const props: CascaderProps = {
  multiple: true,
  value: "code",
  label: "title",
  children: "subList",
  leaf: "leaf"
};

onMounted(() => {
  getCategoryAllList();
});

//这里是后端返回的树形结果是三级,我根据实际业务去掉了最后一级
const removeTreeDataWithLevel = (data, limited = 1) =>
  data.map(({ subList, ...rest }) => ({
    ...rest,
    ...(limited === 2
      ? {}
      : { subList: removeTreeDataWithLevel(subList, limited + 1) })
  }));

const change = (val: any) => {
  const newList = val.flat(Infinity);
  const selectedList = splitArray(newList, 2);
  const selectedLeve0Index = newList.length > 0 ? newList[0] : "";
  setDisabled(selectedLeve0Index, selectedList);
};

const setDisabled = (selectedLeve0Index: string, selectedList: any) => {
  let leve2 = selectedList.map((item: any) => {
    return item[1];
  });
  options.value.forEach((item) => {
    item.disabled = false;
    if (!isEmpty(selectedLeve0Index)) {
      if (item.code !== selectedLeve0Index) {
        item.disabled = true;
      }
      if (item.code == selectedLeve0Index) {
        item.subList.forEach((sitem) => {
          sitem.disabled =
            selectedList.length >= 3 && !leve2.includes(sitem.code)
              ? true
              : false;
        });
      }
    }
  });
};

const getCategoryAllList = async () => {
  const res = await categoryQueryAPI({ module: 1 });
  if (res) {
    options.value = removeTreeDataWithLevel(res.data);
  }
};
</script>
<style lang="less">
.productCategory {
  .el-cascader-panel {
    .el-scrollbar:first-child {
      .el-checkbox {
        display: none;
      }
    }
  }
}

.productCategory {
  .el-cascader {
    width: 100% !important;
  }
}
</style>

辅助代码如下

/**
 * 数组的数据格式转换拆分-----一维转二维
 * @param {Object} arr 源数组
 * @param {Object} len 二维中一维的长度
 */
export function  splitArray(arr, len) {
  let arrLen = arr.length;
  let result = [];
  for (let i = 0; i < arrLen; i += len) {
    result.push(arr.slice(i, i + len));
  }
  return result;
}

/**
 * 数据非空验证
 * @desc 验证数据是否为 null undefined [] {} ''
 * @param data
 * @return {boolean}
 */
export function isEmpty(data) {
  if (data === null) return true
  if (data === undefined) return true
  if (Object.prototype.toString.call(data) === '[object Array]') return data.length === 0
  if (Object.prototype.toString.call(data) === '[object Object]') return Object.keys(data).length === 0
  if (typeof data === 'string') return data.trim() === ''
  return false
}

标签:el,code,const,item,单选,vue3,return,data
From: https://www.cnblogs.com/sweetpitaya/p/17079408.html

相关文章

  • 上传文件报错:The field files exceeds its maximum permitted size of 1048576 bytes
    SpringBootconfiguresSpringMVCwithamaximumfileof1Mbperfileandamaximumof10Mboffiledatainasinglerequest文件上传有默认最大限制,即最大可支持......
  • ElasticSearch概念与架构原理
    一、概述ElasticSearch简介简介ES是建立在Lucene基础之上的分布式准实时搜索引擎,它所提供的诸多功能中有一大优点,就是实时性好。比如:在业务需求中,新增数据需要1min才......
  • Elasticsearch基础操作
    一、索引操作创建索引创建索引时根据需求对索引设置主分片和副分片的数量,请求类型为:put,示例代码如下:PUT/${index_name}{"settings":{.........
  • .Net6 使用 Ocelot + Consul 看这篇就够了
    前言卯兔敲门,新的一年,祝大家前‘兔’似锦!希望大家假后还能找到公司的大门O(∩_∩)O!书接上文,我们使用了Consul实现了服务注册与发现,对Consul不熟悉的同学可以先看看。......
  • Shell脚本案例
    检查脚本 修复脚本#!/bin/bashCount_passmin=`cat/etc/profile|grep-n^PASS_MIN_DAYS|awk-F[:]'{print$1}'`if["$Count_passmin"];then Num_passmin=1......
  • element ui 穿梭框宽度调整
    <!--首先穿梭框设置ref用于引用--><el-transferref="grant_transfer"v-model="grant.value":data="grant.data"></el-transfer><script>//....../*穿梭框赋......
  • shell基础代码_ sed 内容替换
    sed(StreamEDitorsed)[options]'command'file(s)【sed [选项]  '操作'  参数】sed有关内容替换的命令介绍:options(选项)-ecommand,--expression=command......
  • 导入ElasticSearch官方测试数据
    学习ES的过程中,苦于测试数据不全,手动插入数据速度太慢,后来发现ES官方提供了一些测试数据可以直接导入到自建的ES,但是由于官方文档的没有更新,导入过程中会报错,具体原因是E......
  • Jenkins pipeline 使用agent docker编译构建
    Jenkins使用agentdocker构建pipeline此处用于记录,使用jenkinspipeline构建时,使用docker启动一个agent来构建编译环境。//需要在jenkins的Credentials设置中配置......
  • 在elasticsearch中简单的使用script_fields
    目录1、背景2、准备数据2.1mapping2.2插入数据3、案例3.1格式化性别1-男2-女-1-未知如果不存在sex字段,则显示--其余的显示**3.1.1dsl3.1.2java代码3.1.3运行结......