mirror of
https://github.com/vbenjs/vue-vben-admin.git
synced 2025-08-28 06:49:24 +08:00
initial commit
This commit is contained in:
88
src/components/Button/index.vue
Normal file
88
src/components/Button/index.vue
Normal file
@@ -0,0 +1,88 @@
|
||||
<template>
|
||||
<Button v-bind="getBindValue" :class="[getColor, $attrs.class]">
|
||||
<template v-slot:[item] v-for="item in Object.keys($slots)">
|
||||
<slot :name="item" />
|
||||
</template>
|
||||
</Button>
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { PropType } from 'vue';
|
||||
|
||||
import { defineComponent, computed, unref } from 'vue';
|
||||
import { Button } from 'ant-design-vue';
|
||||
// import { extendSlots } from '/@/utils/helper/tsxHelper';
|
||||
import { useThrottle } from '/@/hooks/core/useThrottle';
|
||||
import { isFunction } from '/@/utils/is';
|
||||
export default defineComponent({
|
||||
name: 'AButton',
|
||||
inheritAttrs: false,
|
||||
components: { Button },
|
||||
props: {
|
||||
// 按钮类型
|
||||
type: {
|
||||
type: String as PropType<'primary' | 'default' | 'danger' | 'dashed' | 'link'>,
|
||||
default: 'default',
|
||||
},
|
||||
// 节流防抖类型 throttle debounce
|
||||
throttle: {
|
||||
type: String as PropType<'throttle' | 'debounce'>,
|
||||
default: 'throttle',
|
||||
},
|
||||
color: {
|
||||
type: String as PropType<'error' | 'warning' | 'success'>,
|
||||
},
|
||||
// 防抖节流时间
|
||||
throttleTime: {
|
||||
type: Number as PropType<number>,
|
||||
default: 0,
|
||||
},
|
||||
loading: {
|
||||
type: Boolean as PropType<boolean>,
|
||||
default: false,
|
||||
},
|
||||
disabled: {
|
||||
type: Boolean as PropType<boolean>,
|
||||
default: false,
|
||||
},
|
||||
},
|
||||
setup(props, { attrs }) {
|
||||
const getListeners = computed(() => {
|
||||
const { throttle, throttleTime = 0 } = props;
|
||||
// 是否开启节流防抖
|
||||
const throttleType = throttle!.toLowerCase();
|
||||
const isDebounce = throttleType === 'debounce';
|
||||
const openThrottle = ['throttle', 'debounce'].includes(throttleType) && throttleTime > 0;
|
||||
|
||||
const on: {
|
||||
onClick?: Fn;
|
||||
} = {};
|
||||
|
||||
if (attrs.onClick && isFunction(attrs.onClick) && openThrottle) {
|
||||
const [handler] = useThrottle(attrs.onClick as any, throttleTime!, {
|
||||
debounce: isDebounce,
|
||||
immediate: true,
|
||||
});
|
||||
on.onClick = handler;
|
||||
}
|
||||
|
||||
return {
|
||||
...attrs,
|
||||
...on,
|
||||
};
|
||||
});
|
||||
|
||||
const getColor = computed(() => {
|
||||
const res: string[] = [];
|
||||
const { color, disabled } = props;
|
||||
color && res.push(`ant-btn-${color}`);
|
||||
disabled && res.push('is-disabled');
|
||||
return res;
|
||||
});
|
||||
|
||||
const getBindValue = computed((): any => {
|
||||
return { ...unref(getListeners), ...props };
|
||||
});
|
||||
return { getBindValue, getColor };
|
||||
},
|
||||
});
|
||||
</script>
|
66
src/components/Button/types.ts
Normal file
66
src/components/Button/types.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import { VNodeChild } from 'vue';
|
||||
|
||||
export interface BasicButtonProps {
|
||||
/**
|
||||
* can be set to primary ghost dashed danger(added in 2.7) or omitted (meaning default)
|
||||
* @default 'default'
|
||||
* @type string
|
||||
*/
|
||||
type?: 'primary' | 'danger' | 'dashed' | 'ghost' | 'default';
|
||||
|
||||
/**
|
||||
* set the original html type of button
|
||||
* @default 'button'
|
||||
* @type string
|
||||
*/
|
||||
htmlType?: 'button' | 'submit' | 'reset' | 'menu';
|
||||
|
||||
/**
|
||||
* set the icon of button
|
||||
* @type string
|
||||
*/
|
||||
icon?: VNodeChild | JSX.Element;
|
||||
|
||||
/**
|
||||
* can be set to circle or circle-outline or omitted
|
||||
* @type string
|
||||
*/
|
||||
shape?: 'circle' | 'circle-outline';
|
||||
|
||||
/**
|
||||
* can be set to small large or omitted
|
||||
* @default 'default'
|
||||
* @type string
|
||||
*/
|
||||
size?: 'small' | 'large' | 'default';
|
||||
|
||||
/**
|
||||
* set the loading status of button
|
||||
* @default false
|
||||
* @type boolean | { delay: number }
|
||||
*/
|
||||
loading?: boolean | { delay: number };
|
||||
|
||||
/**
|
||||
* disabled state of button
|
||||
* @default false
|
||||
* @type boolean
|
||||
*/
|
||||
disabled?: boolean;
|
||||
|
||||
/**
|
||||
* make background transparent and invert text and border colors, added in 2.7
|
||||
* @default false
|
||||
* @type boolean
|
||||
*/
|
||||
ghost?: boolean;
|
||||
|
||||
/**
|
||||
* option to fit button width to its parent width
|
||||
* @default false
|
||||
* @type boolean
|
||||
*/
|
||||
block?: boolean;
|
||||
|
||||
onClick?: (e?: Event) => void;
|
||||
}
|
Reference in New Issue
Block a user