el-cascader(联机选择器)动态加载+编辑默认值回显

el-cascader(联机选择器)动态加载+编辑默认值回显

最近又在工作中遇到了一个问题,就是在我们使用el-cascader加载默认值的时候,如果我们无法拿到全部的options数据,cascader的输入框和联级选择框都会遇到回显问题(只能显示第一层的数据),这个时候我们要怎么做呢,首先我们来看一下我们想要的效果

效果展示

先来看一下效果(由于我不太会用截屏动图工具 所以分成2张):
在这里插入图片描述
输入框中的回显数据
在这里插入图片描述
联级选择框中的已选数据

解决思路

其实cascader归根结底也就是那么几个属性的事,我们首先来看一下文档,这里列出了一些我们要用到的:

参数说明
value / v-model选中项绑定值
options可选项数据源,键名可通过 Props 属性配置
lazy是否动态加载子节点,需与 lazyLoad 方法结合使用
lazyload加载动态数据的方法,仅在 lazy 为 true 时有效

那么首先我们来分析一下问题,问题的原因是因为我们的接口无法提供给我们完全的树形结构options数据,导致即使我们将获取到的已选数据传给v-model也加载不出来,所以我们要做的就是以下几步:

1.获取预选值

需要注意的是,我们这里获取的预选值最好是我们通过el-cascader提交时的数组数据,即每一个数据都是带有选择路径的数组,例如图中的PMO,获取的数据最好是[‘58集团’,‘技术功能平台群’,‘研发管理部’,‘PMO’],如果做不到这样的形式,那我们无论如何也要从其他接口获取到之前的路径项(不然我们就只能从最基础部分遍历获取全部的树形结构了),而后我们需要将取得的集合合并为一个路径群数组,如果和我是一样的多选联机选择框,最好在获取预选值的时候就是用promise

const queue = res.result.map(item => {
	return new Promise(resolve => {
		that.$axios.get('获取预选值接口').then(data => {
			resolve(data.单一路径数组)
		})
	})
})
Promise.all(queue).then(result => {
	result.forEach(i => {
		that.路径群数组.push(i)
	})
})
2.根据预选值制作直线结构数据的数组对象

在我们拿到了想要的数据之后,我们需要将预选值规整为一个数组,并进行去重操作

路径数组 = Array.from(new Set(that.路径群数组.flat()))

这样我们就得到了一个包含路径中所有项的数组,注意:如果是多选型的cascader,那么在这个数组里就会有同级若干项数据,我们不用在意,遍历数组并调用获取下层数据的接口获得下层数据res,并拼接成数组对象,这里要活用Promise,最后我们要的数据形式是(注意这里的pid是指每个数组上一层的父级id)

result = [{id: value1, Name: label1, children:res1 , pid: pid1},
 {id: value2, Name: label2, children:res2 , pid: pid2},
 {id: value3, Name: label3, children:res3 , pid: pid3}]
3.将直线结构的数组对象转换为树形结构

之后再将我们得到的数组对象转化成树形结构,网上有很多方法,这里我随便贴一个:

var data = []
this.toTree(result, data, 0)

toTree (list, data, fatherId) {
  list.forEach(item => {
    if (item.pid === fatherId) {
      var child = {
        orgName: item.orgName,
        id: item.id,
        children: []
      }
      this.toTree(list, child.children, item.id)
      data.push(child)
    }
  })
},

这样一来我们就制作了一个包含预选项及其各个父级的树形结构

4.将树形结构赋值给options

将树形结构赋值给options,这样他就可以在最开始的文本框中加载出预选项,并且不影响其他选项动态加载的处理

Options = data
5.总结

最后要声明一下,完成这样效果的方法不止这一种,这是在我走了很多弯路之后做出来的,属于笨办法之一吧;
网上还有大佬说虚拟一个el-cascader的输入框,将预选值放进去,点击的时候再进行动态加载,这也是一种不错的方法;
总之我个人感觉表达的不是很清晰,不过真的尽力了,大家如果有建议或者问题请给我留言,谢谢观看

el-cascader 级联选择器Element UI中用于实现级联下拉选择的一种组件。它能够处理多个层级的选项,并且能够通过简单的配置来实现数据的。在实际开发中,通常需要根据后端返的数据来显示已经选择的值,或者在表单编辑显示当前已有的数据。 要实现编辑时的数据,你需要做的是将后端返的数据格式化为级联选择器需要的数据结构。el-cascader 组件通常接受一个数组形式的 `options` 作为其选项数据,并且可以通过 `props` 属性定义值(value)、标签(label)和子级(children)字段。 以下是一个基本的数据流程示例: 1. 后端返数据格式可能如下: ```javascript [ { "value": "beijing", "label": "北京", "children": [ { "value": "chaoyang", "label": "朝阳区", "children": [ { "value": "datunlu", "label": "大屯路" } ] } ] } ] ``` 2. 你需要在前端处理这个数据结构,使其适用于el-cascader的`options`属性。 3. 将处理后的数据赋值给`el-cascader`的`v-model`,即可实现数据的。 ```html <el-cascader v-model="selectedOptions" :options="dataOptions" @change="handleChange"> </el-cascader> ``` ```javascript export default { data() { return { selectedOptions: [], // 用户选中的值 dataOptions: [] // 级联选择器的选项数据 }; }, methods: { // 处理后端返的数据,并赋值给dataOptions handleResponse(response) { // 将返的数据处理为el-cascader需要的格式 this.dataOptions = response; }, handleChange(value) { // 处理选项变更事件 } }, mounted() { // 假设fetchData是一个获取数据的函数 this.handleResponse(fetchData()); } }; ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值