element-plus 封装下拉树实现

<template>
  <div>
    <el-select
      @visible-change="selectClose"
      v-model="modelValueLabel"
      :filter-method="selectFilterMethod"
      style="min-width: 180px;"
      :size="size"
      :placeholder="placeholderText"
      :filterable="isFilter"
      :collapse-tags="isTag"
      @change="selectChangeMethod">
      <el-option :value="modelValue" style="height: auto;padding: 0;">
        <el-tree
          :data="treeData"
          :default-expand-all="isDefaultAll"
          :expand-on-click-node="true"
          :filter-node-method="filterNode"
          :show-checkbox="false"
          :check-strictly="true"
          node-key="id"
          ref="demoTree"
          highlight-current
          :props="defaultProps"
          @node-click="handleCheckChange">
        </el-tree>
      </el-option>
    </el-select>
  </div>
</template>

<script>
export default {
  name: 'index',
  props: {
    // echoObj 可以用于回显,它的值为需要回显的对象,多个时可以使用数组
    echoObj: {},
    // 是否开启搜索
    isFilter: {
      default: true
    },
    // 尺寸
    size: {
      default: 'mini'
    },
    placeholderText: {
      default: '请选择...'
    },
    isTag: {
      default: true
    },
    isDefaultAll: {
      default: true
    },
    // 点击节点是否展开
    expandClickNode: {
      default: false
    },
    // 字段key,用于取出数据中的名字
    fieldName: {
      default: ''
    },
    // 字段key, 数据中的id
    fieldId: {
      default: ''
    },
    // 数据
    treeData: {
      default: [{
        id: 1,
        label: '一级 1',
        children: [{
          id: 4,
          label: '二级 1-1',
          children: [{
            id: 9,
            label: '三级 1-1-1'
          }, {
            id: 10,
            label: '三级 1-1-2'
          }]
        }]
      }, {
        id: 2,
        label: '一级 2',
        children: [{
          id: 5,
          label: '二级 2-1'
        }, {
          id: 6,
          label: '二级 2-2'
        }]
      }, {
        id: 3,
        label: '一级 3',
        children: [{
          id: 7,
          label: '二级 3-1'
        }, {
          id: 8,
          label: '二级 3-2'
        }]
      }]
    },
    // 遍历时字段格式化
    defaultProps: {
      default: {
        children: 'children',
        label: 'label'
      }
    },
    // 是否单选
    isSingleChoice: {
      default: true
    }
  },
  data () {
    return {
      // 实际选中值
      modelValue: [],
      // 下拉框绑定值(选中值名字)
      modelValueLabel: []
    }
  },
  mounted () {
    if (this.echoObj) {
      if (this.echoObj.length > 0) {
        var ids = []
        var names = []
        for (let i = 0; i < this.echoObj.length; i++) {
          ids.push(JSON.parse('this.echoObj[i].' + this.fieldId))
          names.push(JSON.parse('this.echoObj[i].' + this.fieldName))
          this.modelValue.push(this.echoObj[i])
        }
        this.modelValueLabel = names
        this.$nextTick(() => {
          this.$refs.demoTree.setCheckedKeys(ids)
        })
      }
    }
  },
  methods: {
    selectClose (bool) {
      if (bool) {
        this.selectFilterMethod('')
      }
    },
    selectFilterMethod (val) {
      // 下拉框调用tree树筛选
      this.$refs.demoTree.filter(val)
    },
    selectChangeMethod (e) {
      var arrNew = []
      var dataLength = this.modelValue.length
      var eLength = e.length
      for (var i = 0; i < dataLength; i++) {
        for (var j = 0; j < eLength; j++) {
          if (e[j] === JSON.parse('this.modelValue[i].' + this.fieldName)) {
            arrNew.push(this.modelValue[i])
          }
        }
      }
      // 设置勾选的值
      this.$refs.demoTree.setCheckedNodes(arrNew)
    },
    filterNode (value, data) {
      if (!value) return true
      // JSON.parse('data.' + this.fieldName)
      return JSON.parse('data.' + this.fieldName).indexOf(value) !== -1
    },
    handleCheckChange (data, node) {
      if (this.isSingleChoice) {
        this.$refs.demoTree.setCheckedNodes([data])
        this.modelValueLabel = data.label
      }
      // 这里两个true,1. 是否只是叶子节点 2. 是否包含半选节点(就是使得选择的时候不包含父节点
      var arrLabel = []
      var arr = []
      this.modelValue = arr.push(data.id)
      this.modelValueLabel = arrLabel.push(data.label)
      if (this.isSingleChoice) {
        if (arr.length === 1) {
          this.$emit('callBackFunc', arr)
        }
      } else {
        this.$emit('callBackFunc', arr)
      }
    }
  }
}
</script>

<style lang="" scoped>

</style>

 

posted @ 2021-05-17 09:14  氧化成风  阅读(1790)  评论(0编辑  收藏  举报