vue2组件库-上传组件

这篇具有很好参考价值的文章主要介绍了vue2组件库-上传组件。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

vue2组件库

上传组件

核心思路:监控整个上传的流程

上传成功 上传失败

类型:拖拽 多个文件上传

上传必备属性 & 钩子属性

跟上传强关联的属性,上传必备的字段

name: 提交的那个formData字段名

action:ajax接口路径

limit:限制提交个数

vue2组件库-上传组件,okhttp,android

钩子函数

vue2组件库-上传组件,okhttp,android

上传fileList数据构造

dom: this.$refs

选中文件 上传

按照整个上传的流程

fileList中每个对象的状态

  1. 刚放进去,准备好了待上传
  2. 上传中
  3. 上传完成

自己创建的一个文件对象

数据层fileList

弄一个数据同步v-model或.async,我就给你一个数据不希望它有什么同步的功能,我自己身上有一份数据,用户的数据也格式化放到这个数组里不涉及什么子改父父改子,自己处理自己的数据。

文件变化了,触发文件变化的钩子。

vue2组件库-上传组件,okhttp,android

vue2组件库-上传组件,okhttp,android

vue2组件库-上传组件,okhttp,android

发起ajax上传请求

vue2组件库-上传组件,okhttp,android

vue2组件库-上传组件,okhttp,android

httpPost的处理

处理上传前+上传中+上传成功的各状态展示

file.status percent 

onProgress onSuccess onError

upload.vue

<template>
  <div class="zh-upload">
    <div class="zh-upload-button" @click="upload">
      <slot></slot>
    </div>
    <div><slot name="tip"></slot></div>
    <input ref="file" type="file" :accept="accept" :multiple="multiple" @change="changeFile">
    <ul>
      <li v-for="file in files">
        {{file.name}}
        <zh-progress v-if="file.status==='uploading'" :percent="file.percent"></zh-progress>
      </li>
    </ul>
  </div>
</template>

<script>
import _ from 'lodash'
import {ajax} from './upload'
export default {
  name:'zh-upload',
  props:{
    name:{
      type:String,
      default:'file'
    },
    action:{
      type:String,
      default:''
    },
    accept:{
      type:String,
      default:''
    },
    multiple:{
      type:Boolean,
      default:false
    },
    limit:{
      type:Number,
      default:0
    },
    onExceed:{
      type:Function,
    },
    beforeUpload:{
      type:Function,
    },
    httpRequest:{
      type:Function,
      default:ajax,
    },
    fileList:{
      type:Array,
      default:[]
    }
  },
  data(){
    return {
      files:[],
      uniqueId:1,
    }
  },
  watch:{
    fileList:{
      deep:true,
      immediate:true,
      handler(val){
        this.files=val.map(item=>{
          item.uid=`${+new Date}${this.uniqueId++}`
          item.status='success'
          return item;
          // const file={
          //   uid:item.uid,
          //   name:item.name,
          //   url:item.url,
          //   status:'success', // 完成成功态时只关心 name & url
          //   percent:0,
          // }
          // return file;
        })
      }
    }
  },
  methods:{
    upload(){
      this.$refs.file.value=''
      this.$refs.file.click()
    },
    changeFile(ev){
      let files=ev.target.files;
      // 限制最多上传的文件数
      if(this.limit && this.files.length+files.length>this.limit){
        return this.onExceed();
      }
      // [...files].forEach
      _.forEach(files,rawFile=>{
        this.uploadStart(rawFile)
        this.uploadFile(rawFile)
      })
    },
    uploadStart(rawFile){
      rawFile.uid=`${+new Date}${this.uniqueId++}`
      // 构造新的文件对象
      const fileNew={
        uid:rawFile.uid,
        name:rawFile.name,
        size:rawFile.size,
        type:rawFile.type,
        status:'uploadstart',
        percent:0,
        rawFile,
      }
      this.files.push(fileNew)

    },
    uploadFile(rawFile){
      // @todo beforeUpload
      if(typeof this.beforeUpload === 'function'){
        let flag=this.beforeUpload(rawFile) // 目前没考虑promise的情况
        if(!flag) return
      }
      this.post(rawFile)
    },
    post(rawFile){
      const options={
        filename:this.name,
        file:rawFile,
        action:this.action,
        onSuccess:(res)=>{
          this.handleSuccess(res,rawFile)

        },
        onError:(res)=>{

        },
        onProgress:(ev)=>{
          this.handleProgress(ev,rawFile)
        },
      }
      this.httpRequest(options)
    },
    handleSuccess(res,rawFile){
      const file=this.files.find(f=>f.uid===rawFile.uid)
      file.status='success'
    },
    handleProgress(ev,rawFile){
      // file是原生file文件,找到files中对应的file对象
      const file=this.files.find(f=>f.uid===rawFile.uid)
      file.status='uploading'
      file.percent=Math.round(ev.loaded/ev.total*100)

    }
  }
}
</script>

