upload组件封装,支持拖拽文件上传

一、组件封装需要注意什么?

组件化思想:组件应该是独立的、可复用的部件,应该遵循单一职责原则,将组件的功能划分得尽可能细致。
API 设计:组件的 API 设计要合理,要考虑到组件的可定制性和易用性。应该尽可能的提供必要的配置项和事件回调,同时避免提供过多的 API,导致 API 过于复杂。
生命周期:组件的生命周期要合理地使用,尤其是对于需要与外部交互的组件,要注意生命周期的时机,以便在组件的不同阶段进行相应的操作。
组件通信:组件通信是组件化开发中的一个重要问题,Vue 中提供了多种通信方式,包括props、 e m i t 、 emit、 emitparent、$attrs、ref、vuex、provide/inject 等。在组件的设计中,需要考虑到组件之间的通信问题,合理地使用这些通信方式。
样式和布局:组件的样式和布局应该尽可能地与组件的功能分离,避免样式和布局影响到组件的功能和逻辑。
测试:组件封装完成后,需要进行充分的测试,包括单元测试和集成测试,以保证组件的质量和稳定性。
总的来说,组件封装可以达到代码的灵活和可复用性,但封装时要谨记上面提到的封装要点。

二、目标效果

在这里插入图片描述

组件可配置属性:

  • multiple是否为多文件上传;
  • filePostfix允许上传文件类型提示;
  • fileList底部文件列表;
  • loading加载数据时显示动效;

组件可配置方法:

  • upload文件上传触发的事件回调;
  • delete点击删除图标触发的事件回调;
  • download点击下载图标触发的事件回调;

三、封装步骤

1、从本地选取文件

1)方式一——点击按钮选取文件:

<input ref="inputfile" class="file-content" type="file" :multiple="multiple" @change="handelInputFile">

相关方法:

handelInputFile(e) {
   
    this.readFile(e.target.files)
    this.$refs.inputfile.value = null;
},

2)方式二——直接拖拽文件:

<div class="file-box"
     :class="dropType ? 'dropbox-shadow' : ''"
     type="file"
     v-i-loading.fullscreen="loading"
     @dragenter.stop.prevent="fileBoxDragenter(true)"
     @dragleave.stop.prevent="fileBoxDragleave"
     @drop.stop.prevent="fileBoxDrop($event, true)"
     @dragover.stop.prevent=""
     @click="openFile">
    <div>
        <div class="upload-icon"></div>
    </div>
    <div class="upload-text">
        <span>将文件拖到此处,或</span>
        <span>点击上传</span>
        <div class="el-upload__tip" slot="tip">只能上传{
  {filePostfix}}文件,且不超过100M</div>
    </div>
</div>

相关方法:

/**
 * dragenter源对象进入过程对象范围内
 */
fileBoxDragenter(flag) {
   
    // 传入10ms的延迟锁,让drapleave在enter延迟后触发
    this.boxLock = true
    setTimeout(() => {
   
        this.boxLock = false
    }, 10)
    // dropType文件拖拽进选中范围的高亮效果
    this.dropType = flag
},

/**
 * dragleave源对象离开过程对象范围
 */
fileBoxDragleave() {
   
    if (this.boxLock) return
    this.dropType = false
},
/**
 * drop文件拖拽落下
 */
fileBoxDrop(e) {
   
    this.dropType = false
    let fileList = e.dataTransfer.files
    this.readFile(fileList)
},

2、获取上传的文件

readFile(fileList) {
    if (!fileList || fileList.length < 1) return
    if(fileList.length > 1) {
        this.$Imessage({
            message: `不支持一次上传多文件`,
            type: 'warning'
        })
        return
    }
    if(!this.multiple && this.fileList.length >= 1) { // 仅允许单个附件上传
        this.$Imessage({
            message: `不支持上传多个附件`,
            type: 'warning'
        })
        return
    }
    let file = fileList[0]
    if(this.validFile(file)) {
        tempFile = file
        this.$refs['paramForm'].validate(valid => {
            if(valid) {
                this.$emit('upload', tempFile, this.multiple)
            }
        })
    }
},

3、已上传文件展示、删除、下载
<!--已上传文件展示-->
<ul v-show="fileList.length>0" class="file-list">
    <li v-for="(item, index) in fileList" class="item-content">
        <a :title="item.name">
            
  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于el-upload组件封装,可以按照以下步骤进行: 1. 创建一个自定义组件,可以命名为Upload.vue 或者其他你喜欢的名字。 2. 在该组件中,引入el-upload组件,并根据需要设置相应的属性和事件。 3. 在组件的模板中,使用el-upload组件,并传入相应的props和event。 4. 在父组件中使用该封装组件,并根据需要传递参数和处理事件。 以下是一个简单的el-upload组件封装的示例代码: ```vue <template> <div> <el-upload :action="uploadUrl" :before-upload="handleBeforeUpload" :on-success="handleSuccess" :on-error="handleError" > <el-button size="small" type="primary">点击上传</el-button> </el-upload> </div> </template> <script> export default { data() { return { uploadUrl: 'your_upload_url' }; }, methods: { handleBeforeUpload(file) { // 处理上传前的逻辑,例如限制文件类型、大小等 }, handleSuccess(response, file, fileList) { // 处理上传成功后的逻辑 console.log('上传成功', response); }, handleError(error, file, fileList) { // 处理上传失败后的逻辑 console.log('上传失败', error); } } }; </script> <style> /* 可以根据需要进行样式调整 */ </style> ``` 在父组件中使用该自定义的Upload组件时,可以像普通的组件一样引入并使用: ```vue <template> <div> <Upload></Upload> </div> </template> <script> import Upload from '@/components/Upload.vue'; export default { components: { Upload } }; </script> ``` 这样你就可以在父组件中使用封装的el-upload组件了。你可以根据自己的需求,进一步调整和扩展该封装组件的功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值