今天项目要实现图片单张上传功能,完善了很长时间,现在记录下
实现效果如下所示(不会上传gif,用几张图吧)
起始
点击后出现上传选项然后选择要上传的图片,可以发现后面不会再显示多的上传选项

其中也可以点击查看和删除

当点击查看的时候会弹出dialog,当点击删除的时候已上传的图片会删掉,并再次出现要上传带+号的默认图片
这是点击查看的样式

这是删除后的样式,可以发现又变了回来

下面看下代码
template:
<el-upload
action=""
:limit="1" //上传文件数
:on-preview="handlePictureCardPreview" //其余为el-upload自带的钩子函数,可上官网自行查看
:on-change="handleChange"
:on-progress="onProgress"
:on-success="imgSuccess"
:on-error="imgError"
:http-request="uploadHttp" //自定义上传方法
list-type="picture-card"
:on-remove="handleRemove"
:class="{disabled:uploadDisabled}" //用来控制上传后+号是否显示
:file-list="fileList"
>
</el-upload>
。。。。。。
<el-dialog :modal-append-to-body="false" :visible.sync="imgVisible" width="30%">
<img width="100%" :src="dialogImageUrl" alt="图片未找到"/>
</el-dialog>
这里定义了一个upload方法和一个dialog用来显示预览照片,注意这里有个坑,dialog一定要在外面,是相对于全局定义的
如果在el-upload里面定义了dialog会发现关闭了预览dialog后又会执行上传方法,来让你上传文件,
然后data里面声明
return {
//上传身份证正面相关参数
limitCount: 1,
uploadDisabled: false,
// 是否显示预览图片
imgVisible: false,
// 预览图片url
dialogImageUrl: "",
fileList: [],
}
methods方法中讲明
onProgress(event, file, fileList) {this.uploadDisabled = false;
},
// 图片上传成功
imgSuccess(response, file, fileList) {this.uploadDisabled = true;
},
// 图片上传失败
imgError(err, file, fileList) {this.uploadDisabled = true;
},
// 预览图片
handlePictureCardPreview() {
this.imgVisible = true;
this.uploadDisabled = true;
},
// 删除图片
handleRemove(file, fileList) {
this.uploadDisabled = false;
// this.hideUpload = fileList.length >= this.limitCount;
},
//图片更改
handleChange(fileList) {
this.uploadDisabled = fileList.length >= this.limitCount;
this.uploadDisabled = true;
},
uploadHttp(file) { //定义上传方法
let _this = this;
//获取文件信息
let fileLen = file.file;
let name = fileLen.name
let rand = this.calculate_object_name(name); //把文件名变为随机数,也可以不更改,这里为了防止文件名重复
client().multipartUpload(rand , fileLen).then(function (res) { //调用阿里oss上传
let str = res.res.requestUrls[0];
_this.dialogImageUrl = 自有域名 + rand ;
console.log(_this.dialogImageUrl);
}).catch((err) => {
console.log(err)
})
},
style中定义的css变量
.disabled .el-upload--picture-card {
display: none;
}
.baseTheme .el-upload--picture-card {
background-image: url("../../../../static/img/背景图片.png");
background-position-x: center; //背景图居中显示
background-position-y: center;
background-size: 100% 100%; //背景图填充
width: 190px; //宽高可变
height: 150px;
}
.baseTheme .el-upload-list--picture-card .el-upload-list__item {
width: 190px; //宽高与背景图一致
height: 150px;
position: inherit;
}
.baseTheme .el-upload-list--picture-card .el-upload-list__item-actions {
width: 190px; //宽高与背景图一致
height: 150px;
}
