Skip to content

Commit 7464d8a

Browse files
committed
feat(imgUpload): 支持固定数量多选, 修复多选时设置图像数据错误
1 parent bab8c56 commit 7464d8a

1 file changed

Lines changed: 52 additions & 36 deletions

File tree

src/components/base/upload-imgs/index.vue

Lines changed: 52 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,30 @@
3838
-->
3939

4040
<template>
41-
<div class="imgs-upload-container" v-loading="loading">
41+
<div class="upload-imgs-container" v-loading="loading">
4242
<template v-for="(item, i) in itemList">
4343
<template v-if="item.display">
44-
<div class="thumb-item" :key="item.id" :style="boxStyle" v-loading="item.loading">
44+
<div
45+
class="thumb-item"
46+
:key="item.id"
47+
:style="boxStyle"
48+
v-loading="item.loading">
4549
<el-image
4650
class="thumb-item-img"
4751
:src="item.display"
4852
:fit="fit"
4953
style="width: 100%; height: 100%;"></el-image>
5054
<div class="control">
51-
<i v-if="!disabled" class="el-icon-close del" @click.prevent.stop="delItem(item.id)" title="删除"></i>
52-
<div v-if="!disabled" class="preview" title="更换图片" @click.prevent.stop="handleClick(item.id)">
55+
<i
56+
v-if="!disabled"
57+
class="el-icon-close del"
58+
@click.prevent.stop="delItem(item.id)"
59+
title="删除"></i>
60+
<div
61+
v-if="!disabled"
62+
class="preview"
63+
title="更换图片"
64+
@click.prevent.stop="handleClick(item.id)">
5365
<i class="el-icon-edit"></i>
5466
</div>
5567
<div class="control-bottom" v-if="sortable || preview">
@@ -89,11 +101,11 @@
89101
</template>
90102
</template>
91103
<input
92-
class="item__input"
104+
class="upload-imgs__input"
93105
type="file"
94106
ref="input"
95107
@change="handleChange"
96-
:multiple="!isStable && multiple"
108+
:multiple="multiple"
97109
:accept="accept" />
98110
</div>
99111
</template>
@@ -111,7 +123,7 @@ function createId() {
111123
* 创建项, 如不传入参数则创建空项
112124
* @returns {Item}
113125
*/
114-
function createItem(data = null, oldData = null) {
126+
function createItem(data = null, oldData = {}) {
115127
let item = {
116128
loading: false,
117129
id: createId(),
@@ -487,9 +499,10 @@ export default {
487499
}
488500
// 释放内存
489501
window.URL.revokeObjectURL(blobUrl)
502+
this.initAll(this.itemList)
490503
},
491504
/**
492-
* 预览图像, 后续预览组件制作后替换
505+
* 预览图像
493506
*/
494507
previewImg(data, index) {
495508
const images = []
@@ -498,13 +511,16 @@ export default {
498511
images.push(element.src)
499512
}
500513
})
501-
this.$imagePreview({
502-
images,
503-
index,
504-
})
505-
// this.$confirm(`<img src="${data.display}" style="width: 100%; height: 100%" />`, '预览', {
506-
// dangerouslyUseHTMLString: true,
507-
// })
514+
if (this.$imagePreview) {
515+
this.$imagePreview({
516+
images,
517+
index,
518+
})
519+
} else {
520+
this.$confirm(`<img src="${data.display}" style="width: 100%; height: 100%" />`, '预览', {
521+
dangerouslyUseHTMLString: true,
522+
})
523+
}
508524
},
509525
/**
510526
* 移动图像位置
@@ -627,6 +643,7 @@ export default {
627643
}
628644
try {
629645
imgInfoList = await Promise.all(asyncList)
646+
console.log(imgInfoList)
630647
// 设置图片信息
631648
await this.setImgInfo(imgInfoList, currentId)
632649
} catch (err) {
@@ -643,7 +660,7 @@ export default {
643660
* 用户选择图片, 图片通过验证后设置图像数据
644661
*/
645662
async setImgInfo(imgInfoList = [], currentId) {
646-
const { max } = this
663+
const { max, itemList } = this
647664
// 找到特定图像位置
648665
const index = this.itemList.findIndex(item => (item.id === currentId))
649666
// 释放内存
@@ -653,12 +670,24 @@ export default {
653670
// 追加图片
654671
// 最大图片数量限制
655672
let l = imgInfoList.length
656-
if (max && l > max) {
657-
l = max
658-
}
659-
for (let i = 1; i < l; i += 1) {
660-
this.itemList.push(createItem(imgInfoList[i]))
673+
if (this.isStable) {
674+
// 固定数量模式, 按次序插入空项
675+
for (let i = 0, k = 1; (i < max || k < l); i += 1) {
676+
if (itemList[i].status === 'input') {
677+
this.itemList[i] = createItem(imgInfoList[k])
678+
k += 1
679+
}
680+
}
681+
} else {
682+
const empty = max - itemList.length + 1
683+
if (max && l > empty) {
684+
l = empty
685+
}
686+
for (let i = 1; i < l; i += 1) {
687+
this.itemList.push(createItem(imgInfoList[i]))
688+
}
661689
}
690+
662691
// 初始化图片
663692
this.initAll(this.itemList)
664693
},
@@ -716,24 +745,12 @@ export default {
716745
}
717746
this.itemList = result
718747
},
719-
/**
720-
* TODO: 预览初始化方法
721-
*/
722-
initPreview() {
723-
// 清除预览实例
724-
if (!this.preview) {
725-
return
726-
}
727-
// 初始化新预览实例
728-
console.log('图像预览功能等待上线')
729-
},
730748
/**
731749
* 初始化
732750
* @param {object} val 初始化数据
733751
*/
734752
initAll(val) {
735753
this.initItemList(val)
736-
this.initPreview()
737754
},
738755
/**
739756
* 获取图像信息
@@ -771,7 +788,7 @@ export default {
771788
</script>
772789

773790
<style lang="scss" scoped>
774-
.imgs-upload-container {
791+
.upload-imgs-container {
775792
display: flex;
776793
flex-wrap: wrap;
777794
@@ -886,7 +903,6 @@ export default {
886903
887904
.del {
888905
opacity: 1;
889-
890906
}
891907
892908
.control-bottom {
@@ -895,7 +911,7 @@ export default {
895911
}
896912
}
897913
898-
.item__input {
914+
.upload-imgs__input {
899915
display: none;
900916
}
901917
}

0 commit comments

Comments
 (0)