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