-
-
Notifications
You must be signed in to change notification settings - Fork 4.1k
/
VueButton.vue
119 lines (113 loc) · 2.38 KB
/
VueButton.vue
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
<template>
<component
:is="component"
class="vue-ui-button"
:class="[
component,
{
loading,
ghost,
},
]"
:type="type"
:tabindex="ghost ? -1 : 0"
role="button"
:aria-disabled="ghost ? true : null"
@click.capture="handleClick"
>
<VueLoadingIndicator v-if="loading" />
<span class="content">
<VueLoadingIndicator
v-if="loadingSecondary"
class="inline small loading-secondary"
/>
<VueIcon
v-else-if="iconLeft"
:icon="iconLeft"
class="button-icon left"
/>
<span class="default-slot">
<slot>
{{ label }}
</slot>
</span>
<div
v-if="tag != null"
class="tag-wrapper"
>
<div class="tag">{{ tag }}</div>
</div>
<VueIcon
v-if="iconRight"
:icon="iconRight"
class="button-icon right"
/>
</span>
</component>
</template>
<script lang="ts">
import { PropType, useAttrs, computed, defineComponent } from 'vue'
import { useDisabledChild } from '../composables/useDisabled'
export default defineComponent({
props: {
iconLeft: {
type: String,
default: '',
},
iconRight: {
type: String,
default: '',
},
label: {
type: String,
default: '',
},
loading: Boolean,
loadingSecondary: Boolean,
type: {
type: String as PropType<'button' | 'submit' | 'reset'>,
default: 'button',
},
tag: {
type: [String, Number],
default: null,
},
disabled: {
type: Boolean,
default: false,
},
},
emits: ['click'],
setup (props, { emit }) {
const attrs = useAttrs()
const { finalDisabled } = useDisabledChild(props)
const component = computed(() => {
if (attrs.to) {
return 'router-link'
} else if (attrs.href) {
return 'a'
} else {
return 'button'
}
})
const ghost = computed(() => {
return finalDisabled.value || props.loading || props.loadingSecondary
})
const handleClick = (event: MouseEvent) => {
if (ghost.value) {
event.preventDefault()
event.stopPropagation()
event.stopImmediatePropagation()
} else {
emit('click', event)
}
}
return {
attrs,
component,
ghost,
handleClick,
}
},
})
</script>