You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
3.9 KiB
147 lines
3.9 KiB
10 months ago
|
<template>
|
||
|
<view :style="computed.rootStyle({ width, height, radius })" :class="'custom-class ' + utils.bem('image', { round })" @tap="onClick">
|
||
|
<image
|
||
|
v-if="!error"
|
||
|
:src="src"
|
||
|
:mode="computed.mode(fit)"
|
||
|
:lazy-load="lazyLoad"
|
||
|
:webp="webp"
|
||
|
class="image-class van-image__img"
|
||
|
:show-menu-by-longpress="showMenuByLongpress"
|
||
|
@load="onLoad"
|
||
|
@error="onError"
|
||
|
/>
|
||
|
|
||
|
<view v-if="loading && showLoading" class="loading-class van-image__loading">
|
||
|
<slot v-if="useLoadingSlot" name="loading" />
|
||
|
<van-icon v-else name="photo" custom-class="van-image__loading-icon" />
|
||
|
</view>
|
||
|
<view v-if="error && showError" class="error-class van-image__error">
|
||
|
<slot v-if="useErrorSlot" name="error" />
|
||
|
<van-icon v-else name="photo-fail" custom-class="van-image__error-icon" />
|
||
|
</view>
|
||
|
</view>
|
||
|
</template>
|
||
|
<script module="utils" lang="wxs" src="@/miniprogram_npm/@vant/weapp/wxs/utils.wxs"></script>
|
||
|
<script module="computed" lang="wxs" src="@/miniprogram_npm/@vant/weapp/image/index.wxs"></script>
|
||
|
<script>
|
||
|
'use strict';
|
||
|
Object.defineProperty(exports, '__esModule', {
|
||
|
value: true
|
||
|
});
|
||
|
var component_1 = require('../common/component');
|
||
|
var button_1 = require('../mixins/button');
|
||
|
export default {
|
||
|
data() {
|
||
|
return {
|
||
|
error: false,
|
||
|
loading: true,
|
||
|
viewStyle: ''
|
||
|
};
|
||
|
},
|
||
|
mixins: [button_1.button],
|
||
|
classes: ['custom-class', 'loading-class', 'error-class', 'image-class'],
|
||
|
props: {
|
||
|
src: {
|
||
|
type: String
|
||
|
},
|
||
|
round: Boolean,
|
||
|
width: null,
|
||
|
height: null,
|
||
|
radius: null,
|
||
|
lazyLoad: Boolean,
|
||
|
useErrorSlot: Boolean,
|
||
|
useLoadingSlot: Boolean,
|
||
|
showMenuByLongpress: Boolean,
|
||
|
fit: {
|
||
|
type: String,
|
||
|
default: 'fill'
|
||
|
},
|
||
|
webp: {
|
||
|
type: Boolean,
|
||
|
default: false
|
||
|
},
|
||
|
showError: {
|
||
|
type: Boolean,
|
||
|
default: true
|
||
|
},
|
||
|
showLoading: {
|
||
|
type: Boolean,
|
||
|
default: true
|
||
|
}
|
||
|
},
|
||
|
methods: {
|
||
|
onLoad: function (event) {
|
||
|
this.setData({
|
||
|
loading: false
|
||
|
});
|
||
|
this.$emit('load', event.detail);
|
||
|
},
|
||
|
onError: function (event) {
|
||
|
this.setData({
|
||
|
loading: false,
|
||
|
error: true
|
||
|
});
|
||
|
this.$emit('error', event.detail);
|
||
|
},
|
||
|
onClick: function (event) {
|
||
|
this.$emit('click', event.detail);
|
||
|
}
|
||
|
},
|
||
|
watch: {
|
||
|
src: {
|
||
|
handler: function () {
|
||
|
this.setData({
|
||
|
error: false,
|
||
|
loading: true
|
||
|
});
|
||
|
},
|
||
|
|
||
|
immediate: true
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
</script>
|
||
|
<style>
|
||
|
@import '../common/index.css';
|
||
|
.van-image {
|
||
|
display: inline-block;
|
||
|
position: relative;
|
||
|
}
|
||
|
.van-image--round {
|
||
|
border-radius: 50%;
|
||
|
overflow: hidden;
|
||
|
}
|
||
|
.van-image--round .van-image__img {
|
||
|
border-radius: inherit;
|
||
|
}
|
||
|
.van-image__error,
|
||
|
.van-image__img,
|
||
|
.van-image__loading {
|
||
|
display: block;
|
||
|
height: 100%;
|
||
|
width: 100%;
|
||
|
}
|
||
|
.van-image__error,
|
||
|
.van-image__loading {
|
||
|
align-items: center;
|
||
|
background-color: var(--image-placeholder-background-color, #f7f8fa);
|
||
|
color: var(--image-placeholder-text-color, #969799);
|
||
|
display: flex;
|
||
|
flex-direction: column;
|
||
|
font-size: var(--image-placeholder-font-size, 14px);
|
||
|
justify-content: center;
|
||
|
left: 0;
|
||
|
position: absolute;
|
||
|
top: 0;
|
||
|
}
|
||
|
.van-image__loading-icon {
|
||
|
color: var(--image-loading-icon-color, #dcdee0);
|
||
|
font-size: var(--image-loading-icon-size, 32px) !important;
|
||
|
}
|
||
|
.van-image__error-icon {
|
||
|
color: var(--image-error-icon-color, #dcdee0);
|
||
|
font-size: var(--image-error-icon-size, 32px) !important;
|
||
|
}
|
||
|
</style>
|