ImgUploader.vue 1.87 KB
<template>
  <div id="ImgUploader">
    <div class="imgItem" v-for="(item, index) in displayList" :key="index">
      <img :src="item" alt="">
    </div>
    <div class="imgItem addImg" v-show="imgList.length < limit" @click="addImg">
      <v-icon>add</v-icon>
    </div>
    <input type="file" ref="input" @change="handleChange" :multiple="limit > 1" :accept="accept">
  </div>
</template>

<script>
export default {
  data: () => ({
    imgList: [],
    displayList: [],
    file: {}
  }),
  props: {
    limit: {
      type: Number,
      default: 1
    },
    accept: {
      type: String,
      default: 'image/gif, image/png, image/jpeg, image/bmp, image/webp'
    }
  },
  methods: {
    addImg() {
      this.$refs.input.click()
    },
    handleChange(e) {
      const files = e.target.files;
      for (let i = 0; i < files.length; i++) {
        if (this.imgList.length < this.limit) {
          const file = files[i]
          let fr = new FileReader()
          fr.readAsDataURL(file)
          this.imgList.push(file)
          fr.onloadend = (e) => {
            this.displayList.push(e.target.result)
          }
        }
      }
      console.log(this.imgList)
    },
  }
}
</script>

<style lang="scss" scoped>
  #ImgUploader {
    width: 100%;
    display: flex;
    justify-content: flex-start;
    align-items: center;
    flex-direction: row;
    flex-wrap: wrap;

    .imgItem {
      width: 5rem;
      height: 5rem;
      margin-right: 0.5rem;
      margin-top: 0.5rem;
      transition: all 0.3s linear;
      img {
        width: auto;
        height: auto;
        max-width: 100%;
        max-height: 100%;
        vertical-align: bottom;
      }
      .icon {
        font-size: 4rem;
      }
      &.addImg {
        border: 1px dotted #979797;
        line-height: 5rem;
        text-align: center;
      }
    }
    input {
      height: 0;
      width: 0;
    }
  }
</style>