<style scoped lang="scss">
.zh-upload{
  &-button{
    display: inline-block;
  }
  input[type=file]{
    display: none;
  }
}
</style>

upload.js

export function ajax(options){
    let xhr=new XMLHttpRequest()
    const {filename,file,action,onSuccess,onError,onProgress}=options;
    const fd=new FormData
    fd.append(filename,file)
    xhr.open('post',action)
    xhr.onload=()=>{
        onSuccess(JSON.parse(xhr.responseText))
    }
    xhr.onerror=()=>{
        onError(JSON.parse(xhr.errorText))
    }
    xhr.upload.onprogress=(ev)=>{
        onProgress(ev)
    }
    xhr.send(fd)
    return xhr;
}

progress.vue

<template>
<div class="progress-outer" :style="outerStyle">
  <div class="progress-inner" :style="innerStyle"></div>
</div>
</template>

<script>
export default {
  name:'zh-progress',
  props:{
    strokeWidth:{
      type:Number,
      default:10
    },
    strokeColor:{
      type:String,
      default:'blue'
    },
    percent:{
      type:Number,
      default:0
    }
  },
  computed:{
    outerStyle(){
      return {
        height:`${this.strokeWidth}px`,
      }
    },
    innerStyle(){
      return {
        width:`${this.percent}%`,
        background:this.strokeColor
      }
    }
  },
  watch:{
    percent(val){
      console.log(val,'percent');
    }
  }
}
</script>

<style scoped lang="scss">
.progress-outer{
  width: 100%;
  background: grey;
  position: relative;
  .progress-inner{
    position: absolute;
    left: 0;
    top: 0;
    height: 100%;
    transition:width .3s ease;
  }
}
.progress-outer,.progress-inner{
  border-radius: 5px;
}
</style>

设计组件思想:

用户要有那些功能

暴露用户那些功能

用户有哪些行为

vue2组件库-上传组件,okhttp,android

拖拽上传

主要就是onDrop事件

ondragover.prevent ondragleave.prevent

vue2组件库-上传组件,okhttp,android

Popover组件

vue2组件库-上传组件,okhttp,android

appendChild insertBefore都会对dom有移动性

vue2组件库-上传组件,okhttp,android

事件:事件机制谁在谁里面,怎么触发这个事件,事件都有哪些问题

具体位置:用js算left top的值文章来源地址https://www.toymoban.com/news/detail-721220.html

