2022-04-12
阅读:1471
在vue项目开发中,在使用element-ui select组件底部想增加一些自定义的按钮, 实现效果如下图所示:
针对这个下拉选择框封装一个组件,如下代码
主要实现方式是通过 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>