| ¶Ô±ÈÐÂÎļþ | 
|  |  |  | 
|---|
|  |  |  | <template> | 
|---|
|  |  |  | <view | 
|---|
|  |  |  | class="u-avatar" | 
|---|
|  |  |  | :class="[`u-avatar--${shape}`]" | 
|---|
|  |  |  | :style="[{ | 
|---|
|  |  |  | backgroundColor: (text || icon) ? (randomBgColor ? colors[colorIndex !== '' ? colorIndex : $u.random(0, 19)] : bgColor) : 'transparent', | 
|---|
|  |  |  | width: $u.addUnit(size), | 
|---|
|  |  |  | height: $u.addUnit(size), | 
|---|
|  |  |  | }, $u.addStyle(customStyle)]" | 
|---|
|  |  |  | @tap="clickHandler" | 
|---|
|  |  |  | > | 
|---|
|  |  |  | <slot> | 
|---|
|  |  |  | <!-- #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU  --> | 
|---|
|  |  |  | <open-data | 
|---|
|  |  |  | v-if="mpAvatar && allowMp" | 
|---|
|  |  |  | type="userAvatarUrl" | 
|---|
|  |  |  | :style="[{ | 
|---|
|  |  |  | width: $u.addUnit(size), | 
|---|
|  |  |  | height: $u.addUnit(size) | 
|---|
|  |  |  | }]" | 
|---|
|  |  |  | /> | 
|---|
|  |  |  | <!-- #endif --> | 
|---|
|  |  |  | <!-- #ifndef MP-WEIXIN && MP-QQ && MP-BAIDU  --> | 
|---|
|  |  |  | <template v-if="mpAvatar && allowMp"></template> | 
|---|
|  |  |  | <!-- #endif --> | 
|---|
|  |  |  | <u-icon | 
|---|
|  |  |  | v-else-if="icon" | 
|---|
|  |  |  | :name="icon" | 
|---|
|  |  |  | :size="fontSize" | 
|---|
|  |  |  | :color="color" | 
|---|
|  |  |  | ></u-icon> | 
|---|
|  |  |  | <u--text | 
|---|
|  |  |  | v-else-if="text" | 
|---|
|  |  |  | :text="text" | 
|---|
|  |  |  | :size="fontSize" | 
|---|
|  |  |  | :color="color" | 
|---|
|  |  |  | align="center" | 
|---|
|  |  |  | customStyle="justify-content: center" | 
|---|
|  |  |  | ></u--text> | 
|---|
|  |  |  | <image | 
|---|
|  |  |  | class="u-avatar__image" | 
|---|
|  |  |  | v-else | 
|---|
|  |  |  | :class="[`u-avatar__image--${shape}`]" | 
|---|
|  |  |  | :src="avatarUrl || defaultUrl" | 
|---|
|  |  |  | :mode="mode" | 
|---|
|  |  |  | @error="errorHandler" | 
|---|
|  |  |  | :style="[{ | 
|---|
|  |  |  | width: $u.addUnit(size), | 
|---|
|  |  |  | height: $u.addUnit(size) | 
|---|
|  |  |  | }]" | 
|---|
|  |  |  | ></image> | 
|---|
|  |  |  | </slot> | 
|---|
|  |  |  | </view> | 
|---|
|  |  |  | </template> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <script> | 
|---|
|  |  |  | import props from './props.js'; | 
|---|
|  |  |  | const base64Avatar = | 
|---|
|  |  |  | "data:image/jpg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA8AAD/4QMraHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNrZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/PiA8eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9iZSBYTVAgQ29yZSA1LjMtYzAxMSA2Ni4xNDU2NjEsIDIwMTIvMDIvMDYtMTQ6NTY6MjcgICAgICAgICI+IDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+IDxyZGY6RGVzY3JpcHRpb24gcmRmOmFib3V0PSIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bXA6Q3JlYXRvclRvb2w9IkFkb2JlIFBob3Rvc2hvcCBDUzYgKFdpbmRvd3MpIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjREMEQwRkY0RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjREMEQwRkY1RjgwNDExRUE5OTY2RDgxODY3NkJFODMxIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6NEQwRDBGRjJGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6NEQwRDBGRjNGODA0MTFFQTk5NjZEODE4Njc2QkU4MzEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz7/7gAOQWRvYmUAZMAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYG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"; | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * Avatar  å¤´å | 
|---|
|  |  |  | * @description æ¬ç»ä»¶ä¸è¬ç¨äºå±ç¤ºå¤´åçå°æ¹ï¼å¦ä¸ªäººä¸å¿ï¼æè
è¯è®ºå表页çç¨æ·å¤´åå±ç¤ºçåºæã | 
|---|
|  |  |  | * @tutorial https://www.uviewui.com/components/avatar.html | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @property {String}         src            å¤´åè·¯å¾ï¼å¦å è½½å¤±è´¥ï¼å°ä¼æ¾ç¤ºé»è®¤å¤´å(ä¸è½ä¸ºç¸å¯¹è·¯å¾) | 
|---|
|  |  |  | * @property {String}         shape         å¤´å形綠 ï¼ circle (é»è®¤) | squareï¼ | 
|---|
|  |  |  | * @property {String | Number}   size         å¤´å尺寸ï¼å¯ä»¥ä¸ºæå®å符串(large, default, mini)ï¼æè
æ°å¼ ï¼é»è®¤ 40 ï¼ | 
|---|
|  |  |  | * @property {String}         mode         å¤´åå¾ççè£åªç±»åï¼ä¸uniçimageç»ä»¶çmodeåæ°ä¸è´ï¼å¦ææè¾¾ä¸å°éæ±ï¼å¯å°è¯ä¼ widthFixå¼ ï¼é»è®¤ 'scaleToFill' ï¼ | 
|---|
|  |  |  | * @property {String}         text         ç¨æåæ¿ä»£å¾çï¼çº§å«ä¼å
äºsrc | 
|---|
|  |  |  | * @property {String}         bgColor         èæ¯é¢è²ï¼ä¸è¬æ¾ç¤ºæåæ¶ç¨ ï¼é»è®¤ '#c0c4cc' ï¼ | 
|---|
|  |  |  | * @property {String}         color         æåé¢è² ï¼é»è®¤ '#ffffff' ï¼ | 
|---|
|  |  |  | * @property {String | Number}   fontSize      æå大尠 ï¼é»è®¤ 18 ï¼ | 
|---|
|  |  |  | * @property {String}         icon         æ¾ç¤ºç徿  | 
|---|
|  |  |  | * @property {Boolean}         mpAvatar      æ¾ç¤ºå°ç¨åºå¤´åï¼åªå¯¹ç¾åº¦ï¼å¾®ä¿¡ï¼QQå°ç¨åºææ  ï¼é»è®¤ false ï¼ | 
|---|
|  |  |  | * @property {Boolean}         randomBgColor   æ¯å¦ä½¿ç¨éæºèæ¯è²  ï¼é»è®¤ false ï¼ | 
|---|
|  |  |  | * @property {String}         defaultUrl      å è½½å¤±è´¥çé»è®¤å¤´å(ç»ä»¶æå
ç½®é»è®¤å¾ç) | 
|---|
|  |  |  | * @property {String | Number}   colorIndex      å¦æé
ç½®äºrandomBgColor为trueï¼ä¸é
ç½®äºæ¤å¼ï¼åä»é»è®¤çèæ¯è²æ°ç»ä¸ååºå¯¹åºç´¢å¼çé¢è²å¼ï¼åå¼0-19ä¹é´ | 
|---|
|  |  |  | * @property {String}         name         ç»ä»¶æ è¯ç¬¦  ï¼é»è®¤ 'level' ï¼ | 
|---|
|  |  |  | * @property {Object}         customStyle      å®ä¹éè¦ç¨å°çå¤é¨æ ·å¼ | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @event    {Function}        click       ç¹å»ç»ä»¶æ¶è§¦å   index: ç¨æ·ä¼ éçæ è¯ç¬¦ | 
|---|
|  |  |  | * @example  <u-avatar :src="src" mode="square"></u-avatar> | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | export default { | 
|---|
|  |  |  | name: 'u-avatar', | 
|---|
|  |  |  | mixins: [uni.$u.mpMixin, uni.$u.mixin, props], | 
|---|
|  |  |  | data() { | 
|---|
|  |  |  | return { | 
|---|
|  |  |  | // å¦æé
ç½®randomBgColoråæ°ä¸ºtrueï¼å¨å¾æ æè
æåçæ¨¡å¼ä¸ï¼ä¼éæºä»ä¸ååºä¸ä¸ªé¢è²å¼å½åèæ¯è² | 
|---|
|  |  |  | colors: ['#ffb34b', '#f2bba9', '#f7a196', '#f18080', '#88a867', '#bfbf39', '#89c152', '#94d554', '#f19ec2', | 
|---|
|  |  |  | '#afaae4', '#e1b0df', '#c38cc1', '#72dcdc', '#9acdcb', '#77b1cc', '#448aca', '#86cefa', '#98d1ee', | 
|---|
|  |  |  | '#73d1f1', | 
|---|
|  |  |  | '#80a7dc' | 
|---|
|  |  |  | ], | 
|---|
|  |  |  | avatarUrl: this.src, | 
|---|
|  |  |  | allowMp: false | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | watch: { | 
|---|
|  |  |  | // çå¬å¤´åsrcçååï¼èµå¼ç»å
é¨çavatarUrlåéï¼å ä¸ºå¾çå è½½å¤±è´¥æ¶ï¼éè¦ä¿®æ¹å¾ççsrc为é»è®¤å¼ | 
|---|
|  |  |  | // èç»ä»¶å
é¨ä¸è½ç´æ¥ä¿®æ¹propsçå¼ï¼æä»¥éè¦ä¸ä¸ªä¸é´åé | 
|---|
|  |  |  | src: { | 
|---|
|  |  |  | immediate: true, | 
|---|
|  |  |  | handler(newVal) { | 
|---|
|  |  |  | this.avatarUrl = newVal | 
|---|
|  |  |  | // å¦ææ²¡æä¼ srcï¼å主å¨è§¦åerroräºä»¶ï¼ç¨äºæ¾ç¤ºé»è®¤ç头åï¼å¦åsrc为''空å符ççæ¶åï¼ä¼æ å
容å±ç¤º | 
|---|
|  |  |  | if(!newVal) { | 
|---|
|  |  |  | this.errorHandler() | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | computed: { | 
|---|
|  |  |  | imageStyle() { | 
|---|
|  |  |  | const style = {} | 
|---|
|  |  |  | return style | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | created() { | 
|---|
|  |  |  | this.init() | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | methods: { | 
|---|
|  |  |  | init() { | 
|---|
|  |  |  | // ç®ååªæè¿å ä¸ªå°ç¨åºå¹³å°å
·æopen-dataæ ç¾ | 
|---|
|  |  |  | // å
¶ä»å¹³å°å¯ä»¥éè¿uni.getUserInfo类似æ¥å£è·åä¿¡æ¯ï¼ä½æ¯éè¦å¼¹çªææ(馿¬¡)ï¼ä¸å符ç»ä»¶é»è¾ | 
|---|
|  |  |  | // æ
ç®åèªå¨è·åå°ç¨åºå¤´ååªæ¯æè¿å ä¸ªå¹³å° | 
|---|
|  |  |  | // #ifdef MP-WEIXIN || MP-QQ || MP-BAIDU | 
|---|
|  |  |  | this.allowMp = true | 
|---|
|  |  |  | // #endif | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // å¤æä¼ å
¥çname屿§ï¼æ¯å¦å¾çè·¯å¾ï¼åªè¦å¸¦æ"/"å认为æ¯å¾çå½¢å¼ | 
|---|
|  |  |  | isImg() { | 
|---|
|  |  |  | return this.src.indexOf('/') !== -1 | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | // å¾çå è½½æ¶å¤±è´¥æ¶è§¦å | 
|---|
|  |  |  | errorHandler() { | 
|---|
|  |  |  | this.avatarUrl = this.defaultUrl || base64Avatar | 
|---|
|  |  |  | }, | 
|---|
|  |  |  | clickHandler() { | 
|---|
|  |  |  | this.$emit('click', this.name) | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </script> | 
|---|
|  |  |  |  | 
|---|
|  |  |  | <style lang="scss" scoped> | 
|---|
|  |  |  | @import "../../libs/css/components.scss"; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | .u-avatar { | 
|---|
|  |  |  | @include flex; | 
|---|
|  |  |  | align-items: center; | 
|---|
|  |  |  | justify-content: center; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | &--circle { | 
|---|
|  |  |  | border-radius: 100px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | &--square { | 
|---|
|  |  |  | border-radius: 4px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | &__image { | 
|---|
|  |  |  | &--circle { | 
|---|
|  |  |  | border-radius: 100px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | &--square { | 
|---|
|  |  |  | border-radius: 4px; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | </style> | 
|---|