1
0
miroir de https://github.com/ialley-workshop-open/uni-halo.git synchronisé 2026-06-12 21:29:31 +08:00
Fichiers
uni-halo/tm-vuetify/components/tm-avatar/tm-avatar.vue
T
2022-12-06 15:08:29 +08:00

205 lignes
5.3 KiB
Vue
Brut Annotations Historique

Ce fichier contient des caractères Unicode ambigus.
Ce fichier contient des caractères Unicode qui peuvent être confondus avec d'autres caractères. Si vous pensez que c'est intentionnel, vous pouvez ignorer cet avertissement. Utilisez le bouton Échappe pour les dévoiler.
<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',文字大小,单位upxlabel时启用。
* @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>