element-ui Cascader级联选择框 回显问题

element的Cascader,好用是好用。但是,对于后台接口只保存了选中那一项的数据来说,回显来说是个问题。

问题

  1. 级联框回显

解決

  1. 解决回显问题,首先要了解回显的要求, 在这里插入图片描述
    api并没有对value格式有要求,但是我一般用数组盛放,所以我的格式是:[1,2,3,4],这种,选择完成后是每一级选择的value,但是要保存的不一定是全部,可能只是数组最后一位,比如省市级这种,可能最后只要市级就足够。所以接口返回的就只有市级id。我的思路是,将省市级再次传进去,通过id来找到对应的市级,然后反向遍历出他的从属关系:
// 寻找从属关系公共方法
export function regroupCascaderData(
  id, //要寻找的唯一值
  data, // 列表总数据
  key = 'label', //列表总数据 的key
  val = 'value', //列表总数据 的value
  list = 'children' //列表总数据 下属关系的key
) {
  let _allObj = {}
  const _allArr = []
  const setData = function(data) {
    let Obj
    for (const item of data) {
      Obj = {
        [key]: item[key],
        [val]: item[val]
      }
      if (item[val] == id) {
        Obj['isOk'] = true //如果条件符合,接下来就不会再判断
        return Obj
      } else if (item[list] && item[list].length) {
        Obj[list] = setData(item[list])
        if (Obj[list] && Obj[list]['isOk']) {
          Obj['isOk'] = true
          return Obj
        }
      } else {
        Obj = null
      }
    }
    return Obj
  }
  const getObjData = function(data) {
	// 递归向数组中填充数据 
    _allArr.push(data[val])
    if (data[list]) {
      getObjData(data[list])
    }
  }
  _allObj = setData(data)
  getObjData(_allObj)
  return {
    Obj: _allObj,
    arr: _allArr
  }
}

·调用:

data(){
	this.form = {
		floor_id:1
	}
	this.areaList:[]
}
	
	const arr = regroupCascaderData(
        'floor_' + this.form.floor_id,
        this.areaList,
        'name',
        'eid',
        'list'
      )
      this.floor = arr['arr'] //this.floor就是级联框绑定的数组了 

注意,寻找所属关系时,必须要有唯一id,不然会等级乱掉。或者可以通过遍历,手工为数据生成一条唯一id,详情可以参考代码;其实最好还是全部存储,数据库取的时候,全部取出再拿最后一个就行了,相比起来遍历数据要麻烦的多了。

### 实现 Element UI `el-cascader` 组件三级联动赋值与回显 为了实现 `el-cascader` 的三级联动并确保其能够正确地进行初始值设置以及后续的数据回显,可以遵循以下方法: #### 1. 安装必要的依赖包 安装用于提供中国地区数据的插件: ```bash npm install element-china-area-data -S ``` #### 2. 引入区域数据模块 在项目中的 JavaScript 文件内引入所需的区域数据及相关工具函数: ```javascript import { regionData, CodeToText, TextToCode } from 'element-china-area-data'; ``` #### 3. 配置级联选择器选项 定义好级联选择器所需的基础配置项,包括但不限于指定 `options` 属性来绑定之前导入的 `regionData`。 #### 4. 编写模板代码 HTML 结构如下所示,注意这里设置了 `v-model` 来双向绑定选中值,并通过监听 `@change` 事件处理变化逻辑[^2]。 ```html <template> <div> <!-- 级联选择器 --> <el-cascader class="select" size="large" :options="options" v-model="selectedOptions" @change="handleChange"> </el-cascader> <!-- 表单控件 (可选) --> <el-col :span="12"> <el-form-item prop="region"> <el-cascader v-model="form.region" :props="cascProps" placeholder="省/市/县" :options="RegionArr" clearable :disabled="isDisab"/> </el-form-item> </el-col> </div> </template> <script> export default { data() { return { options: regionData, selectedOptions: [], // 初始为空数组表示未选择任何内容 form: { region: [] // 同样初始化为一个空数组 }, RegionArr: regionData, isDisab: false, cascProps: { value: 'value', label: 'label', checkStrictly: true // 关键属性:允许单独选择某一级而不必选择完整的路径 } }; }, methods: { handleChange(value) { console.log('当前选中的值:', value); } } }; </script> ``` 上述代码片段展示了如何利用 Vue.js 和 Element UI 创建一个多级地址选择框,并且支持默认值设定和更改后的调操作。特别需要注意的是,在某些情况下可能需要调整 `checkStrictly` 参数以便更好地控制用户交互行为[^3]。 当页面加载完成之后,如果想要让某个特定地区的组合自动被选定,则可以通过给 `selectedOptions` 或者 `form.region` 赋予相应的编码序列来达到目的;而要实现在提交表单后再次展示上次的选择结果(即所谓的“回显”),则需保证服务器端返的数据格式匹配前端预期的形式——通常是一个由各级行政区划代号构成的一维列表[^4]。
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值