到了这里,关于vue2组件库-上传组件的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • springboot+vue2 实现文件上传,vue表单实现上传多张照片或视频回显

    此教程可以实现对上传的文件管理,并加入了我的功能需求,大家可以自行进行修改。 文件管理: 功能需求视频: 文件上传视频(图片和视频) 先来简单介绍下功能实现,实现此功能分为数据库、后端java、前端vue共同实现; 业务流程: vue页面点击上传后,通过调用后端接

    2024年02月04日
    浏览(41)
  • Vue2(组件开发)

    前言 上一章博客我们讲解了Vue生命周期,列表过滤,计算属性和监听器 这一章我们来讲Vue组件开发 一,组件的使用 创建组件两种方式 组件的分类 通用组件(例如表单、弹窗、布局类等) (多个项目都可以复用) 业务组件(抽奖、机器分类)(本项目中复用) 页面组件(单页面

    2024年02月12日
    浏览(24)
  • Vue2:组件高级(下)

    Date: May 25, 2023 Sum: 自定义指令、插槽、商品列表、动态组件 概念 : 内置指令:vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。 自定义指令:Vue支持让开发者,自己注册一些指令。这些指令被称为 自定义指令。 自定义指令可以封装一些 dom 操作,扩展额外功能。 类型

    2024年02月13日
    浏览(28)
  • vue2上传图片image-conversion压缩

    项目中涉及上传图片,如果大体积的一般都需要压缩,这里我使用image-conversion来压缩 其实在npm中使用已经说得很明白了,我这里记录一下跟element ui上传组件配合使用 1、安装image-conversion 2、引入使用 2.1、这里配合element ui的上传组件配合使用 上传前方法中处理压缩逻辑,压

    2024年01月21日
    浏览(32)
  • vue2中祖父组件和孙组件事件通信

    1、使用 p a r e n t 属性访问祖父组件,并通过 parent属性访问祖父组件,并通过 p a re n t 属性访问祖父组件,并通过 emit方法触发祖父组件的事件 2、使用provide和inject方法,在祖父组件中提供一个方法或属性,孙组件中通过inject方法获取这个方法或属性,并在孙组件中调用该方

    2024年02月13日
    浏览(65)
  • 【vue2】组件进阶与插槽详解

    🥳博       主: 初映CY的前说(前端领域) 🌞个人信条: 想要变成得到,中间还有做到! 🤘 本文核心 :v-modedl表单双向绑定、ref|$ref操作dom、dynamic动态组件、$nextTick同步、匿名插槽、具名插槽、作用域插槽 目录(文末有给大家准备好的Xmind思维导图) 一、组件进阶 1.

    2024年02月03日
    浏览(29)
  • 利用Vue2实现印章徽章组件

    需要实现的组件效果: 该组件有设置颜色、大小、旋转度数和文本内容功能。  二、组件应用代码:  

    2024年02月06日
    浏览(36)
  • vue2-组件和插件的区别

    1、组件是什么? 组件就是把图形、非图形的各种逻辑均抽象为一个统一的概念(组件)来实现开发的模式,在vue中每一个.vue文件都可以被视为一个组件。 组件的优势: 降低整个系统的耦合度,在保持接口不变的情况下,可以替换不同的组件完成需求,例如输入框,可以替

    2024年02月14日
    浏览(27)
  • vue2使用 tinymce富文本编辑器-图片上传、粘贴图片上传致服务器

    1.安装tinymce富文本编辑器插件 npm i tinymce npm i @tinymce/tinymce-vue 2.创建Editor.js文件 封装组件 以便使用 3.汉化包 (我放在public/tynymce/langs文件夹里) 4.vue组件中使用 本次记录重点在于 上传图片方法 需要区分工具栏中图片上传方法 以及 粘贴进去的图片也需要走上传方法。两个方

    2024年02月09日
    浏览(41)
  • vue2+Spring Boot2.7 大文件分片上传

    之前我们文章 手把手带大家实现 vue2+Spring Boot2.7 文件上传功能 将了上传文件 但如果文件很大 就不太好处理了 按正常情况甚至因为超量而报错 这里 我弄了个足够大的文件 我们先搭建 Spring Boot2.7 环境 首先 application.yml 代码编写如下 这里 我们改了他对请求大小的限制 不然

    2024年02月11日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包