| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- <template>
- <view class="">
- <view v-if="loadStatus == 'loading'" class="img-loading" :style="[imgStyle, loadStyle]">
- <!-- <text class="img-load-icon iconfont icon-loading"></text>
- <text class="img-load-text">{{ loadText }}</text> -->
- <image :src="loadingImgSrc" :style="[imgStyle]" mode="aspectFit"></image>
- </view>
- <view v-if="loadStatus == 'error'" class="img-error" :style="[imgStyle, loadErrStyle]">
- <text class="img-err-icon iconfont icon-exclamation-circle"></text>
- <text class="img-load-text">{{ loadErrText }}</text>
- </view>
- <image
- v-show="loadStatus == 'success'"
- :src="src"
- @load="fnOnLoad"
- @error="fnOnError"
- :lazy-load="lazyLoad"
- :style="[imgStyle]"
- :mode="mode"
- @click="$emit('on-click', url)"
- ></image>
- </view>
- </template>
- <script>
- import imageCache from '@/utils/imageCache.js';
- export default {
- name: 'cache-image',
- props: {
- url: {
- type: String,
- default: ''
- },
- lazyLoad: {
- type: Boolean,
- default: true
- },
- loadStyle: {
- type: Object,
- default() {
- return {
- backgroundColor: '#ffffff',
- color: '#333'
- };
- }
- },
- loadErrStyle: {
- type: Object,
- default() {
- return {
- color: 'rgba(244, 67, 54,1)'
- // backgroundColor: 'rgba(244, 67, 54,0.2)'
- };
- }
- },
- mode: {
- type: String,
- default: 'aspectFill'
- },
- loadText: {
- type: String,
- default: '加载中...'
- },
- loadErrText: {
- type: String,
- default: '加载失败'
- },
- fileMd5: {
- type: String,
- default: ''
- },
- styles: {
- type: Object,
- default() {
- return {};
- }
- },
- width: {
- type: String,
- default: '100%'
- },
- height: {
- type: String,
- default: '100%'
- },
- radius: {
- type: String,
- default: ''
- }
- },
- data() {
- return {
- imgStyle: {},
- src: '', // 图片地址
- loadStatus: 'loading'
- };
- },
- computed: {
- loadingImgSrc() {
- return getApp().globalData.loadingGifUrl;
- }
- },
- watch: {
- // 监听图片md5值的变化
- fileMd5(val) {
- // 查找获取图片缓存
- this.fnGetImageCache();
- }
- },
- created() {
- this.imgStyle = {
- width: this.width,
- height: this.height,
- borderRadius: this.radius,
- ...this.styles
- };
- // 查找获取图片缓存
- this.fnGetImageCache();
- },
- methods: {
- // 查找获取图片缓存
- async fnGetImageCache() {
- // #ifdef APP-PLUS
- var result = await imageCache.getImageCache(this.url, this.fileMd5);
- if (result) {
- this.src = result;
- } else {
- this.src = this.url;
- }
- // #endif
- // #ifndef APP-PLUS
- this.src = this.url;
- // #endif
- },
- fnOnLoad() {
- this.loadStatus = 'success';
- },
- fnOnError() {
- this.loadStatus = 'error';
- }
- }
- };
- </script>
- <style scoped lang="scss">
- .img-loading,
- .img-error {
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: center;
- box-sizing: border-box;
- background-color: #f2f2f2;
- }
- .img-load-icon {
- font-size: 36rpx;
- animation: xhRote 0.8s infinite linear;
- }
- .img-load-text {
- font-size: 28rpx;
- margin-top: 8rpx;
- color: inherit;
- }
- .img-error {
- font-size: 28rpx;
- }
- .img-err-icon {
- font-size: 36rpx;
- }
- @keyframes xhRote {
- 0% {
- transform: rotate(0deg);
- }
- 100% {
- transform: rotate(360deg);
- }
- }
- </style>
|