el-select 重写(动态加载,已保存值无法回显问题)

element ui的 el-select 不满足需求,看了下源码对其中的某些方法重写

问题: 下拉选项数据为动态加载,用户之前选择了第一页之后的数据,在编辑回显时,无法显示之前的已选值

解决方案:

  1. 然后el-select设置成返回已选项的对象
  2. 需要保存选中项的code和name(需要和后端沟通,让他接口帮忙保存)
  3. 重写el-select 的回显值方法
    下面是重写内容:
<el-select
    ref="select"
    class="load-select"
    v-model="curValue"
    :placeholder="placeholder"
    :clearable="clearable"
    :filterable="filterable"
    :multiple="multiple"
    :remote="remote"
    :remote-method="searchFn"
    :loading="loading"
    v-loadmore="LoadMore"
    @change="changeValue"
    @visible-change="visibleSelect"
    value-key="code"
  >
    <el-option
      v-for="(item, index) in optionList"
      :key="index"
      :label="item.name"
      :value="item.code"
    >
    </el-option>
  </el-select>

el-select 需要设置value-key="code"
然后el-option 需要设置 :value="item"

下面是el-select的getOption 方法重写:
我这边是直接copy 了一份源码中的方法,然后对label赋值做了修改: label = value.name || ‘’;


  getOption(value) {
    let $select: any = this.$refs.select;
    let option;
    const isObject =
      Object.prototype.toString.call(value).toLowerCase() === "[object object]";
    const isNull =
      Object.prototype.toString.call(value).toLowerCase() === "[object null]";
    const isUndefined =
      Object.prototype.toString.call(value).toLowerCase() ===
      "[object undefined]";

    for (let i = $select.cachedOptions.length - 1; i >= 0; i--) {
      const cachedOption = $select.cachedOptions[i];
      const isEqual = isObject
        ? getValueByPath(cachedOption.value, $select.valueKey) ===
          getValueByPath(value, $select.valueKey)
        : cachedOption.value === value;
      if (isEqual) {
        option = cachedOption;
        break;
      }
    }

    if (option) return option;
    //下面注释的这句是源码里本身的
	//const label = (!isObject && !isNull && !isUndefined)? value : '';
	// 重写--start
    let label = "";
    if (!isObject) {
      label = !isNull && !isUndefined ? value : "";
    } else {
      label = value.name || "";//这句就是当value 是对象时,label赋值为value.name(这个name字段名是我这边的,小伙伴们需要根据自己的字段名来修改,也可以写成变量传入)
    }
    // 重写--end

    let newOption: any = {
      value: value,
      currentLabel: label
    };
    if ($select.multiple) {
      newOption.hitState = false;
    }
    return newOption;
  }

还有最后一步,就是把这个getOption 方法覆盖掉el-select本身的这个getOption方法:
我是在mounted 方法里直接绑定到这个ref上

 mounted() {
    this.$nextTick(() => {
      let $select: any = this.$refs.select;
      $select.getOption = this.getOption;
    });
  }

以上就是我的解决方案了,有更好的方法,欢迎评论告知哈~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好!针对您的问题,我理解您是想在 el-cascader 中根据后台返回的地区 ID 进行动态加载,并且在回显数据时能够正确展示。这里提供一个简单的思路,供您参考: 1. 在 el-cascader 中设置 lazy 属性为 true,这样子组件将会以懒加载的方式进行数据加载; 2. 在回显数据时,将对应的地区 ID 存储在一个数组中,例如 selectedRegionIds; 3. 在 el-cascader 中设置 value 属性为 selectedRegionIds,这样子组件将会自动根据 value 属性的进行选项的展开和选中。同时,通过 watch 监听 selectedRegionIds 的变化,当发生变化时自动加载对应的地区数据。 关于具体的代码实现,可以参考下面的示例: ``` <template> <el-cascader :options="options" :lazy="true" :value="selectedRegionIds" @change="handleChange" ></el-cascader> </template> <script> export default { data() { return { options: [], // 级联选项数据 selectedRegionIds: [], // 回显数据 }; }, created() { // 获取根级地区数据 this.fetchRegionsByParentId(0).then((options) => { this.options = options; }); // 获取回显数据 this.fetchSelectedRegionIds().then((selectedRegionIds) => { this.selectedRegionIds = selectedRegionIds; }); }, watch: { selectedRegionIds: { handler(value) { // 加载对应的地区数据 this.loadRegionsByRegionIds(value); }, immediate: true, }, }, methods: { // 异步请求获取指定 parent_id 下的地区数据 fetchRegionsByParentId(parentId) { // ... }, // 异步请求获取回显数据 fetchSelectedRegionIds() { // ... }, // 根据地区 ID 加载对应的地区数据 loadRegionsByRegionIds(regionIds) { let parentId = 0; let i = 0; const loadRegion = () => { if (i < regionIds.length) { this.fetchRegionsByParentId(parentId).then((regions) => { const region = regions.find((r) => r.region_id === regionIds[i]); if (region) { parentId = region.region_id; i++; loadRegion(); } }); } }; loadRegion(); }, // 当选中项发生变化时触发 handleChange(value) { this.selectedRegionIds = value; }, }, }; </script> ``` 需要注意的是,以上代码仅提供一个思路,具体实现还需要根据您的具体需求进行调整。希望能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值