后台项目 Express-Mysql-Vue3-TS-Pinia 上级菜单的选择

88 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第12天,点击查看活动详情

上级菜单的选择

引言

通过之前一段时间 ExpressMysql 的学习

这里尝试来搭建一个 后台系统 来巩固下学习的技术。

菜单页面

上面几节中,将 顶级菜单菜单管理 页面搭建已经完毕。

但是其中 菜单 页面 及 功能 并没有进行完善

这里先将 菜单 的页面进行截图,重点是在,选择 上级菜单 的逻辑上面

image.png

选择上级菜单

能够产生 上级菜单 的前提就是:

  • 只有不是 顶级菜单 的情况下,才会产生该表单项

  • 而且在 菜单 页面,只能选择,顶级菜单

  • 按钮 页面,只能选择,菜单

而且 el-tree-select 这个组件,还需要我们自定义 props

以及 在我们 切换 选项的时候,需要动态的改变我们的菜单值

  <el-row style="margin-bottom: 30px">
    <el-col :span="24">
      <el-radio-group v-model="ruleForm.type" label="菜单类型" @change="changeRadio">
        <el-radio-button v-for="(item, index) in state.typeName" :key="index" :label="index">{{ item }}</el-radio-button>
      </el-radio-group>
    </el-col>
  </el-row>
      
  <el-row v-if="ruleForm.type !== 0">
    <el-col :span="24">
      <el-form-item label="上级菜单" prop="pid">
        <el-tree-select v-model="ruleForm.pid" :data="state.menusData" check-strictly :render-after-expand="false" show-checkbox check-on-click-node :props="state.propsData" />
      </el-form-item>
    </el-col>
  </el-row>
import { cloneDeep } from 'lodash-es'
  
const state = reactive({
  typeName: ['顶级菜单', '菜单', '按钮'],
  menusData: [] as any,
  propsData: {
    label: 'name',
    children: 'children'
  }
})

const ruleForm = reactive({
  name: '',
  type: 0,
  icon: '',
  url: '',
  sort: 0,
  pid: null as any
})

const changeRadio = () => {
  watchType()
}

const watchType = () => {
  state.menusData = cloneDeep(props.menus)

  if (ruleForm.type === 1) {
    state.menusData.forEach((item: any) => {
      item.children.forEach((item2) => {
        item2.disabled = true
      })
    })
  }

  if (ruleForm.type === 2) {
    state.menusData.forEach((item: any) => {
      item.disabled = true
    })
  }
}

在我们获取所有 菜单 列表时,我们的数据结构是一个列表的形式

image.png

它并不符合我们的 树形选择器 结构,我们需要进行改造

  menus.forEach((item: any) => {
    item.value = item.id
    item.disabled = false

    switch (item.type) {
      case 0:
        item.children = []
        state.tableData.push(item)
        break
      case 1:
        item.children = []
        state.tableData.forEach((item2) => {
          if (item2.id === item.pid) {
            item2.children.push(item)
          }
        })
        break
      case 2:
        break
    }
  })

改造成如下的数据结构

image.png

至此我们就可以进行 上级菜单 的选择了

image.png

总结

通过 Express-Mysql-Vue3-TS-Pinia 做出一个 后台系统 项目

至此,我们 菜单管理 下的 上级菜单的选择 功能,处理完毕