unitTreeSelect.vue 4.17 KB
<template>
  <div style="width: auto; display: inline;">
    <a-select :style="{width: width? width+ 'px':'80%'}" v-model="selected[key]" v-for="(arry, key) in selectArray" @focus="position = key" @change="selectChange($event, key)" :key="key" :disabled="disable && disabled[key]">
      <a-select-option v-for="item in arry" :key="item.key" :value="item.key" select>{{ item.title }}</a-select-option>
    </a-select>
  </div>
</template>
<script>
// 用法 <unit-tree-select v-model="formData.treeCode" />
export default {
  name: "UnitTreeSelect",
  data () {
    return {
      unitList: [],
      selectArray: [],
      selected: [],
      disabled: [],
      defaultValue: {
        title: "--请选择--",
        key: "",
        description: "",
        selected: true,
        disabled: true,
      },
      loadState: false,
    };
  },
  props: {
    value: {
      type: String,
      default: () => {
        return ''
      }
    },
    unitType: {
      type: Number,
      default: () => {
        return null
      }
    },
    defaultLength: {
      type: Number,
      default: () => {
        return 5
      }
    },
    title: {
      type: String,
      default () {
        return ''
      }
    },
    disable: {
      type: Boolean,
      default () {
        return true
      },
    },
    width: {
      type: Number,
      default () {
        return 180
      }
    },
  },
  created () {
    this.loadSelectValue(this.value, 1)
  },
  methods: {
    loadSelectValue (value, type) {
      if (!!!value)
        value = ''
      else
        this.loadState = true
      if (this.unitList.length == 0) {
        this.$api.unit.getTreeCodeListByType({ unitType: this.unitType }).then(({ data = {} }) => {
          if (data) {
            this.unitList = data
            this.selectArray = []
            this.selected = []
            this.disabled = []
            this.loadDropDownList(value, type)
          }
        }).catch(() => { this.loading = false });
      } else {
        this.selectArray = []
        this.selected = []
        this.disabled = []
        this.loadDropDownList(value, type)
      }
    },
    loadDropDownList (code, type) {
      let data = this.unitList.filter((item) => item.key.substring(0, item.key.length - this.defaultLength) === code)
      if (data.length > 0) {
        data.unshift(this.defaultValue)
        this.selectArray.unshift(data)
        if (code.length >= this.defaultLength) {
          this.selected.unshift(code)
          if (code.length == this.value.length) {
            this.disabled.unshift(false)
          } else {
            this.disabled.unshift(true)
          }
        }
        if ((!!this.value && this.value.length == code.length) || !!!this.value) {
          this.selected.push('')
          this.disabled.unshift(true)
        }
      } else {
        this.selected.push(code)
        this.disabled.unshift(true)
      }
      if (code.length >= this.defaultLength) {
        this.loadDropDownList(code.substring(0, code.length - this.defaultLength), type);
      }
    },
    treeDropDownSelect (code, index) {
      let allArrCount = this.selectArray.length;
      for (let i = index + 1; i < allArrCount; i++) {
        this.selectArray.pop();
        this.selected.pop();
        this.disabled.pop();
      }
      if (code) {
        let unitArr1 = this.unitList.filter((item) => item.key.substring(0, item.key.length - this.defaultLength) === code);
        if (unitArr1.length > 0) {
          unitArr1.unshift(this.defaultValue);
          this.selectArray.push(unitArr1);
          this.selected.push("");
          this.disabled.push(false);
        }
      }
    },
    selectChange (value, key) {
      this.treeDropDownSelect(value, key);
      let allCount = this.selected.length;
      let treeCode = "";
      for (let i = allCount - 1; i >= 0; i--) {
        if (this.selected[i] != "") {
          treeCode = this.selected[i];
          break;
        }
      }
      this.$emit("input", treeCode);
      this.$emit("change");
    },
  },
  watch: {
    value: {
      handler (value) {
        if (!!value && !this.loadState) {
          this.loadSelectValue(value, 2)
          this.loadState = true
        }
      },
    },
  }
}
</script>