vue+element ui实现select选择器复杂数据的备选项分组展示

1,874 阅读1分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

一、功能依赖

  • vue
  • element ui

二、功能需求

已知一个数组【base_data】如下所示:

    base_data: [
        {
          'label': '上装',
          'children': [{ 'label': '短袖' }, { 'label': '衬衣' }, { 'label': '外套' }]
        },
        {
          'label': '下装',
          'children': [{ 'label': '短裤' }, { 'label': '长裤' }, { 'label': '短裙' }]
        },
        {
          'label': '配饰',
          'children': [{ 'label': '手表' }, { 'label': '项链' }, { 'label': '包包' }]
        }
      ]

我们的需求是想要将其分组渲染到一个下拉框中,具体效果如图所示:

三、实现方式

要想实现以上效果,我们可以通过 element ui 中 Select 组件的分组展示功能来实现。其主要使用 el-option-group 对备选项进行分组,它的 label 属性为分组名,具体可参考 element ui 官网。在这里我们只需要将 【base_data 】重组成该组件所需的数据格式,再在页面上进行渲染即可。具体实现代码如下:

<template>
  <div class="app-container">
    <el-select
      v-model="checkedTargetList"
      multiple
      :multiple-limit="2"
      filterable
      style="width:50%"
      @change="checkedTargetChange"
    >
      <el-option-group
        v-for="group in targetList"
        :key="group.label"
        :label="group.label"
      >
        <el-option
          v-for="(item,index) in group.option"
          :key="index"
          :label="item"
          :value="item"
        />
      </el-option-group>
    </el-select>
  </div>
</template>

<script>
export default {
  data() {
    return {
      // 源数据
      base_data: [
        {
          'label': '上装',
          'children': [{ 'label': '短袖' }, { 'label': '衬衣' }, { 'label': '外套' }]
        },
        {
          'label': '下装',
          'children': [{ 'label': '短裤' }, { 'label': '长裤' }, { 'label': '短裙' }]
        },
        {
          'label': '配饰',
          'children': [{ 'label': '手表' }, { 'label': '项链' }, { 'label': '包包' }]
        }
      ],
      checkedTargetList: [], // 被选中的备选项
      targetList: []// select组件渲染所需的数据
    }
  },
  created() {
    // base_data 重组成 select 组件所需的格式
    for (var index in this.base_data) {
      this.targetList.push({
        'label': this.base_data[index]['label'],
        'option': []//重点
      })
      this.base_data[index]['children'].forEach(item => {
        this.targetList[index].option.push(item.label)
      })
    }
  },
  methods: {
    checkedTargetChange(val) {
      console.log(val)
      console.log(this.checkedTargetList)
    }
  }
}
</script>

四、总结

该功能的实现并不难,难的是对【base_data 】数据的处理,不熟悉的人可能就卡在这了。记录一下笔记!!!!