UI效果图:
实现思路:
循环图片数组,只展示几张宽度就为几张图片+边距的宽度,剩下的图片直接堆叠展示
点击预览的时候传入当前的下标,如果是点击堆叠的话,下标从堆叠数量开始计算
<template>
<!-- 查看图片展示 -->
<view class="image pos-re" :style="imageStyle">
<u-image :width="width" :height="height" :src="formatImgUrl(item)" border-radius="8" :style="imgStyle" class="img" v-for="(item, index) in imagesList" @click="previewImage(0, index,item)"></u-image>
<view class="mask pos-ab" :style="maskStyle" v-if="imagesList.length > 4" @click="previewImage(1, 3)">
<u-icon name="plus" size="28" color="#FFFFFF"></u-icon>
{{imagesList.length+1 - imgNum }}
</view>
</view>
</template>
<script>
export default {
name:"showImage",
props:{
imagesList: {
type: Array,
default: () => {
return []
},
},
width: {
type: [String, Number],
default: 104,
},
height: {
type: [String, Number],
default: 104,
},
// 图片之间的右边距
marginRight: {
type: [String, Number],
default: 10,
},
// 保留照片数
imgNum: {
type: [String, Number],
default: 4,
}
},
data() {
return {
baseFileUrl: process.uniEnv.BASE_FILEURL,
imageStyle: {
'width': '0rpx',
'overflow': 'hidden'
},
imgStyle: {
'margin-right': '0rpx',
},
maskStyle: {
width: '0rpx',
height: '0rpx'
},
}
},
onLoad() {
},
watch: {
imagesList:{
handler(nV,oV){
this.imgStyle.marginRight = this.marginRight + 'rpx';
this.imageStyle.width = (this.width * this.imgNum ) + (this.marginRight * this.imgNum-1) + 'rpx';
this.maskStyle.width = this.width + 'rpx';
this.maskStyle.height = this.height + 'rpx';
this.maskStyle.lineHeight = this.height + 'rpx';
this.maskStyle.right = 0 + 'rpx';
},
immediate: true,
deep: true
}
},
methods: {
formatImgUrl(img) {
if (!img || img == '/static/images/image_noData.png') {
return '/static/images/image_noData.png'
}
let imgs = img.split(',');
return this.baseFileUrl + imgs[0]
},
previewImage(num, index, item) {
let arr = [];
if(this.imagesList.length){
this.imagesList.forEach(item => {
arr.push(this.baseFileUrl + item )
})
}
if(!num) {
uni.previewImage({
current:index,
urls: arr
})
}else{
uni.previewImage({
current: 3,
urls: arr
})
}
}
}
}
</script>
<style lang="scss" scoped>
.image{
display: flex;
.img{
flex-shrink: 0;
}
.mask{
text-align: center;
background: '#1F2533';
border-radius: 8rpx;
opacity: 0.9;
font-size: 28rpx;
color: #FFFFFF;
}
}
</style>
成品展示: