vue 图片上传和删除

element upload来实现图片上传

首先封装了图片组件,结合自定义model,将图片地址传给父组件,进行展示

// 图片组件
<template>
  <div class="upload-block">
    <el-upload class="avatar-uploader" :headers="headers" v-loading="loading" element-loading-spinner="el-icon-loading" :action="action" :accept="accept" :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>
    <div class="text">{{tip}}</div>
    <div class="delete" v-if="imageUrl" @click="deleteFun()"><i class="el-icon-delete"></i></div>
  </div>
</template>

<script>
/* eslint-disable */
export default {
  data () {
    return {
      imageUrl: '',
      loading: false,
      headers: {
        Authorization: 'Bearer ' + localStorage.getItem('Authorization')
      }
    }
  },
  props: {
    action: {
      default: ''
    },
    size: {
      default: '10'
    },
    tip: {
      default: ''
    },
    accept: {
      default: 'image/jpeg,image/png'
    },
    value: {
      default: ''
    },
    // 删除图片方法
    deleteFun: {
      default: () => { }
    }
  },
  watch: {
    value: {
      deep: true,
      immediate: true,
      handler (val) {
        this.imageUrl = val
      },
    },
  },
  model: {
    prop: 'value',
    event: 'getvalue'
  },
  methods: {
    // 图片上传成功后,值传给父组件
    handleAvatarSuccess (res, file) {
      this.$emit('getvalue', res.data)
      this.loading = false
    },
     // 上传时校验图片大小
    beforeAvatarUpload (file) {
      this.loading = true
      const size = parseInt(this.size)
      const isLt2M = file.size / 1024 / 1024 < size;
        
      if (!isLt2M) {
        this.$message.error(`上传头像图片大小不能超过 ${size}MB!`);
        this.loading = false
      }
      return isLt2M;
    }
  }
}
</script>

<style lang="less" scoped>
.avatar-uploader {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
  width: 104px;
  height: 104px;
  &:hover {
    border-color: #182a87 !important;
  }
}
.avatar-uploader-icon {
  font-size: 16px;
  color: #8c939d;
  width: 104px;
  height: 104px;
  line-height: 80px;
  text-align: center;
  position: relative;
  background: #f5f7fa;
  &::after {
    display: block;
    content: '上传图片';
    font-size: 12px;
    position: absolute;
    color: #606266;
    left: 28px;
    bottom: -6px;
  }
}
.avatar {
  width: 104px;
  height: 104px;
  display: block;
}
.upload-block {
  position: relative;
  .text {
    font-size: 12px;
    color: #999;
  }
  .disabled {
    position: absolute;
    top: 0;
    right: 0;
    bottom: 0;
    left: 0;
    z-index: 1;
    cursor: not-allowed;
  }
  .delete {
    position: absolute;
    top: 0;
    left: 110px;
    z-index: 1;
    cursor: pointer;
  }
}
</style>
// 父组件
<el-form-item label="图片" prop="img">
            <YcUploadImg v-model="form.img" tip="大小不超过10M的jpg或png格式的图片" action="api/permission/file/upload" :deleteFun="deleteFun" />
          </el-form-item>

methods: {
    deleteFun () {
      this.form.img = ''
    },
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不会•

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值