| <template> | 
|     <view v-if="show" class="u-badge" :class="[ | 
|             isDot ? 'u-badge-dot' : '',  | 
|             size == 'mini' ? 'u-badge-mini' : '', | 
|             type ? 'u-badge--bg--' + type : '' | 
|         ]" :style="[{ | 
|             top: offset[0] + 'rpx', | 
|             right: offset[1] + 'rpx', | 
|             fontSize: fontSize + 'rpx', | 
|             position: absolute ? 'absolute' : 'static', | 
|             color: color, | 
|             backgroundColor: bgColor | 
|         }, boxStyle]" | 
|     > | 
|         {{showText}} | 
|     </view> | 
| </template> | 
|   | 
| <script> | 
|     /** | 
|      * badge 角标 | 
|      * @description 本组件一般用于展示头像的地方,如个人中心,或者评论列表页的用户头像展示等场所。 | 
|      * @tutorial https://www.uviewui.com/components/badge.html | 
|      * @property {String Number} count 展示的数字,大于 overflowCount 时显示为 ${overflowCount}+,为0且show-zero为false时隐藏 | 
|      * @property {Boolean} is-dot 不展示数字,只有一个小点(默认false) | 
|      * @property {Boolean} absolute 组件是否绝对定位,为true时,offset参数才有效(默认true) | 
|      * @property {String Number} overflow-count 展示封顶的数字值(默认99) | 
|      * @property {String} type 使用预设的背景颜色(默认error) | 
|      * @property {Boolean} show-zero 当数值为 0 时,是否展示 Badge(默认false) | 
|      * @property {String} size Badge的尺寸,设为mini会得到小一号的Badge(默认default) | 
|      * @property {Array} offset 设置badge的位置偏移,格式为 [x, y],也即设置的为top和right的值,单位rpx。absolute为true时有效(默认[20, 20]) | 
|      * @property {String} color 字体颜色(默认#ffffff) | 
|      * @property {String} bgColor 背景颜色,优先级比type高,如设置,type参数会失效 | 
|      * @property {Boolean} is-center 组件中心点是否和父组件右上角重合,优先级比offset高,如设置,offset参数会失效(默认false) | 
|      * @example <u-badge type="error" count="7"></u-badge> | 
|      */ | 
|     export default { | 
|         name: 'u-badge', | 
|         props: { | 
|             // primary,warning,success,error,info | 
|             type: { | 
|                 type: String, | 
|                 default: 'error' | 
|             }, | 
|             // default, mini | 
|             size: { | 
|                 type: String, | 
|                 default: 'default' | 
|             }, | 
|             //是否是圆点 | 
|             isDot: { | 
|                 type: Boolean, | 
|                 default: false | 
|             }, | 
|             // 显示的数值内容 | 
|             count: { | 
|                 type: [Number, String], | 
|             }, | 
|             // 展示封顶的数字值 | 
|             overflowCount: { | 
|                 type: Number, | 
|                 default: 99 | 
|             }, | 
|             // 当数值为 0 时,是否展示 Badge | 
|             showZero: { | 
|                 type: Boolean, | 
|                 default: false | 
|             }, | 
|             // 位置偏移 | 
|             offset: { | 
|                 type: Array, | 
|                 default: () => { | 
|                     return [20, 20] | 
|                 } | 
|             }, | 
|             // 是否开启绝对定位,开启了offset才会起作用 | 
|             absolute: { | 
|                 type: Boolean, | 
|                 default: true | 
|             }, | 
|             // 字体大小 | 
|             fontSize: { | 
|                 type: [String, Number], | 
|                 default: '24' | 
|             }, | 
|             // 字体演示 | 
|             color: { | 
|                 type: String, | 
|                 default: '#ffffff' | 
|             }, | 
|             // badge的背景颜色 | 
|             bgColor: { | 
|                 type: String, | 
|                 default: '' | 
|             }, | 
|             // 是否让badge组件的中心点和父组件右上角重合,配置的话,offset将会失效 | 
|             isCenter: { | 
|                 type: Boolean, | 
|                 default: false | 
|             } | 
|         }, | 
|         computed: { | 
|             // 是否将badge中心与父组件右上角重合 | 
|             boxStyle() { | 
|                 let style = {}; | 
|                 if(this.isCenter) { | 
|                     style.top = 0; | 
|                     style.right = 0; | 
|                     // Y轴-50%,意味着badge向上移动了badge自身高度一半,X轴50%,意味着向右移动了自身宽度一半 | 
|                     style.transform = "translateY(-50%) translateX(50%)"; | 
|                 } else { | 
|                     style.top = this.offset[0] + 'rpx'; | 
|                     style.right = this.offset[1] + 'rpx'; | 
|                     style.transform = "translateY(0) translateX(0)"; | 
|                 } | 
|                 // 如果尺寸为mini,后接上scal() | 
|                 if(this.size == 'mini') { | 
|                     style.transform = style.transform + " scale(0.8)"; | 
|                 } | 
|                 return style; | 
|             }, | 
|             // isDot类型时,不显示文字 | 
|             showText() { | 
|                 if(this.isDot) return ''; | 
|                 else { | 
|                     if(this.count > this.overflowCount) return `${this.overflowCount}+`; | 
|                     else return this.count; | 
|                 } | 
|             }, | 
|             // 是否显示组件 | 
|             show() { | 
|                 // 如果count的值为0,并且showZero设置为false,不显示组件 | 
|                 if(this.count == 0 && this.showZero == false) return false; | 
|                 else return true; | 
|             } | 
|         } | 
|     } | 
| </script> | 
|   | 
| <style lang="scss" scoped> | 
|     @import "../../libs/css/style.components.scss"; | 
|      | 
|     .u-badge { | 
|         /* #ifndef APP-NVUE */ | 
|         display: inline-flex; | 
|         /* #endif */ | 
|         justify-content: center; | 
|         align-items: center; | 
|         line-height: 24rpx; | 
|         padding: 4rpx 8rpx; | 
|         border-radius: 100rpx; | 
|         z-index: 9; | 
|          | 
|         &--bg--primary { | 
|             background-color: $u-type-primary; | 
|         } | 
|          | 
|         &--bg--error { | 
|             background-color: $u-type-error; | 
|         } | 
|          | 
|         &--bg--success { | 
|             background-color: $u-type-success; | 
|         } | 
|          | 
|         &--bg--info { | 
|             background-color: $u-type-info; | 
|         } | 
|          | 
|         &--bg--warning { | 
|             background-color: $u-type-warning; | 
|         } | 
|     } | 
|      | 
|     .u-badge-dot { | 
|         height: 16rpx; | 
|         width: 16rpx; | 
|         border-radius: 100rpx; | 
|         line-height: 1; | 
|     } | 
|      | 
|     .u-badge-mini { | 
|         transform: scale(0.8); | 
|         transform-origin: center center; | 
|     } | 
|      | 
|     // .u-primary { | 
|     //     background: $u-type-primary; | 
|     //     color: #fff; | 
|     // } | 
|      | 
|     // .u-error { | 
|     //     background: $u-type-error; | 
|     //     color: #fff; | 
|     // } | 
|      | 
|     // .u-warning { | 
|     //     background: $u-type-warning; | 
|     //     color: #fff; | 
|     // } | 
|      | 
|     // .u-success { | 
|     //     background: $u-type-success; | 
|     //     color: #fff; | 
|     // } | 
|      | 
|     // .u-black { | 
|     //     background: #585858; | 
|     //     color: #fff; | 
|     // } | 
|      | 
|     .u-info { | 
|         background-color: $u-type-info; | 
|         color: #fff; | 
|     } | 
| </style> |