javascript技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript技巧 > el-select值不匹配导致回显id

修改源码来解决el-select值不匹配导致回显id的问题

作者:rambler_wang

el-select数据的回显是根据id去匹配值的,最近项目出现了回显id的情况,一查是没有匹配数据的问题,于是就想怎么处理(针对单选的情况),本文小编给大家介绍了用修改源码来解决el-select值不匹配导致回显id的问题,需要的朋友可以参考下

背景介绍

基于vue2+element

el-select数据的回显是根据id去匹配值的,最近项目出现了回显id的情况,一查是没有匹配数据的问题,于是就想怎么处理(针对单选的情况)

实现思路

有下面两个方案

具体实现

setData(list, id, name) {
    let item = list.some(item => item.id === id)
    if (item) {
      list.push({
        id: id,
        name: name
      })
    }
}

实现比较简单,就不多说了

getOption(value) {
    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 = this.cachedOptions.length - 1; i >= 0; i--) {
      const cachedOption = this.cachedOptions[i];
      const isEqual = isObject
        ? getValueByPath(cachedOption.value, this.valueKey) === getValueByPath(value, this.valueKey)
        : cachedOption.value === value;
      if (isEqual) {
        option = cachedOption;
        break;
      }
    }
    if (option) return option;
    const label = (!isObject && !isNull && !isUndefined)
      ? String(value) : '';
    let newOption = {
      value: value,
      currentLabel: label
    };
    if (this.multiple) {
      newOption.hitState = false;
    }
    return newOption;
  }
let newOption = {
    value: value,
    currentLabel: this.defaultValue || label
};

写一个element-mixin.js

export default ElementUI => {
    ElementUI.Select.mixins[ElementUI.Select.mixins.length] = {
        props: {
            defaultValue: {
                type: String || Number,
                default: ''
            }
        },
    }
}

在main.js里面把mixin加上,源码getOption的修改也写这里

import ElementUI from 'element-ui'
import addSelectDefaultValue from './mixins/addSelectDefaultValue'
ElementUI.Select.methods.getOption = function (value) {
  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 = this.cachedOptions.length - 1; i >= 0; i--) {
    const cachedOption = this.cachedOptions[i];
    const isEqual = isObject
      ? getValueByPath(cachedOption.value, this.valueKey) === getValueByPath(value, this.valueKey)
      : cachedOption.value === value;
    if (isEqual) {
      option = cachedOption;
      break;
    }
  }
  if (option) return option;
  const label = (!isObject && !isNull && !isUndefined)
    ? String(value) : '';
  let newOption = {
    value: value,
    currentLabel: this.defaultValue || label
  };
  if (this.multiple) {
    newOption.hitState = false;
  }
  return newOption;
}
addSelectDefaultValue(ElementUI)

-界面使用的时候添加一个default的值就可以了

<el-select v-model="value" clearable placeholder="请选择">
    <el-option 
        v-for="item in options" 
        :key="item.value" 
        :label="item.label" 
        :value="item.value"
        :defaultValue="defaultValue"
    >
    </el-option>
</el-select>

上面这样初次进入不匹配的时候就会显示defaultValue的值而不是id了

带来的问题

以上就是修改源码来解决el-select值不匹配导致回显id的问题的详细内容,更多关于el-select值不匹配导致回显id的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文