基于vue的图片上传组件

来源:https://www.sucaihuo.com/js/2885.html 2017-08-31 23:30浏览(6448) 收藏

一款基于vue的图片上传组件,可以点击选择单张图片或多张图片,也可以拖拽图片到指定区域,所选的图片均以缩略图显示在下面,可以点击“叉号”删除不需要的图片。
基于vue的图片上传组件
分类:表单代码 > 图片上传 难易:初级
查看演示 下载资源 下载积分: 20 积分

页面的head部分,需引入页面的样式文件和vue.min.js,代码如下:

<link type="text/css" rel="stylesheet" href="css/style.css"/>
<script type="text/javascript" src="js/vue.min.js"></script>

页面的body部分,设置好选择区域和拖拽区域的对应容器,代码如下:

<div id="app">
  <div class="hello">
    <div class="upload">
      <div class="upload_warp">
        <div class="upload_warp_left" @click="fileClick">
          <img src="./images/upload.png">
        </div>
        <div class="upload_warp_right" @drop="drop($event)" @dragenter="dragenter($event)" @dragover="dragover($event)">
          或者将文件拖到此处
        </div>
      </div>
      <div class="upload_warp_text">
        选中{{imgList.length}}张文件,共{{bytesToSize(this.size)}}
      </div>
      <input @change="fileChange($event)" type="file" id="upload_file" multiple style="display: none"/>
      <div class="upload_warp_img" v-show="imgList.length!=0">
        <div class="upload_warp_img_div" v-for="(item,index) of imgList">
          <div class="upload_warp_img_div_top">
            <div class="upload_warp_img_div_text">
              {{item.file.name}}
            </div>
            <img src="./images/del.png" class="upload_warp_img_div_del" @click="fileDel(index)">
          </div>
          <img :src="item.file.src">
        </div>
      </div>
    </div>
  </div>
</div>

页面的底部,实例化vue图片上传组件,并设置好相关参数,代码如下:

var app = new Vue({
  el: '#app',
  data () {
    return {
      imgList: [],
      size: 0
    }
  },
  methods: {
    fileClick(){
      document.getElementById('upload_file').click()
    },
    fileChange(el){
      if (!el.target.files[0].size) return;
      this.fileList(el.target.files);
      el.target.value = ''
    },
    fileList(files){
      for (let i = 0; i < files.length; i++) {
        this.fileAdd(files[i]);
      }
    },
    fileAdd(file){
      this.size = this.size + file.size;//总大小
      let reader = new FileReader();
      reader.vue = this;
      reader.readAsDataURL(file);
      reader.onload = function () {
        file.src = this.result;
        this.vue.imgList.push({
          file
        });
      }
    },
    fileDel(index){
      this.size = this.size - this.imgList[index].file.size;//总大小
      this.imgList.splice(index, 1);
    },
    bytesToSize(bytes){
      if (bytes === 0) return '0 B';
      let k = 1000, // or 1024
        sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'],
        i = Math.floor(Math.log(bytes) / Math.log(k));
      return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];
    },
    dragenter(el){
      el.stopPropagation();
      el.preventDefault();
    },
    dragover(el){
      el.stopPropagation();
      el.preventDefault();
    },
    drop(el){
      el.stopPropagation();
      el.preventDefault();
      this.fileList(el.dataTransfer.files);
    }
  }
})
评论0
头像

系统已开启自动识别垃圾评论机制,识别到的自动封号,下载出错或者资源有问题请联系全栈客服QQ 1915635791

1 2