noticeTip.vue 2.53 KB
<template>
  <view class="notice-tip" @tap="handleClick">
    <view :class="{'icon-container': count > 0, 'icon-container-large-count': count > 99, 'icon-container-large-count-3': count > 9}">
      <uv-icon :name="iconName" :color="iconColor" :size="iconSize" />
      <view
        v-if="count > 0"
        class="badge"
        :class="{ 'large-badge': count > 99, 'large-badge-2': count > 999 ,'large-badge-3': count > 9}"
      >
        <text class="badge-text">{{ displayCount }}</text>
      </view>
    </view>
  </view>
</template>

<script setup>
import { computed } from "vue";

// 定义 props
const props = defineProps({
  // 图标名称
  iconName: {
    type: String,
    default: "bell",
  },
  // 图标颜色
  iconColor: {
    type: String,
    default: "#fff",
  },
  // 图标大小
  iconSize: {
    type: [String, Number],
    default: "24",
  },
  // 通知数量
  count: {
    type: Number,
    default: 0,
  },
  // 最大显示数量,超过显示 999+
  maxCount: {
    type: Number,
    default: 999,
  },
});

// 定义 emits
const emit = defineEmits(["click", "tap"]);

// 计算显示的数量
const displayCount = computed(() => {
  if (props.count <= 0) return "";
  if (props.count > props.maxCount) return `${props.maxCount}+`;
  return props.count.toString();
});

// 处理点击事件
const handleClick = () => {
  emit("click", props.count);
  emit("tap", props.count);
};
</script>

<style lang="scss" scoped>
.notice-tip {
  position: relative;
  display: inline-block;
  cursor: pointer;
}

.icon-container {
  position: relative;
  display: inline-block;
  padding-top: 20rpx;
}

.icon-container-large-count-3 {
  position: relative;
  display: inline-block;
  padding-top: 20rpx;
  padding-right: 10rpx;
}
.icon-container-large-count {
  position: relative;
  display: inline-block;
  padding-top: 20rpx;
  padding-right: 20rpx;
}


.badge {
  position: absolute;
  top: 2rpx;
  right: 0rpx;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 2rpx 6rpx 2rpx;
  background: #ff6772;
  border-radius: 12rpx;
  box-sizing: border-box;
  .badge-text {
    font-weight: 400;
    font-size: 20rpx;
    color: #ffffff;
    line-height: 28rpx;
    text-align: center;
  }
  &.large-badge-3 {
    min-width: 40rpx;
    right: 0rpx;
    .badge-text {
    }
  }
  &.large-badge {
    min-width: 40rpx;
    right: 0rpx;
    .badge-text {
      font-size: 18rpx;
    }
  }
  &.large-badge-2 {
    min-width: 40rpx;
    right: 0rpx;
    // 缩小 避免溢出
    .badge-text {
      font-size: 16rpx;
    }
  }
}

</style>