el-cascader一级单选,二级多选或单选 思路备份(不可用)

      <el-form-item label="类型" prop="typeMap">
          <el-cascader
              v-model="selectedValues"
              :options="typeMapOptions"
              :props="typeMapProps"
              @expand-change="handleCascaderChange"
              @change="handleChange"
              filterable
          ></el-cascader>
      </el-form-item>

 /** 类型选项  1开展宣传情况、2开展活动情况、3政务接待保障情况、4提供场地情况、5综合窗口服务情况、6公共法律服务情况*/
   const types = ref([
     {label: '开展宣传情况', value: '1', multiple: false /*第二级为单选*/},
     {label: '开展活动情况', value: '2', multiple: false /*第二级为单选*/},
     {label: '政务接待保障情况', value: '3', multiple: true /*第二级为多选*/},
     {label: '提供场地情况', value: '4', multiple: false /*第二级为单选*/},
     {label: '综合窗口服务情况', value: '5', multiple: false /*第二级为单选*/},
     {label: '公共法律服务情况', value: '6', multiple: false /*第二级为单选*/},
   ]);
  const subTypes = ref([
    { label: '微信推文', value: '1_01' },
    { label: '视频', value: '1_02' },
    { label: '开展活动', value: '2_01' },
    { label: '政务接待', value: '3_01' },
    { label: '提供会务保障', value: '3_02' },
    { label: '免费场地', value: '4_01' },
    { label: '住院补助', value: '5_01' },
    { label: '参续保', value: '5_02' },
    { label: '电话及现场接访', value: '6_01' },
  ]);
  // 转换为指定结构的函数
  function transformToNewStructure(types, subTypes) {
    return types.map((type, index) => {
      return {
        id: index + 1,
        label: type.label,
        value: type.value,
        disabled: false,
        children: subTypes.filter(subType => subType.value.startsWith(type.value))
            .map(subType => ({
              id: subType.value.split('_')[1],
              label: subType.label,
              value: subType.value
            })),
        multiple: type.multiple
      };
    });
  }


  // 使用转换函数并打印结果
  const typeMapOptions = ref(transformToNewStructure(types.value, subTypes.value));

  const selectedValues = ref([]);
  const typeMapProps = ref({
    multiple: false,
    checkStrictly: false,
    expandTrigger: 'hover'
  /*  emitPath: false*/
  });

  const handleChange = (value, selectedData) => {
    // selectedValues.value = undefined;
    console.log('value', value);
    console.log('selectedData', selectedData);
  };

 // 展开二级进行触发
  const handleCascaderChange = (value) => {
    const isMultiple = types.value.find(item => item.value === value[0])?.multiple;
    selectedValues.value = []; // 重置选中值
    if (isMultiple) {
      typeMapProps.value.multiple = isMultiple;
    }else {
      typeMapProps.value.multiple = false;
    }
  };
// 将组件数据格式转换为后端存储格式
function convertComponentToBackendFormat(options, isMultiple) {
  if (isMultiple) {
    // 多选时,将 [[m, n], [m, p], ...] 转换为 { type: m, subType: "n,p,..."}
    const typeMap = new Map();
    options.forEach(([type, subType]) => {
      if (!typeMap.has(type)) {
        typeMap.set(type, []);
      }
      typeMap.get(type).push(subType);
    });
    const result = {};
    typeMap.forEach((subTypes, type) => {
      result.type = type;
      result.subType = subTypes.join(',');
    });
    return result;
  } else {
    // 单选时,将 [m, n] 转换为 { type: m, subType: n }
    return { type: options[0], subType: options[1] };
  }
}
// 示例用法
// 新增时,单选
let singleSelectBackend = convertComponentToBackendFormat([m, n], false);
console.log(singleSelectBackend); // 输出:{ type: m, subType: n }
// 新增时,多选
let multipleSelectBackend = convertComponentToBackendFormat([[m, n], [m, p]], true);
console.log(multipleSelectBackend); // 输出:{ type: m, subType: "n,p" }
// 将后端存储格式转换回组件数据格式
function convertBackendToComponentFormat(data, isMultiple) {
  if (isMultiple) {
    // 多选时,将 { type: m, subType: "n,p" } 转换为 [[m, n], [m, p]]
    const subTypes = data.subType.split(',').map(subType => [data.type, subType]);
    return subTypes;
  } else {
    // 单选时,将 { type: m, subType: n } 转换为 [m, n]
    return [data.type, data.subType];
  }
}
// 修改时,从后端查询数据渲染表单
let backendDataForSingle = { type: m, subType: n };
let frontendDataForSingle = convertBackendToComponentFormat(backendDataForSingle, false);
console.log(frontendDataForSingle); // 输出:[m, n]
let backendDataForMultiple = { type: m, subType: "n,p" };
let frontendDataForMultiple = convertBackendToComponentFormat(backendDataForMultiple, true);
console.log(frontendDataForMultiple); // 输出:[[m, n], [m, p]]
el-cascader是一个基于Element UI的下拉选择组件,它可以实现在层级结构中进行多级选择。如果你想要实现单选(即每次只能选中一级)、一级二级可以单选、三级或多级可以选择的情况,你需要按照以下步骤配置: 1. **单选模式**: 将`props`里的`value-key`设置为默认的`value`属性,同时禁用`props.multiple`,如`multiple={false}`。这样每次只允许用户选择一级节点。 2. **一级二级单选**: 如果你想让一级二级可以单独选择,一级设为单选(`multiple={true}`),但在`props.options`中处理二级节点的唯一选中。例如,在获取数据时限制每个一级选项下的二级选项只有一个选中状态。 3. **三级或多级多选**: 对于多级多选,保留`props.multiple = true`,用户可以直接在三级甚至更多级中选择多个。如果需要自定义多选规则,可以在`props.loadChildren`方法里控制节点的激活状态。 为了更具体地实现这个功能,你还需要配合Vue的计算属性或watch来管理选中的状态,并确保在用户交互时保持状态的一致性。下面是一个简单的示例代码片段: ```html <template> <el-cascader :options="options" value-key="id" v-model="selectedValue" @change="handleChange" multiple ></el-cascader> </template> <script> export default { data() { return { options: [], // 初始化的树形数据 selectedValue: [], // 当前选择的值数组 }; }, methods: { handleChange(value) { // 这里可以根据实际需求更新 selectedValue 和 options 的状态 this.selectedValue = value; } }, }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值