二级菜单的两种思路(完成部分)

第一种

html 复制代码
<el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
 <el-form-item label="类型" prop="type">
   <el-select v-model="form.type" placeholder="请选择类型" @change="handleTypeChange">
     <el-option
         v-for="dict in types"
         :key="dict.value"
         :label="dict.label"
         :value="dict.value"
     ></el-option>
   </el-select>
 </el-form-item>
 <el-form-item label="子类型" prop="subType" >
   <el-select v-model="form.subType" placeholder="请选择子类型">
     <el-option
         v-for="dict in filteredSubTypes"
         :key="dict.value"
         :label="dict.label"
         :value="dict.value"
     ></el-option>
   </el-select>
 </el-form-item>

@change="handleTypeChange"

types

filteredSubTypes

javascript 复制代码
const types = ref([
  { label: '开展宣传情况', value: '1' },
  { label: '开展活动情况', value: '2' },
  { label: '政务接待保障情况', value: '3' },
  { label: '提供场地情况', value: '4' },
  { label: '综合窗口服务情况', value: '5' },
  { label: '公共法律服务情况', value: '6' },
]);
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' },
]);

const filteredSubTypes = ref();

// 当选择一级时,归纳出对应的二级菜单
function handleTypeChange(val: string) {
  if (!val) {
    return [];
  }
  form.value.subType = undefined;
  filteredSubTypes.value = subTypes.value.filter(subType => subType.value.split('_')[0] === val);
}

// 回显专用
function initSubTypes(val: string) {
  filteredSubTypes.value = subTypes.value.filter(subType => subType.value.split('_')[0] === val);
}

```javascript
// 回显专用
if (isUpdate.value) {
   form.value = param.data;
   initSubTypes(form.value.type as string);
}

第二种 (级联)

仅展示数据清洗

javascript 复制代码
要将您提供的 `types` 和 `subTypes` 结构转换为指定的结构,我们需要执行以下步骤:
1. 初始化一个新数组,用于存放最终的结构。
2. 遍历 `types` 数组,为每个元素创建一个新的对象,该对象包含 `id`、`label`、`value` 和一个空的 `children` 数组。
3. 遍历 `subTypes` 数组,根据 `subType` 的 `value` 前缀将其添加到对应 `type` 的 `children` 数组中。
以下是转换过程的代码示例:
```javascript
const types = ref([
  { label: '开展宣传情况', value: '1' },
  { label: '开展活动情况', value: '2' },
  { label: '政务接待保障情况', value: '3' },
  { label: '提供场地情况', value: '4' },
  { label: '综合窗口服务情况', value: '5' },
  { label: '公共法律服务情况', value: '6' },
]);
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,
      children: subTypes.filter(subType => subType.value.startsWith(type.value))
        .map(subType => ({
          id: subType.value.split('_')[1],
          label: subType.label,
          value: subType.value
        }))
    };
  });
}
// 使用转换函数并打印结果
const newStructure = transformToNewStructure(types.value, subTypes.value);
console.log(newStructure);

执行上述代码后,将得到以下结构:

json 复制代码
[
  {
    "id": 1,
    "label": "开展宣传情况",
    "value": "1",
    "children": [
      { "id": "01", "label": "微信推文", "value": "1_01" },
      { "id": "02", "label": "视频", "value": "1_02" }
    ]
  },
  {
    "id": 2,
    "label": "开展活动情况",
    "value": "2",
    "children": [
      { "id": "01", "label": "开展活动", "value": "2_01" }
    ]
  },
  {
    "id": 3,
    "label": "政务接待保障情况",
    "value": "3",
    "children": [
      { "id": "01", "label": "政务接待", "value": "3_01" },
      { "id": "02", "label": "提供会务保障", "value": "3_02" }
    ]
  },
  {
    "id": 4,
    "label": "提供场地情况",
    "value": "4",
    "children": [
      { "id": "01", "label": "免费场地", "value": "4_01" }
    ]
  },
  {
    "id": 5,
    "label": "综合窗口服务情况",
    "value": "5",
    "children": [
      { "id": "01", "label": "住院补助", "value": "5_01" },
      { "id": "02", "label": "参续保", "value": "5_02" }
    ]
  },
  {
    "id": 6,
    "label": "公共法律服务情况",
    "value": "6",
    "children": [
      { "id": "01", "label": "电话及现场接访", "value": "6_01" }
    ]
  }
]

请注意,id 字段在子类型中是从 value 字段中提取的,并且假设它是数字。如果 id 需要是整数,则可能需要进行额外的转换。

相关推荐
xiaoye37081 小时前
Java 自动装箱 / 拆箱 原理详解
java·开发语言
YDS8293 小时前
黑马点评 —— 分布式锁详解加源码剖析
java·spring boot·redis·分布式
迷藏4943 小时前
**发散创新:基于 Rust的开源权限管理系统设计与实战**在现代软件架构中,**权限控制**早已不
java·开发语言·rust·开源
升鲜宝供应链及收银系统源代码服务3 小时前
《IntelliJ + Claude Code + Gemini + ChatGPT 实战配置手册升鲜宝》
java·前端·数据库·chatgpt·供应链系统·生鲜配送
daidaidaiyu3 小时前
Nacos实例一则及其源码环境搭建
java·spring
i建模3 小时前
将Edge浏览器的标签页从顶部水平排列**移至左侧垂直侧边栏
前端·edge
跟着珅聪学java3 小时前
js编写中文转unicode 教程
前端·javascript·数据库
小江的记录本3 小时前
【Redis】Redis全方位知识体系(附《Redis常用命令速查表(完整版)》)
java·数据库·redis·后端·python·spring·缓存
英俊潇洒美少年4 小时前
Vue3 深入响应式系统
前端·javascript·vue.js
摇滚侠4 小时前
Java 项目《谷粒商城-1》架构师级Java 项目实战,对标阿里 P6-P7,全网最强,实操版本
java·开发语言