<template> <span :class="badgeComputedCls.badgeCls"> <template v-if="isStatusBadge"> <span :class="badgeComputedCls.statusCls"></span> <span :class="[prefixCls+'-status-text']">{{text}}</span> </template> <template v-else> <slot></slot><transition appear :name="transitionName"> <scroll-number v-if="!badgeStatus.isHidden" :prefixCls="scrollNumberPrefixCls" :className="badgeComputedCls.scrollNumberCls" :count="badgeStatus.stateCount" :titleNumber="count" :styleNumber="styles" > </scroll-number> </transition> <span v-if="!badgeStatus.isHidden && text" :class="[prefixCls+'-status-text']"> {{text}} </span> </template> </span> </template> <script> import Icon from '../icon' import ScrollNumber from './ScrollNumber' export default { name: 'Badge', props: { prefixCls: { type: String, default: 'ant-badge', }, scrollNumberPrefixCls: { type: String, default: 'ant-scroll-number', }, count: { type: [Number, String], }, overflowCount: { type: [Number, String], default: 99, }, showZero: { type: Boolean, default: false, }, dot: { type: Boolean, default: false, }, status: { validator: (val) => { if (!val) return true return ['success', 'processing', 'default', 'error', 'warning'].includes(val) }, default: '', }, text: { type: String, default: '', }, styles: { type: Object, default: () => ({}), }, }, data () { const { prefixCls, $slots } = this const isHasDefaultSlot = $slots && !!$slots.default return { isHasDefaultSlot, transitionName: isHasDefaultSlot ? `${prefixCls}-zoom` : '', } }, computed: { isStatusBadge () { const { isHasDefaultSlot, status } = this return !isHasDefaultSlot && status }, badgeComputedCls () { const { prefixCls, isHasDefaultSlot, status, dot, count } = this const isDot = dot || status return { badgeCls: { [`${prefixCls}`]: true, [`${prefixCls}-status`]: !!status, [`${prefixCls}-not-a-wrapper`]: !isHasDefaultSlot, }, statusCls: { [`${prefixCls}-status-dot`]: !!status, [`${prefixCls}-status-${status}`]: !isHasDefaultSlot, }, scrollNumberCls: { [`${prefixCls}-dot`]: isDot, [`${prefixCls}-count`]: !isDot, [`${prefixCls}-multiple-words`]: count && count.toString && count.toString().length > 1, [`${prefixCls}-status-${status}`]: !isHasDefaultSlot, }, } }, badgeStatus () { const { count, overflowCount, showZero, dot, text } = this let stateCount = +count > +overflowCount ? `${overflowCount}+` : count const isDot = dot || text if (isDot) { stateCount = '' } const isZero = stateCount === '0' || stateCount === 0 const isEmpty = stateCount === null || stateCount === undefined || stateCount === '' const isHidden = (isEmpty || (isZero && !showZero)) && !isDot return { stateCount, isHidden, } }, }, components: { Icon, ScrollNumber, }, } </script>