You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
804 B
36 lines
804 B
2 years ago
|
import { Slots } from 'vue'
|
||
|
import { isFunction } from '@/utils/is'
|
||
|
|
||
|
/**
|
||
|
* @description: Get slot to prevent empty error
|
||
|
*/
|
||
|
export function getSlot(slots: Slots, slot = 'default', data?: any) {
|
||
|
if (!slots || !Reflect.has(slots, slot)) {
|
||
|
return null
|
||
|
}
|
||
|
if (!isFunction(slots[slot])) {
|
||
|
console.error(`${slot} is not a function!`)
|
||
|
return null
|
||
|
}
|
||
|
const slotFn = slots[slot]
|
||
|
if (!slotFn) return null
|
||
|
return slotFn(data)
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* extends slots
|
||
|
* @param slots
|
||
|
* @param excludeKeys
|
||
|
*/
|
||
|
export function extendSlots(slots: Slots, excludeKeys: string[] = []) {
|
||
|
const slotKeys = Object.keys(slots)
|
||
|
const ret: any = {}
|
||
|
slotKeys.map((key) => {
|
||
|
if (excludeKeys.includes(key)) {
|
||
|
return null
|
||
|
}
|
||
|
ret[key] = (data?: any) => getSlot(slots, key, data)
|
||
|
})
|
||
|
return ret
|
||
|
}
|