78 lines
1.3 KiB
Vue
78 lines
1.3 KiB
Vue
![]() |
<template>
|
||
|
<view
|
||
|
class="cl-badge"
|
||
|
:class="[
|
||
|
`cl-badge--${type}`,
|
||
|
{
|
||
|
'is-dot': isDot,
|
||
|
'is-plain': plain,
|
||
|
},
|
||
|
]"
|
||
|
v-if="$slots.default"
|
||
|
>
|
||
|
<slot></slot>
|
||
|
<text
|
||
|
class="cl-badge__content"
|
||
|
:style="[
|
||
|
baseStyle,
|
||
|
{
|
||
|
backgroundColor: color,
|
||
|
},
|
||
|
]"
|
||
|
v-if="!hidden && ((content && content != 0) || isDot)"
|
||
|
>{{ content }}</text
|
||
|
>
|
||
|
</view>
|
||
|
</template>
|
||
|
|
||
|
<script lang="ts">
|
||
|
import { computed, defineComponent } from "vue";
|
||
|
import { type PropType } from "vue";
|
||
|
import { isNumber } from "lodash-es";
|
||
|
import { useStyle } from "../../hooks";
|
||
|
|
||
|
export default defineComponent({
|
||
|
name: "cl-badge",
|
||
|
|
||
|
props: {
|
||
|
// 文本内容
|
||
|
value: [String, Number],
|
||
|
// 最大值
|
||
|
max: Number,
|
||
|
// 是否点状
|
||
|
isDot: Boolean,
|
||
|
// 是否隐藏
|
||
|
hidden: Boolean,
|
||
|
// 类型
|
||
|
type: {
|
||
|
type: String as PropType<"primary" | "success" | "warning" | "error">,
|
||
|
default: "error",
|
||
|
},
|
||
|
// 颜色
|
||
|
color: String,
|
||
|
// 朴素
|
||
|
plain: Boolean,
|
||
|
},
|
||
|
|
||
|
setup(props) {
|
||
|
const content = computed(() => {
|
||
|
if (props.isDot) return "";
|
||
|
|
||
|
const value: any = props.value;
|
||
|
const max: any = props.max;
|
||
|
|
||
|
if (isNumber(value) && isNumber(max) && max > 0) {
|
||
|
return max < value ? `${max}+` : value;
|
||
|
}
|
||
|
|
||
|
return value;
|
||
|
});
|
||
|
|
||
|
return {
|
||
|
content,
|
||
|
...useStyle(),
|
||
|
};
|
||
|
},
|
||
|
});
|
||
|
</script>
|