diff --git a/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue b/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue index 5e32267..b089b34 100644 --- a/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue +++ b/src/components/form-designer/form-widget/field-widget/picture-upload-widget.vue @@ -10,23 +10,46 @@ list-type="picture-card" :class="{'hideUploadDiv': uploadBtnHidden}" :limit="field.options.limit" :on-exceed="handlePictureExceed" :on-preview="handlePicturePreview" :before-upload="beforePictureUpload" - :on-success="handlePictureUpload" :on-error="handleUploadError" - :before-remove="handleBeforeRemove" :on-remove="handlePictureRemove"> + :on-preview="handlePictureCardPreview" + :on-success="handlePictureUpload" :on-error="handleUploadError" > +
- -
- - - -
@@ -88,12 +111,13 @@ fileListBeforeRemove: [], //删除前的文件列表 uploadBtnHidden: false, - previewUrl: '', - showPreviewDialogFlag: false, + previewIndex: 1, // 初始预览图像索引 } }, computed: { - + previewList() { + return this.fileList.map(el => el.url); + } }, beforeCreate() { /* 这里不能访问方法和属性!! */ @@ -207,7 +231,7 @@ } }, - updateFieldModelAndEmitDataChangeForRemove(file, fileList) { + updateFieldModelAndEmitDataChangeForRemove(file) { let oldValue = deepClone(this.fieldModel) let foundFileIdx = -1 this.fileListBeforeRemove.map((fi, idx) => { /* 跟element-ui不同,element-plus删除文件时this.fileList数组对应元素已被删除!! */ @@ -223,14 +247,17 @@ this.emitFieldDataChange(this.fieldModel, oldValue) }, - handleBeforeRemove(file, fileList) { + handleBeforeRemove(fileList) { /* 保留删除之前的文件列表!! */ this.fileListBeforeRemove = deepClone(fileList) }, - handlePictureRemove(file, fileList) { - this.updateFieldModelAndEmitDataChangeForRemove(file, fileList) - this.fileList = deepClone(fileList) //this.fileList = fileList + handlePictureRemove(file) { + this.handleBeforeRemove(this.fileList) // 由于自定义了 #file slot,需要手动调用 handleBeforeRemove,并移除 @before-remove 和 @remove + this.fileList.splice(this.fileList.indexOf(file), 1) // 删除所点击的文件 + this.updateFieldModelAndEmitDataChangeForRemove(file) + // this.fileList = deepClone(fileList // 由于是在自身进行的操作,故不需要重新赋值 + let fileList = deepClone(this.fileList); // 进行深拷贝,避免用户自定义函数对 fileList 进行修改时,影响组件内的数据 this.uploadBtnHidden = fileList.length >= this.field.options.limit if (!!this.field.options.onFileRemove) { @@ -251,6 +278,13 @@ }) } }, + + handlePictureCardPreview({ url }) { + // 设置图片索引为当前点击的图片 + this.previewIndex = this.previewList.indexOf(url) + // 模拟点击 组件下的 img 标签(点击事件被绑定在的每张 img 上) + this.$refs['imageRef'].$el.children[0].click() + } } } @@ -287,3 +321,5 @@ } + + diff --git a/src/icons/svg/el/check.svg b/src/icons/svg/el/check.svg new file mode 100644 index 0000000..8d0f0db --- /dev/null +++ b/src/icons/svg/el/check.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svg/el/zoom-in.svg b/src/icons/svg/el/zoom-in.svg new file mode 100644 index 0000000..b30daa5 --- /dev/null +++ b/src/icons/svg/el/zoom-in.svg @@ -0,0 +1 @@ + \ No newline at end of file