<template>
|
<el-tabs
|
class="fu-tabs"
|
:before-leave="beforeLeave"
|
:editable="false"
|
:addable="false"
|
v-bind="$attrs"
|
>
|
<el-tab-pane name="add" key="add" v-if="addable" :lazy="true">
|
<template #label>
|
<slot name="add">
|
<!-- 下拉方式 -->
|
<el-dropdown @command="handleCommand" v-if="addType === 'dropdown'" :trigger="addTrigger">
|
<slot name="dropdownButton">
|
<el-button type="primary" plain>
|
<el-icon>
|
<component :is="addIcon" />
|
</el-icon>
|
<template v-if="addButtonLabel">{{ addButtonLabel }}</template>
|
</el-button>
|
</slot>
|
<template #dropdown>
|
<el-dropdown-menu>
|
<el-dropdown-item
|
v-for="(item, i) in dropdownMenus"
|
:key="i"
|
:icon="item.icon"
|
:disabled="item.disabled"
|
:divided="item.divided"
|
:command="item.command"
|
>
|
{{ item.label }}
|
</el-dropdown-item>
|
</el-dropdown-menu>
|
</template>
|
</el-dropdown>
|
<!-- 默认 -->
|
<el-button v-else @click="handleCommand" type="primary" plain>
|
<el-icon>
|
<component :is="addIcon" />
|
</el-icon>
|
<template v-if="addButtonLabel">{{ addButtonLabel }}</template>
|
</el-button>
|
</slot>
|
</template>
|
</el-tab-pane>
|
<slot />
|
</el-tabs>
|
</template>
|
|
<script lang="ts" setup>
|
import { PropType } from 'vue'
|
import { DropdownProps } from '@/custom-component/de-tabs/types'
|
import generateID from '@/utils/generateID'
|
defineOptions({ name: 'FuTabs' })
|
type TabPanelName = string | number
|
const props = defineProps({
|
addType: {
|
type: String,
|
default: 'default',
|
validator: (val: string) => ['default', 'dropdown'].includes(val)
|
},
|
dropdownMenus: {
|
type: Array as PropType<DropdownProps[]>,
|
default: () => []
|
},
|
addTrigger: {
|
type: String,
|
default: 'hover',
|
validator: (val: string) => ['hover', 'click'].includes(val)
|
},
|
addIcon: {
|
type: String,
|
default: 'Plus'
|
},
|
addButtonLabel: String,
|
addable: Boolean
|
})
|
const emit = defineEmits(['command'])
|
|
function handleCommand(e: any) {
|
const name = generateID()
|
let obj = null
|
if (e) {
|
obj = props.dropdownMenus.find((item: any) => item.command === e)
|
}
|
emit('command', name, obj)
|
}
|
|
/* 活动标签切换时触发 */
|
function beforeLeave(currentName: TabPanelName) {
|
// 如果name是add,则什么都不触发
|
if (currentName === 'add') {
|
return false
|
}
|
}
|
</script>
|