Vue el-upload 组件多张图片上传并回显(无需添加样式)以及正确使用方式

MultiUpload 组件内容:

<template>
  <div>
    <el-upload
      :action="uploadUrl()"
      list-type="picture-card"
      accept=".jpg,.jpeg,.png,.gif"
      multiple
      :file-list="fileList"
      :on-remove="handleRemove"
      :on-success="handleUploadSuccess"
      :before-upload="handleBeforeUpload"
      :on-preview="handlePreview"
      :limit="maxCount"
      :on-exceed="handleExceed"
    >
      <i class="el-icon-plus" />
    </el-upload>
    <el-dialog :visible.sync="dialogVisible">
      <img width="100%" :src="dialogImageUrl" :alt="dialogImageName">
    </el-dialog>
  </div>
</template>
<script>

import { getImageUpload } from '@/api/badFruit'
export default {
  name: 'MultiUpload',
  props: {
    // 图片属性数组
    value: {
      type: Array,
      default: () => []
    },
    // 最大上传图片数量
    maxCount: {
      type: Number,
      default: 5
    }
  },
  data() {
    return {
      fileList: [],
      imagesList: [],
      images: [],
      dialogVisible: false,
      dialogImageUrl: null,
      dialogImageName: '',
      num: 0,
      fileNum: 0
    }
  },
  created() {
    // 上传组件显示列表
    this.fileList = this.value
    // 图片保存数组
    this.imagesList = this.value
  },
  methods: {
    // 文件上传地址
    uploadUrl() {
      return getImageUpload
    },
    handleRemove(file, fileList) {
      const list = JSON.parse(JSON.stringify(fileList))
      this.imagesList = list.map(item => ({
        name: item.name,
        url: item.url
      }))
      this.$emit('input', this.imagesList)
    },
    handlePreview(file) {
      this.dialogVisible = true
      this.dialogImageUrl = file.url
      this.dialogImageName = file.name
    },
    handleUploadSuccess(res, file) {
      // console.log(res, file)
      if (res.code === '200') {
        const { message, path } = res.data
        if (message === '图片上传成功') {
          this.images.push({
            name: file.name,
            url: path
          })
          this.num++
          if (this.num === this.fileNum) {
            this.num = 0
            this.fileNum = 0
            // 这里如果 this.value.push(imageUrl) 这么写,vue会报出警告,大概意思是value作为props不应该在子组件中被修改
            // 应该根据 value 得到新的值,而不能修改它,this.value.concat(imageUrl)也是可以的,concat方法返回新的数组
            this.$emit('input', this.imagesList.concat(this.images))
            this.images = []
          }
        }
      }
    },
    handleBeforeUpload(file) {
      this.fileNum++
      console.log('上传个数:' + this.fileNum)
    },
    handleExceed(files, fileList) {
      this.$message({
        message: '最多只能上传' + this.maxCount + '张图片',
        type: 'warning',
        duration: 1000
      })
    }
  }
}
</script>
<style scoped lang="scss">

</style>


使用方式:

	// 模板
      <el-form-item label="坏果图片">
        <!--<el-input v-model="form.image" />-->
        <multi-upload v-model="form.image" @input="getImages" />
      </el-form-item>
	// 方法
    getImages(images) {
      console.log(images)
      this.form.image = images
    },

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值