关于ElementPlus的TreeSelect全部选项飘蓝无法正常使用的问题

489 阅读2分钟

问题描述

出现情况如下图,全部飘蓝色这个归属部门框,并且不能正常使用的TreeSelect,v-model绑定的值拿不到,笔者踩了一上午的坑特此记录一下,给后人一个经验

笔者也是考虑了:riophae/vue-treeselect,这个确实是好用,比ElementPlusTreeSelect好用,但是人家是vue2的,我们这里引入会报错,所以另外找方案,就耐下心来好好研究了一下这个ElementPlusTreeSelect

技术栈

技术栈基于:vue3.0 + ts + ElementPlus image.png

归属部门框源代码

<el-col :span="12">
    <el-form-item
      label="归属部门"
      prop="deptId"
    >
      <el-tree-select
        v-model="formData.deptId"
        placeholder="请选择所属部门"
        :data="deptOptions"
        :show-count="true"
      />
    </el-form-item>
</el-col>

这是为什么呢,原来是我的formData.deptId匹配不到deptOptions里面的值,所以全部亮蓝色,那么我直接告诉formData.deptIdnull这个初始问题得到了解决

formData: {
    status: "0",
    deptId: null
} as UserFormData,

image.png 但是当我选择一个部门的时候它又出现了飘蓝的问题

image.png 仔细研究发现,官网给的data属性是这样的,ElementPlus的TreeSelect

const data = [{
    value: '1',
    label: 'Level one 1',
    children: [
      {
        value: '1-1',
        label: 'Level two 1-1',
        children: [
          {
            value: '1-1-1',
            label: 'Level three 1-1-1',
          },
        ],
      },
    ]
}]

而后端返回给我的树结构是这样的

[
  {
    "id": 100,
    "label": "若依科技",
    "children": [
      {
        "id": 101,
        "label": "深圳总公司",
        "children": [
          {
            "id": 103,
            "label": "研发部门"
          }
    ]
  }
]

终于发现原来是官网需要的value属性,我这里是id属性,所以这是飘蓝也是v-model拿不到值得原因,那么写一个递归函数来改变一下

interface DeptOptions {
  value:number;
  label:string;
  children?:DeptOptions[];
}
// 加工部门树结构将id换成value属性的值
function factoryDeptOptions(arr: any): DeptOptions[] {
  let newArr: DeptOptions[] = []
  if (Array.isArray(arr)) {
    arr.forEach((item) => {
      let obj: DeptOptions = {
        value: 0,
        label: ''
      }
      obj.value = item.id
      obj.label = item.label
      if (item.children && Array.isArray(item.children)) {
        obj.children = factoryDeptOptions(item.children)
      }
      newArr.push(obj)
    })
  }
  return newArr
}

调用一下上面的方法,然后形成新的结构,给el-tree-selectdata属性,好了到此解决问题

state.newDeptOptions = factoryDeptOptions(response.data)
<el-col :span="12">
    <el-form-item
      label="归属部门"
      prop="deptId"
    >
      <el-tree-select
        v-model="formData.deptId"
        placeholder="请选择所属部门"
        :data="newDeptOptions"
        :show-count="true"
      />
    </el-form-item>
</el-col>

image.png

虽然不是特别好用,但是能满足现在的需求。。