¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <u-transition |
| | | mode="fade" |
| | | :show="show" |
| | | :duration="fade ? 1000 : 0" |
| | | > |
| | | <view |
| | | class="u-image" |
| | | @tap="onClick" |
| | | :style="[wrapStyle, backgroundStyle]" |
| | | > |
| | | <image |
| | | v-if="!isError" |
| | | :src="src" |
| | | :mode="mode" |
| | | @error="onErrorHandler" |
| | | @load="onLoadHandler" |
| | | :show-menu-by-longpress="showMenuByLongpress" |
| | | :lazy-load="lazyLoad" |
| | | class="u-image__image" |
| | | :style="{ |
| | | borderRadius: shape == 'circle' ? '10000px' : $u.addUnit(radius), |
| | | width: $u.addUnit(width), |
| | | height: $u.addUnit(height) |
| | | }" |
| | | ></image> |
| | | <view |
| | | v-if="showLoading && loading" |
| | | class="u-image__loading" |
| | | :style="{ |
| | | borderRadius: shape == 'circle' ? '50%' : $u.addUnit(radius), |
| | | backgroundColor: this.bgColor, |
| | | width: $u.addUnit(width), |
| | | height: $u.addUnit(height) |
| | | }" |
| | | > |
| | | <slot name="loading"> |
| | | <u-icon |
| | | :name="loadingIcon" |
| | | :width="width" |
| | | :height="height" |
| | | ></u-icon> |
| | | </slot> |
| | | </view> |
| | | <view |
| | | v-if="showError && isError && !loading" |
| | | class="u-image__error" |
| | | :style="{ |
| | | borderRadius: shape == 'circle' ? '50%' : $u.addUnit(radius), |
| | | width: $u.addUnit(width), |
| | | height: $u.addUnit(height) |
| | | }" |
| | | > |
| | | <slot name="error"> |
| | | <u-icon |
| | | :name="errorIcon" |
| | | :width="width" |
| | | :height="height" |
| | | ></u-icon> |
| | | </slot> |
| | | </view> |
| | | </view> |
| | | </u-transition> |
| | | </template> |
| | | |
| | | <script> |
| | | import props from './props.js'; |
| | | /** |
| | | * Image å¾ç |
| | | * @description æ¤ç»ä»¶ä¸ºuni-appçimageç»ä»¶çå 强çï¼å¨ç»§æ¿äºåæåè½å¤ï¼è¿æ¯ææ·¡å
¥å¨ç»ãå è½½ä¸ãå 载失败æç¤ºãåè§å¼åå½¢ç¶çã |
| | | * @tutorial https://uviewui.com/components/image.html |
| | | * @property {String} src å¾çå°å |
| | | * @property {String} mode è£åªæ¨¡å¼ï¼è§å®ç½è¯´æ ï¼é»è®¤ 'aspectFill' ï¼ |
| | | * @property {String | Number} width 宽度ï¼åä½ä»»æï¼å¦æä¸ºæ°å¼ï¼å为pxåä½ ï¼é»è®¤ '300' ï¼ |
| | | * @property {String | Number} height é«åº¦ï¼åä½ä»»æï¼å¦æä¸ºæ°å¼ï¼å为pxåä½ ï¼é»è®¤ '225' ï¼ |
| | | * @property {String} shape å¾çå½¢ç¶ï¼circle-åå½¢ï¼square-æ¹å½¢ ï¼é»è®¤ 'square' ï¼ |
| | | * @property {String | Number} radius åè§å¼ï¼åä½ä»»æï¼å¦æä¸ºæ°å¼ï¼å为pxåä½ ï¼é»è®¤ 0 ï¼ |
| | | * @property {Boolean} lazyLoad æ¯å¦æå è½½ï¼ä»
微信å°ç¨åºãAppãç¾åº¦å°ç¨åºãåèè·³å¨å°ç¨åºææ ï¼é»è®¤ true ï¼ |
| | | * @property {Boolean} showMenuByLongpress æ¯å¦å¼å¯é¿æå¾çæ¾ç¤ºè¯å«å°ç¨åºç èåï¼ä»
微信å°ç¨åºææ ï¼é»è®¤ true ï¼ |
| | | * @property {String} loadingIcon å è½½ä¸ç徿 ï¼æè
å°å¾ç ï¼é»è®¤ 'photo' ï¼ |
| | | * @property {String} errorIcon å 载失败ç徿 ï¼æè
å°å¾ç ï¼é»è®¤ 'error-circle' ï¼ |
| | | * @property {Boolean} showLoading æ¯å¦æ¾ç¤ºå è½½ä¸ç徿 æè
èªå®ä¹çslot ï¼é»è®¤ true ï¼ |
| | | * @property {Boolean} showError æ¯å¦æ¾ç¤ºå è½½é误ç徿 æè
èªå®ä¹çslot ï¼é»è®¤ true ï¼ |
| | | * @property {Boolean} fade æ¯å¦éè¦æ·¡å
¥ææ ï¼é»è®¤ true ï¼ |
| | | * @property {Boolean} webp åªæ¯æç½ç»èµæºï¼åªå¯¹å¾®ä¿¡å°ç¨åºææ ï¼é»è®¤ false ï¼ |
| | | * @property {String | Number} duration æé
fadeåæ°çè¿æ¸¡æ¶é´ï¼åä½ms ï¼é»è®¤ 500 ï¼ |
| | | * @property {String} bgColor èæ¯é¢è²ï¼ç¨äºæ·±è²é¡µé¢å è½½å¾çæ¶ï¼ä¸ºäºåèæ¯è²èå (é»è®¤ '#f3f4f6' ) |
| | | * @property {Object} customStyle å®ä¹éè¦ç¨å°çå¤é¨æ ·å¼ |
| | | * @event {Function} click ç¹å»å¾çæ¶è§¦å |
| | | * @event {Function} error å¾çå 载失败æ¶è§¦å |
| | | * @event {Function} load å¾çå è½½æåæ¶è§¦å |
| | | * @example <u-image width="100%" height="300px" :src="src"></u-image> |
| | | */ |
| | | export default { |
| | | name: 'u-image', |
| | | mixins: [uni.$u.mpMixin, uni.$u.mixin, props], |
| | | data() { |
| | | return { |
| | | // å¾çæ¯å¦å è½½é误ï¼å¦ææ¯ï¼åæ¾ç¤ºé误å ä½å¾ |
| | | isError: false, |
| | | // åå§åç»ä»¶æ¶ï¼é»è®¤ä¸ºå è½½ä¸ç¶æ |
| | | loading: true, |
| | | // ä¸éæåº¦ï¼ä¸ºäºå®ç°æ·¡å
¥æ·¡åºçææ |
| | | opacity: 1, |
| | | // è¿æ¸¡æ¶é´ï¼å 为propsç弿 æ³ä¿®æ¹ï¼æ
éè¦ä¸ä¸ªä¸é´å¼ |
| | | durationTime: this.duration, |
| | | // å¾çå è½½å®ææ¶ï¼å»æèæ¯é¢è²ï¼å ä¸ºå¦ææ¯pngå¾çï¼å°±ä¼æ¾ç¤ºç°è²çèæ¯ |
| | | backgroundStyle: {}, |
| | | // ç¨äºfade模å¼çæ§å¶ç»ä»¶æ¾ç¤ºä¸å¦ |
| | | show: false |
| | | }; |
| | | }, |
| | | watch: { |
| | | src: { |
| | | immediate: true, |
| | | handler(n) { |
| | | if (!n) { |
| | | // å¦æä¼ å
¥nullæè
''ï¼æè
falseï¼æè
undefinedï¼æ 记为éè¯¯ç¶æ |
| | | this.isError = true |
| | | |
| | | } else { |
| | | this.isError = false; |
| | | this.loading = true; |
| | | } |
| | | } |
| | | } |
| | | }, |
| | | computed: { |
| | | wrapStyle() { |
| | | let style = {}; |
| | | // éè¿è°ç¨addUnit()æ¹æ³ï¼å¦ææåä½ï¼å¦ç¾åæ¯ï¼pxåä½çï¼ç´æ¥è¿åï¼å¦ææ¯çº¯ç²¹çæ°å¼ï¼åå ä¸rpxåä½ |
| | | style.width = this.$u.addUnit(this.width); |
| | | style.height = this.$u.addUnit(this.height); |
| | | // å¦ææ¯æ¾ç¤ºåå½¢ï¼è®¾ç½®ä¸ä¸ªå¾å¤çåå¾å¼å³å¯ |
| | | style.borderRadius = this.shape == 'circle' ? '10000px' : uni.$u.addUnit(this.radius) |
| | | // å¦æè®¾ç½®åè§ï¼å¿
é¡»è¦æhiddenï¼å¦åå¯è½åè§æ æ |
| | | style.overflow = this.borderRadius > 0 ? 'hidden' : 'visible' |
| | | // if (this.fade) { |
| | | // style.opacity = this.opacity |
| | | // // nvueä¸ï¼è¿å ä¸ªå±æ§å¿
é¡»è¦åå¼å |
| | | // style.transitionDuration = `${this.durationTime}ms` |
| | | // style.transitionTimingFunction = 'ease-in-out' |
| | | // style.transitionProperty = 'opacity' |
| | | // } |
| | | return uni.$u.deepMerge(style, uni.$u.addStyle(this.customStyle)); |
| | | |
| | | } |
| | | }, |
| | | mounted() { |
| | | this.show = true |
| | | }, |
| | | methods: { |
| | | // ç¹å»å¾ç |
| | | onClick() { |
| | | this.$emit('click') |
| | | }, |
| | | // å¾çå 载失败 |
| | | onErrorHandler(err) { |
| | | this.loading = false |
| | | this.isError = true |
| | | this.$emit('error', err) |
| | | }, |
| | | // å¾çå è½½å®æï¼æ è®°loadingç»æ |
| | | onLoadHandler(event) { |
| | | this.loading = false |
| | | this.isError = false |
| | | this.$emit('load', event) |
| | | this.removeBgColor() |
| | | // 妿ä¸éè¦å¨ç»ææï¼å°±ä¸æ§è¡ä¸æ¹ä»£ç ï¼åæ¶ç§»é¤å è½½æ¶çèæ¯é¢è² |
| | | // å¦åæ éfadeæææ¶ï¼pngå¾çä¾ç¶è½çå°ä¸æ¹çèæ¯è² |
| | | // if (!this.fade) return this.removeBgColor(); |
| | | // // 忥opacity为1(ä¸éæï¼æ¯ä¸ºäºæ¾ç¤ºå ä½å¾)ï¼æ¹æ0(éæï¼æå³ç该å
ç´ æ¾ç¤ºçæ¯èæ¯é¢è²ï¼é»è®¤çç°è²)ï¼åæ¹æ1ï¼æ¯ä¸ºäºè·å¾è¿æ¸¡ææ |
| | | // this.opacity = 0; |
| | | // // è¿é设置为0ï¼æ¯ä¸ºäºå¾çå±ç¤ºå°èæ¯å
¨éæè¿ä¸ªè¿ç¨æ¶é´ä¸º0ï¼å»¶æ¶ä¹åå»¶æ¶ä¹åéæ°è®¾ç½®ä¸ºdurationï¼æ¯ä¸ºäºè·å¾èæ¯éæ(ç°è²) |
| | | // // å°å¾çå±ç¤ºçè¿ç¨ä¸çæ·¡å
¥ææ |
| | | // this.durationTime = 0; |
| | | // // å»¶æ¶50msï¼å¦å卿µè§å¨H5ï¼è¿æ¸¡æææ æ |
| | | // setTimeout(() => { |
| | | // this.durationTime = this.duration; |
| | | // this.opacity = 1; |
| | | // setTimeout(() => { |
| | | // this.removeBgColor(); |
| | | // }, this.durationTime); |
| | | // }, 50); |
| | | }, |
| | | // ç§»é¤å¾ççèæ¯è² |
| | | removeBgColor() { |
| | | // æ·¡å
¥å¨ç»è¿æ¸¡å®æåï¼å°èæ¯è®¾ç½®ä¸ºéæè²ï¼å¦åpngå¾çä¼çå°ç°è²çèæ¯ |
| | | this.backgroundStyle = { |
| | | backgroundColor: 'transparent' |
| | | }; |
| | | } |
| | | } |
| | | }; |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @import '../../libs/css/components.scss'; |
| | | |
| | | $u-image-error-top:0px !default; |
| | | $u-image-error-left:0px !default; |
| | | $u-image-error-width:100% !default; |
| | | $u-image-error-hight:100% !default; |
| | | $u-image-error-background-color:$u-bg-color !default; |
| | | $u-image-error-color:$u-tips-color !default; |
| | | $u-image-error-font-size: 46rpx !default; |
| | | |
| | | .u-image { |
| | | position: relative; |
| | | transition: opacity 0.5s ease-in-out; |
| | | |
| | | &__image { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | |
| | | &__loading, |
| | | &__error { |
| | | position: absolute; |
| | | top: $u-image-error-top; |
| | | left: $u-image-error-left; |
| | | width: $u-image-error-width; |
| | | height: $u-image-error-hight; |
| | | @include flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | background-color: $u-image-error-background-color; |
| | | color: $u-image-error-color; |
| | | font-size: $u-image-error-font-size; |
| | | } |
| | | } |
| | | </style> |