<template> <view @click="onclick" :style="configStyle" class="tm--avatar d-inline-block " :class="[titl ? 'round-2' : 'rounded', text ? '' : `shadow-${color_tmeme}-${shadow}`, customClass]" > <view class="tm--avatar--dot" :class="[dotPos == 'top' ? 'top' : '', dotPos == 'bottom' ? 'bottom' : '']"> <slot name="dot"> <view v-if="dotPos == 'bottom'" style="width: 100%;"><tm-badges :offset="[0, -10]" v-if="dot" :color="dotColor"></tm-badges></view> <tm-badges :offset="[2, -2]" v-if="dot && dotPos == 'top'" :color="dotColor"></tm-badges> </slot> </view> <view class="flex-center overflow text-align-center tm--avatar--conter" :class="[ titl ? `round-${round}` : 'rounded', !label && !src ? color_tmeme : '', label ? color_tmeme : '', black_tmeme ? 'bk' : '', text ? 'text' : '', outlined ? 'outlined' : '', `border-${color_tmeme}-a-${border}` ]" :style="{ width: imgstyle.width, height: imgstyle.height }" > <slot name="default" :src="src"> <image v-if="!label" :class="[titl ? 'round-0' : 'rounded']" :style="{ width: imgstyle.width, height: imgstyle.height }" :src="src"></image> <text v-if="label" :style="{ fontSize: fontsize }">{{ label }}</text> </slot> </view> </view> </template> <script> /** * 头像框 * @property {Number | String} size = [98|80|64] 默认:98,头像的宽高,单位upx * @property {String} color = [primary] 默认:primary,主题背景色 * @property {Number|String} shadow = [] 默认:0,投影 * @property {Number} round = [] 默认:0,圆角,只有在titl下起作用。 * @property {String} label = [] 默认:'',当填入信息时,文本头像,禁用img模式。 * @property {String} font-size = [] 默认:'36',文字大小,单位upx,label时启用。 * @property {String} src = [] 默认:'https://picsum.photos/200',头像图片地址,label时禁用用。 * @property {Boolean} titl = [true|false] 默认:false,开户titl模式即正常的正方形而非圆形。 * @property {Boolean} text = [true|false] 默认:false,文本模式 * @property {Boolean} outlined = [true|false] 默认:false,边框模式 * @property {Boolean} dot = [true|false] 默认:false,显示头像点。建议自行通过slot dot 自行设置。 * @property {String} dot-color = [] 默认:primary,角标颜色 * @property {String} dot-pos = [top|bottom] 默认:top,解析的位置 * @property {Number|String} border = [] 默认:0,边框,边框颜色为你的color颜色 * @property {String | Boolean} black = [true|false] 默认:false,是否开启暗黑模式 * @property {String} custom-class = [] 默认:'',自定义类。 * @property {Function} click 返回:{event,src,label})。 * @example <tm-avatar ></tm-avatar> */ import tmBadges from '@/tm-vuetify/components/tm-badges/tm-badges.vue'; export default { components: { tmBadges }, name: 'tm-avatar', props: { // 头像的宽高upx size: { type: Number | String, default: 98 }, // 主题背景色 color: { type: String, default: 'primary' }, dotColor: { type: String, default: 'red' }, // 自定义类 customClass: { type: String, default: '' }, // 投影 shadow: { type: Number | String, default: 0 }, // 当填入信息时,禁用img模式。 label: { type: String, default: '' }, // 单位upx fontSize: { type: String | Number, default: 36 }, // 注意,只有当label没有填写时才会启用。 src: { type: String, default: 'https://picsum.photos/200' }, // 开户til模式即正常的正方形而非圆形。 titl: { type: Boolean, default: false }, black: { type: Boolean | String, default: null }, round: { type: Number, default: 0 }, text: { type: Boolean, default: false }, outlined: { type: Boolean, default: false }, dot: { type: Boolean, default: false }, dotPos: { type: String, default: 'top' }, border: { type: Number | String, default: 0 }, // 跟随主题色的改变而改变。 fllowTheme: { type: Boolean | String, default: true } }, data() { return { imgstyle: { width: 0, height: 0 }, wkstyle: {} }; }, computed: { fontsize: function() { return uni.upx2px(this.fontSize) + 'px'; }, black_tmeme: function() { if (this.black !== null) return this.black; return this.$tm.vx.state().tmVuetify.black; }, 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; }, configStyle: { get: function() { return this.wkstyle; }, set: function(obj) { this.wkstyle = uni.$tm.objToString(obj); } } }, mounted() { this.imgstyle = { width: uni.upx2px(parseInt(this.size)) + 'px', height: uni.upx2px(parseInt(this.size)) + 'px' }; }, methods: { setConfigStyle(val) { this.configStyle = val; }, onclick(e) { this.$emit('click', { event: e, src: this.src, label: this.label }); } } }; </script> <style lang="scss" scoped> .tm--avatar { position: relative; line-height: 0; vertical-align: middle; .tm--avatar--dot { position: absolute; z-index: 10; width: 100%; &.bottom { bottom: 0upx; } } .tm--avatar--conter { line-height: 0; } } </style>