Saul's blog Saul's blog
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)

Saul.J.Wu

立身之本,不在高低。
首页
后端
分布式
前端
更多
分类
标签
归档
友情链接
关于
GitHub (opens new window)
  • React

  • Vue

    • Element-UI 级联选择框回显问题
      • 前言
      • 思路
      • TODO
    • Element-UI中El-Select的坑
    • Element UI中Switch 开关的小坑,如何使用0和1或其他?
    • Vue,计算属性VS监听属性,到底用哪个?
    • vue项目搭建过程
  • 前端
  • Vue
SaulJWu
2020-08-11

Element-UI 级联选择框回显问题

# 前言

在ElementUI中,级联选择框的v-model是一个数组,存的是id数组

但是我服务器存的是数组的最后一个id,那么如何才能回显?

data() {
    return {
      // 分类的树结构数据列表
      cateList: [],
      // 已选择分类ID数组
      selectCateKeys: []
    }
  }
1
2
3
4
5
6
7
8

如下代码

<el-cascader
    v-model="selectCateKeys"
    :options="cateList"
    ref="cateListRef"
    width="auto"
    :show-all-levels="showAllLevels"
    filterable
    :props="{
      expandTrigger: 'hover',
      value: 'id',
      label: 'name',
      children: 'children'
    }"
    clearable
    @change="selectCateChange"
  >
  </el-cascader>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# 思路

服务器返回一个id,我从树结构数据中,把他的父级id都查出来

/**
     * 设置选定值
     */
    setSelectCateKeys(id) {
      this.selectCateKeys.splice(0)
      let keys = this.find(this.cateList, id)
      this.selectCateKeys = keys
    },
    /**
     * 递归,通过子级Id向上找到所有的父级id
     */
    find(array, id) {
      let stack = []
      let going = true
      let walker = (array, id) => {
        array.forEach(item => {
          if (!going) return
          stack.push(item['id'])
          if (item['id'] === id) {
            going = false
          } else if (item['children']) {
            walker(item['children'], id)
          } else {
            stack.pop()
          }
        })
        if (going) stack.pop()
      }
      walker(array, id)
      return stack
    },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

很明显,我现在找到了id数组,数据已经是正确了,但是问题又来了,Element-UI中,根本不会回显文本name,我点击己联选择框进去,发现已经选择了,就是文本没有回显,所以我再定义多一个方法

/**
     * 设置选定值
     */
    setSelectCateKeys(id) {
      this.selectCateKeys.splice(0)
      let keys = this.find(this.cateList, id)
      this.selectCateKeys = keys
      let name = this.findName(this.cateList, id).join(' / ')
      this.$refs.cateListRef.inputValue = name
    },
    /**
     * 递归,通过id查找名字
     */
    findName(array, id) {
      let name = []
      let going = true
      let walker = (array, id) => {
        array.forEach(item => {
          if (!going) return
          name.push(item['name'])
          if (item['id'] === id) {
            going = false
          } else if (item['children']) {
            walker(item['children'], id)
          } else {
            name.pop()
          }
        })
        if (going) name.pop()
      }
      walker(array, id)
      return name
    },
    /**
     * 递归,通过子级Id向上找到所有的父级id
     */
    find(array, id) {
      let stack = []
      let going = true
      let walker = (array, id) => {
        array.forEach(item => {
          if (!going) return
          stack.push(item['id'])
          if (item['id'] === id) {
            going = false
          } else if (item['children']) {
            walker(item['children'], id)
          } else {
            stack.pop()
          }
        })
        if (going) stack.pop()
      }
      walker(array, id)
      return stack.join
    },
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56

image-20200813225505305

这里商品分类手机数码 / 手机通讯 / 5G手机是从前台获取的,后台就存了对象的id

暂时就这样做到了文本显示,虽然有些粗暴,但是将就着先,

# TODO

还是有一个小bug,当我点击商品分类时,如果我不选择,文本全部消失了,这个挖坑吧,而且验证也能通过,说明数据已经是对的,但是就是文本的问题,一般来说,影响不大,将来再解决。

帮我改善此页面 (opens new window)
#vue#Element-UI
上次更新: 2021/02/16, 12:29:08
React状态管理-hox
Element-UI中El-Select的坑

← React状态管理-hox Element-UI中El-Select的坑→

最近更新
01
zabbix学习笔记二
02-28
02
zabbix学习笔记一
02-10
03
Linux访问不了github
12-08
更多文章>
Theme by Vdoing | Copyright © 2020-2022 Saul.J.Wu | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式