封装 el-upload,实现可上传图片、预览图片、编辑图片、删除图片功能

效果图

在这里插入图片描述

父组件
template
<el-card>
            <div>上传图片子组件</div>
            <el-form label-width="100px">
                <el-form-item label="图片:">
                    <uploadImg :limit="5" :fileList="fileList" @submitImg="getImgList"></uploadImg>
                </el-form-item>
            </el-form>
        </el-card>
script
//数据
data(){
	return:{
		fileList:[
                {name:'大宝贝',url:'https://i.ebayimg.com/00/s/ODAwWDgwMA==/z/MO4AAOSwjYFezOIR/$_12.JPG?set_id=880000500F'},
                {name:'滴滴滴',url:'https://i.ebayimg.com/00/s/OTAwWDkwMA==/z/a60AAOSwaYdfG7vI/$_12.JPG?set_id=880000500F'},  
            ],
	}
}
// 获取图片
 getImgList(list){
     this.fileList = list
 }
子组件 uploadImg (完整代码)
<template>
    <div>
        <el-upload
            :action="action"
            list-type="picture-card"
            accept=".jpg,.jpeg,.png"
            :on-success="handleSuccess"
            :file-list="fileLists"
            :headers="{username:username}"
            :disabled="fileLists.length >= limit">
            <i slot="default" class="el-icon-plus"></i>
            <div slot="file" slot-scope="{file}">
                <img class="el-upload-list__item-thumbnail" :src="file.url" alt="">
                <span class="el-upload-list__item-actions">
                    <span class="el-upload-list__item-preview" @click="handlePictureCardPreview(file)">
                        <i class="el-icon-zoom-in"></i>
                    </span>
                    <span class="el-upload-list__item-edit" @click="handlePictureCardEdit(file)">
                        <i class="el-icon-edit"></i>
                    </span>
                    <span class="el-upload-list__item-delete" @click="handleRemove(file)">
                        <i class="el-icon-delete"></i>
                    </span>
                </span>
            </div>
        </el-upload>
        <el-dialog :visible.sync="dialogVisible" append-to-body>
            <img width="100%" :src="dialogImageUrl" alt="">
        </el-dialog>
        <el-dialog :visible.sync="editView" width="40%" append-to-body>
            <el-input type="textarea" :rows="4" v-model="editForm.url" @input="editPic"></el-input>
        </el-dialog>
    </div>
</template>

<script>
export default {
    props:{
        limit:{
            type:Number,
            default:12,
        },
        action:{
            type:String,
            default:'#'
        },
        fileList:{
            type:Array,
            default: ()=>{
                return []
            }
        }
    },
    data(){
        return{
            dialogImageUrl: '',
            dialogVisible: false,
            fileLists:this.fileList,
            editForm:{
                url:'',
                uid:null
            },
            editView:false,
            username:''
        }
    },
    mounted(){
        this.username = Cookies.get('username')
    },
    methods:{
        // 移除图片
        handleRemove(file) {
            for(let i in this.fileLists){
                if(this.fileLists[i].uid == file.uid){
                    this.fileLists.splice(i,1)
                }
            }
            this.submitFile()
        },
        handlePictureCardPreview(file) {
            this.dialogImageUrl = file.url;
            this.dialogVisible = true;
        },
        handleSuccess(response,file,fileList){
            let obj = {
                name: file.name,
                status: "success",
                uid: file.uid,
                url: file.url,
            }
            this.fileLists.push(obj)
            this.submitFile()
        },
        // 编辑图片弹窗
        handlePictureCardEdit(file){
            this.editForm.url = file.url
            this.editForm.uid = file.uid
            this.editView = true
        },
        // 编辑图片
        editPic(){
            for(let i in this.fileLists){
                if(this.fileLists[i].uid == this.editForm.uid){
                    this.fileLists[i].url = this.editForm.url
                }
            }
            this.submitFile()
        },
        // 将图片文件传回给父组件
        submitFile(){
            this.$emit('submitImg',this.fileLists)
        },
    }
}
</script>

<style scoped>
    .el-icon-plus{
        font-size: 30px!important;
    }
    .el-icon-edit{
        font-size: 18px !important;
    }
    .el-icon-zoom-in{
        font-size: 18px !important;
    }
    .el-icon-delete{
        font-size: 18px !important;
        color:rgb(243, 143, 130);
    }
    .el-input>>> .el-textarea__inner{
        font-size:18px!important;
    }
</style>
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值