elementui select组件下拉框底部增加自定义按钮

elementui select组件下拉框底部增加自定义按钮

在vue项目开发中,在使用element-ui select组件底部想增加一些自定义的按钮, 实现效果如下图所示:

WX20220412-193248

实现方案:

针对这个下拉选择框封装一个组件,如下代码

主要实现方式是通过 el-select组件的visible-change 事件(下拉框出现/隐藏时触发)

参考methods下的visibleChange处理方法,组件内的其他业务逻辑不必太多关注,可自行实现

<template>
  <el-select
    ref="select"
    :value="value"
    placeholder="请选择"
    :disabled="disabled"
    :filterable="filterable"
    :clearable="clearable"
    @change="changeSelect"
    @visible-change="visibleChange"
  >
    <el-option
      v-for="item in paymentTypeList"
      :key="item.id"
      :label="item.dictionaryName"
      :value="item.id"
    />
  </el-select>
</template>

<script>
import { mapState } from 'vuex'
export default {
  model: {
    prop: 'value',
    event: 'change'
  },
  props: {
    value: {
      type: [String, Number],
      default: ''
    },
    clearable: {
      type: Boolean,
      default: true
    },
    filterable: {
      type: Boolean,
      default: true
    },
    disabled: {
      type: Boolean,
      default: false
    }
  },
  computed: {
    ...mapState({
      paymentTypeList: state => state.finance.paymentTypeList
    }),
    defaultPayment() {
      const defaultItem = this.paymentTypeList.find(
        item => item.defaultYn === 'Y'
      )
      if (defaultItem) {
        return defaultItem
      } else {
        return null
      }
    }
  },
  watch: {
    paymentTypeList(val) {
      if (val.length > 0 && !this.value && this.defaultPayment) {
        this.$emit('change', this.defaultPayment.id, this.defaultPayment)
      }
    }
  },
  created() {
    if (this.paymentTypeList.length === 0) {
      this.$store.dispatch('finance/getPaymenTypeList')
    }
  },
  mounted() {
    if (!this.value && this.paymentTypeList.length > 0 && this.defaultPayment) {
      this.$emit('change', this.defaultPayment.id, this.defaultPayment)
    }
  },
  methods: {
    changeSelect(e) {
      const Item = this.paymentTypeList.find(item => item.id === e)
      this.$emit('change', e, Item)
    },
    visibleChange(visible) {
      console.log(visible)
      // 下拉框显示隐藏
      if (visible) {
        const ref = this.$refs.select
        let popper = ref.$refs.popper
        if (popper.$el) popper = popper.$el
        // 判断是否有添加按钮
        if (!Array.from(popper.children).some(v => v.className === 'btn-box')) {
          const el = document.createElement('div')
          el.className = 'btn-box'
          el.innerHTML = `<a class="btn" style="font-size:16px;display:block;line-height:38px;text-align:center;">
                            <i class="el-icon-plus"></i>添加
                          </a>`
          popper.appendChild(el)
          el.onclick = () => {
            //TODO
          }
        }
      }
    }
  }
}
</script>

<style></style>