使用vue实现图片上传插件

直接上代码

<template>
  <div class="container">
    <input
      type="file"
      :id="id"
      :ref="id"
      style="display:none;width:0;height:0;padding:0;"
      @change="preview1($event)"
      multiple="multiple"
      accept="image/x-png, image/jpg, image/jpeg, image/gif"
    >
    <input type="button" value="+" class="inputAdd" style @click="inputClick">
  </div>
</template>

<script>
export default {
  props: ["id"],
  data() {
    return {
      changeBool: true,
      countValue: 0,
      msg: "您可以上传png, jpg, 或者gif格式的图片",
      filter: {
        jpeg: "/9j/4",
        gif: "R0lGOD",
        png: "iVBORw"
      }
    };
  },
  methods: {
    inputClick() {
      let id = this.id;
      let inputRefEl = this.$refs[id];
      inputRefEl.click();
    },
    preview1($event) {
      let file = $event.target;
      let that = this;
      let container = document.getElementById(that.id).parentElement;
      if (window.FileReader) {
        var filereader = new FileReader();
        var filereader1 = new FileReader();
        var filereader2 = new FileReader();
        if (file.files[0]) {
          filereader.readAsDataURL(file.files[0]);
        }
        if (file.files[1]) {
          filereader1.readAsDataURL(file.files[1]);
        }
        if (file.files[2]) {
          filereader2.readAsDataURL(file.files[2]);
        }

        filereader.onload = function(event) {
          var srcpath = event.target.result;
          if (!that.validateImg(srcpath)) {
            console.log("H5" + that.msg);
          } else {
            that.showPreviewImage(srcpath, container, that.id);
          }
        };

        filereader1.onload = function(event) {
          var srcpath = event.target.result;
          if (!that.validateImg(srcpath)) {
            console.log("H5" + that.msg);
          } else {
            that.showPreviewImage(srcpath, container, that.id);
          }
        };

        filereader2.onload = function(event) {
          var srcpath = event.target.result;
          if (!that.validateImg(srcpath)) {
            console.log("H5" + that.msg);
          } else {
            that.showPreviewImage(srcpath, container, that.id);
          }
        };
      } else {
        if (!/\.jpg$|\.png$|\.gif$/i.test(file.value)) {
          console.log("原生" + that.msg);
        } else {
          that.showPreviewImage(file.value, container, that.id + 1);
        }
      }
    },
    validateImg(data) {
      let that = this;
      var pos = data.indexOf(",") + 1;
      for (var e in that.filter) {
        if (data.indexOf(that.filter[e]) === pos) {
          return e;
        }
      }
      return null;
    },
    createContain(src, containerVal, id) {
      let divContainer = document.createElement("div");
      //新建ICon
      let Icon = document.createElement("i");
      Icon.className = "el-icon-share";
      Icon.style = "position:relative;bottom:1rem;left:2rem;z-index:90";
      divContainer.appendChild(Icon);

      //新建图片
      var img = document.createElement("img");
      img.src = src;
      img.style = "width:2rem;height:30px;position:relative;z-index:9";
      divContainer.appendChild(img);

      //把容器放入container容器
      let containerEl = document.getElementById(id);
      containerVal.insertBefore(divContainer, containerEl);
      Icon.onclick = function(Icon) {
        this.changeBool = true;
        let parent = img.parentElement.parentElement;
        let child = img.parentElement;
        parent.removeChild(child);
        let container = document.getElementById(id).nextSibling;
        container.style.display = "block";
      };
    },
    showPreviewImage(src, containerVal, id) {
      let length = document.getElementById(id).parentElement.childNodes.length;
      if (this.changeBool && length == 4) {
        let container = document.getElementById(id).nextSibling;
        container.style.display = "none";
        this.createContain(src, containerVal, id);
        return;
      } else {
        if (length < 4) {
          this.createContain(src, containerVal, id);
          return;
        }
      }
    }
  }
};
</script>

<style scoped>
.container {
  display: flex;
  flex-direction: row;
}
.containerCell {
  display: inline-block;
  display: block;
  width: 500px;
  height: 30px;
}
#elIcon {
  position: relative;
  z-index: 22;
}
.inputAdd {
  position: relative;
  width: 2rem;
  height: 2rem;
  font-size: 1rem;
  padding: 0;
  line-height: 0;
}
</style>

效果为:

图片选取前:

图片选取后:

点击删除图片:

 

posted @ 2019-05-23 15:48  小安排  阅读(5795)  评论(0编辑  收藏  举报