vue.js

关注公众号 jb51net

关闭
首页 > 网络编程 > JavaScript > javascript类库 > vue.js > element-ui v-for循环el-upload上传图片 动态添加、删除

vue element-ui v-for循环el-upload上传图片 动态添加、删除方式

作者:杰瑞LJ

这篇文章主要介绍了vue element-ui v-for循环el-upload上传图片 动态添加、删除方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

element-ui v-for循环el-upload上传图片 动态添加、删除

表单元素

<el-row v-for="(v,i) in RecordOperation.imgList" :key="i">
                <el-col :span='11'>
                    <el-form-item label="图片">
                        <el-upload
                                accept="image/jpeg,image/png"
                                class="avatar-uploader"
                                :action="uploadUrl()"
                                :show-file-list="false"
                                :on-success="dynamicPicSuccess.bind(null, {'index':i,'data':v})"
                                :before-upload="beforeUploadImageDynamicPic">
                            <img v-if="v.picUrl" :src="v.picUrl" class="avatar dynamic">
                            <i v-else class="el-icon-plus avatar-uploader-icon dynamic"></i>
                        </el-upload>
                    </el-form-item>
                </el-col>
                <el-col :span="11">
                    <el-form-item label="图片介绍">
                        <el-input minlength="4" maxlength="20" v-model.trim="v.content"></el-input>
                    </el-form-item>
                </el-col>
                <el-col :span="2" align="right" v-show="RecordOperation.imgList.length<=2?false:true">
                    <el-button type="text" style="color:red;line-height:32px;" @click="delDynamicPic(i,RecordOperation.imgList)">删除</el-button>
                </el-col>
            </el-row>

图片上传验证,上传图片处理,删除图片

// 动态图片验证
            beforeUploadImageDynamicPic(file){
                var _this = this;
                var isLt10M = file.size / 1024 / 1024  < 10;
                if (['image/jpeg', 'image/png'].indexOf(file.type) == -1) {
                    _this.$message.error('请上传正确的图片格式');
                    return false;
                }
                if (!isLt10M) {
                    _this.$message.error('上传图片大小不能超过10MB哦!');
                    return false;
                }
            },

            //动态图上传成功
            dynamicPicSuccess(obj,res,file) {
                var imgList = this.RecordOperation.imgList
                var index = obj.index;
                imgList[index].picUrl = res.data.filePath;
                // 少于5张图时,自动添加一行
                if(imgList.length<5)
                imgList.push({content: '', picUrl: ""});
            },

            // 移除动态建设图片
            delDynamicPic(i,list) {
                this.$confirm('确认删除该条记录?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    list.splice(i, 1);
                });
            },

vue+Element-ui(el-upload) 上传图片/文件

文件上传时携带参数

文件上传时,想要在上传的时候携带参数,可直接使用:

:data={参数} ,参数为键值对的形式{key1:value1,key2:value2}

<el-upload
	:data={pid:this.pid}
	>
</el-upload>

upload

<el-upload
          :headers="upload.headers"
          :action="upload.url"
          :on-success="handleFileSuccess"
          list-type="picture-card"
          :on-preview="handlePictureCardPreview"
          :on-remove="handleRemove"
          :file-list="completionPhotoList"
          :on-change="changeFile"
        >
        <i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible" :modal="false">
   <img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog>
<script>
export default {
  data() {
    return {
      // 用户导入参数
      upload: {
        // 是否显示弹出层(用户导入)
        open: false,
        // 弹出层标题(用户导入)
        title: "",
        // 是否更新已经存在的用户数据
        updateSupport: 0,
        // 设置上传的请求头部
        headers: { Authorization: "Bearer " + getToken() },
        // 上传的地址
        url: process.env.VUE_APP_BASE_API + "/api/common/upload",
      },
 } 
}

before-remove来阻止文件被删除的操作

<el-upload
  :before-remove="beforeRemove"
  >
</el-upload>
<script>
  export default {
    data() {
      return {
        
      };
    },
    methods: {
      beforeRemove(file, fileList) {
        return this.$confirm(`确定移除 ${ file.name }?`);
      },
    }
  }
</script>

multiple、limit、on-exceed属性

给控件加了multiple属性,就表示可以多选;

通过limit设置多选的个数限制,当不需要多选(只想单选文件)时,不加multiple属性;

可多选,无个数限制,不设置limit这个属性即可;

on-exceed:超出限制时会调用此方法;

超出三个文件给予提示信息,如图:

<el-upload
  multiple
  :limit="3"
  :on-exceed="handleExceed"
  >
</el-upload>
<script>
  export default {
    data() {
      return {
        
      };
    },
    methods: {
      handleExceed(files, fileList) {
        this.$message.warning(`当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${files.length + fileList.length} 个文件`);
      },
    }
  }
</script>

before-upload属性以及on-success属性

注意auto-upload属性的坑::auto-upload="false"时,before-upload 不起作用;

为啥?

解决方法:

将before-upload里面要写的内容放到on-change事件中去实现

:auto-upload="false"设置为true

<el-upload
  class="avatar-uploader"
  action="https://jsonplaceholder.typicode.com/posts/"
  :show-file-list="false"
  :on-success="handleAvatarSuccess"
  :before-upload="beforeAvatarUpload">
  <img v-if="imageUrl" :src="imageUrl" class="avatar">
  <i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<script>
  export default {
    data() {
      return {
        imageUrl: ''
      };
    },
    methods: {
      handleAvatarSuccess(res, file) {
        this.imageUrl = URL.createObjectURL(file.raw);
      },
      beforeAvatarUpload(file) {
        const isJPG = file.type === 'image/jpeg';
        const isLt2M = file.size / 1024 / 1024 < 2;
 
        if (!isJPG) {
          this.$message.error('上传头像图片只能是 JPG 格式!');
        }
        if (!isLt2M) {
          this.$message.error('上传头像图片大小不能超过 2MB!');
        }
        return isJPG && isLt2M;
      }
    }
  }
</script>

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文