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

 更新时间:2023年10月16日 15:02:18   作者:杰瑞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

  • open: 是否显示弹出层,该属性的值为布尔型,false表示不显示,true表示显示。
  • title: 弹出层标题,该属性的值为字符串类型。
  • updateSupport: 是否更新已经存在的用户数据,该属性的值为整型。若为0,则不更新;若为1,则更新。
  • headers: 设置上传的请求头部,该属性的值为一个对象类型,包含了一个Authorization属性,在请求头部中将会添加Authorization属性的值为"Bearer "加上getToken()方法的返回值,此处的返回值就是token(根据自己需求改!)。
  • url: 上传的地址,该属性的值为一个字符串类型,值process.env.VUE_APP_BASE_API + "/api/common/upload"。
  • 其中,process.env.VUE_APP_BASE_API是一个环境变量,其值在不同的环境中可能会有所不同,表示应用程序的基本API地址。
<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: 文件上传之前触发,指当文件已经被选中,提交时才会触发此事件
  • auto-upload:设置为false时,选中文件不会触发上传事件

解决方法:

将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>

总结

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

相关文章

  • 在vue项目中使用Nprogress.js进度条的方法

    在vue项目中使用Nprogress.js进度条的方法

    NProgress.js是轻量级的进度条组件,使用简便,可以很方便集成到单页面应用中。这篇文章主要介绍了在vue项目中使用Nprogress.js进度条的方法,需要的朋友可以参考下
    2018-01-01
  • 前端项目vue3/React如何使用pako库解压缩后端返回gzip数据

    前端项目vue3/React如何使用pako库解压缩后端返回gzip数据

    pako是一个流行的JS库,用于在浏览器中进行数据压缩和解压缩操作,它提供了对常见的压缩算法的实现,使开发者能够在客户端上轻松进行数据压缩和解压缩,这篇文章主要介绍了前端项目vue3/React使用pako库解压缩后端返回gzip数据,需要的朋友可以参考下
    2024-07-07
  • vue 实现图片懒加载功能

    vue 实现图片懒加载功能

    这篇文章主要介绍了vue 实现图片懒加载功能的方法,帮助大家更好的理解和使用vue,感兴趣的朋友可以了解下
    2020-12-12
  • 解决vue组件渲染没更新数据问题

    解决vue组件渲染没更新数据问题

    本文主要介绍了解决vue组件渲染没更新数据问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Vue前端利用slice()方法实现分页器

    Vue前端利用slice()方法实现分页器

    分页功能是常见的需求之一,本文主要介绍了Vue前端利用slice()方法实现分页器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • vue中使用Axios最佳实践方式

    vue中使用Axios最佳实践方式

    Axios 是一个基于 promise 的网络请求库,可以用于浏览器和 node.js,Axios 使用简单,包尺寸小且提供了易于扩展的接口,这篇文章主要介绍了vue中使用Axios最佳实践,需要的朋友可以参考下
    2022-09-09
  • Vue3手动清理keep-alive组件缓存的方法详解

    Vue3手动清理keep-alive组件缓存的方法详解

    这篇文章主要为大家详细介绍了Vue3中手动清理keep-alive组件缓存的方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-04-04
  • 解决element-ui库的el-row的gutter=10间距失效问题

    解决element-ui库的el-row的gutter=10间距失效问题

    这篇文章主要介绍了解决element-ui库的el-row的gutter=10间距失效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • vue背景图片路径问题及解决

    vue背景图片路径问题及解决

    这篇文章主要介绍了vue背景图片路径问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • Vue生命周期中的组件化你知道吗

    Vue生命周期中的组件化你知道吗

    这篇文章主要为大家详细介绍了Vue生命周期中的组件化,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-03-03

最新评论