|
|
<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>
|