You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

148 lines
3.4 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!-- 徽章 -->
<template>
<view class="tm--badges fulled">
<view @click.stop="onclick" v-if="icon" class="tm--badges--cm icons flex-center border-white-a-1" :class="[color]" :style="offses+`;width:${iconWidth}rpx;height:${iconWidth}rpx;`">
<view class="d-inline-block flex-center vertical-align-middle" style="transform: scale(0.7); line-height: 0;">
<tm-icons style="line-height: 0;" :size="iconSize" :color="iconColor" dense :name="icon"></tm-icons>
</view>
</view>
<view
@click="onclick"
v-if="!icon"
:style="offses"
class="tm--badges--cm d-inline-block px-6 "
:class="[color_tmeme, label != '' && !dot ? 'num shadow-red-10' : 'dot', 'flex-center']"
>
<text v-if="!dot" class="text-size-xs">{{ label }}</text>
</view>
</view>
</template>
<script>
/**
* 徽章、角标
* @property {String} label = [] 默认:'',当填入信息时即显示数字角标。
* @property {Number} icon-size = [] 默认24当为图标时可以设置图标大小。
* @property {Number} icon-width = [] 默认32当为图标时可以设置宽高。
* @property {String} color = [] 默认red主题背景色
* @property {String} icon-color = [] 默认white图标主题背景色
* @property {Boolean|String} dot = [] 默认true使用点。优先级高于label数字展示。
* @property {String} icon = [] 默认:'',使用图标作为显示角标。
* @property {Array} offset = [] 默认:[0,0],位置,x,y偏移量。
* @property {Funciton} click 点击角标时触发。
* @example <tm-badges />
*/
import tmIcons from '@/tm-vuetify/components/tm-icons/tm-icons.vue';
export default {
components: { tmIcons },
name: 'tm-badges',
props: {
label: {
type: String | Number,
default: 0
},
// 使用点。优先级高于label数字展示。
dot: {
type: Boolean | String,
default: true
},
// 使用图标展示
icon: {
type: String,
default: ''
},
iconSize: {
type: Number|String,
default: 24
},
iconWidth:{
type: Number|String,
default: 32
},
// 主题色名称
color: {
type: String,
default: 'red'
},
// 图标主题色名称
iconColor: {
type: String,
default: 'white'
},
// 位置[0,0]
offset: {
type: Array,
default: () => {
return [0, 0];
}
},
// 跟随主题色的改变而改变。
fllowTheme: {
type: Boolean | String,
default: false
}
},
computed: {
offses: function() {
let p = uni.$tm.objToString({
transform: `translateX(${this.offset[0]}px) translateY(${this.offset[1]}px)`
});
return p;
},
color_tmeme: function() {
if (this.$tm.vx.state().tmVuetify.color !== null && this.$tm.vx.state().tmVuetify.color && this.fllowTheme) {
return this.$tm.vx.state().tmVuetify.color;
}
return this.color;
}
},
data() {
return {};
},
methods: {
onclick(e) {
this.$emit('click', e);
}
}
};
</script>
<style lang="scss" scoped>
.tm--badges {
position: relative;
// pointer-events: none;
display: block;
.tm--badges--cm {
position: absolute;
right: 0;
top: 0;
width: 100%;
&.num {
width: auto;
min-width: 26rpx;
height: 35rpx;
color: #fff;
border-radius: 50rpx;
font-size: 22upx;
line-height: 35upx;
text-align: center;
}
&.icons {
@extend .num;
}
&.dot {
width: 16upx;
height: 16upx;
min-width: 0 !important;
color: #fff;
padding: 0;
border-radius: 50%;
}
}
}
</style>