前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >简化代码操作-文件上传组件封装

简化代码操作-文件上传组件封装

作者头像
何处锦绣不灰堆
发布2022-01-13 12:53:41
8950
发布2022-01-13 12:53:41
举报
文章被收录于专栏:农历七月廿一农历七月廿一
写在前面

最近一直在写关于angular的教程,但是因为一直没写到自己比较满意的一个状态,所以就先放到草稿箱里面吧,等我写的差不多以后再发出来,但是一直没有进行文章的更新也挺烦的,所以给大家封几个组件吧,简化大家的代码,今天从文件上传开始吧!后续我会更新别的一些组件封装的代码,你们希望哪些组件封装的可以留言,说清楚基于什么ui库即可!

特殊说明

为什么我说可以简化大家的操作呢,我们一般使用文件上传或者是封装文件上传的时候,只是将该文件封装为一个可以import导入使用的组件,但是我们在更新文件的时候,需要调用emit导出去的函数进行更新我们的文件列表,使用该组件可以直接将最终的结果给你,而不必操心中间的一切过程,最后所见即所得!这也是该组件分享给大家的一个目的!希望用的觉得不错的回来点个赞!当前是基于elementUI+vue进行封装

组件源码
代码语言:javascript
复制
<!--
 * @use: <Upload></Upload>
 * @description: 文件上传
 * @SpecialInstructions: 无
 * @Author: clearlove
 * @Date: 2021-12-18 21:49:14
 * @LastEditTime: 2021-12-22 13:51:10
 * @FilePath: /vue-backend-dev/src/components/Upload/index.vue
-->
<template>
<div>
    <el-upload v-model="finalList" ref="uploadFile" :on-change="onChange" :on-progress="onProgress" :before-upload="beforeUpload" :on-error="onError" :on-success="onSuccess" :on-preview="handlePreview" :on-remove="handleRemove" :before-remove="beforeRemove" :limit="limit" :on-exceed="handleExceed" :auto-upload="autoUpload" :data="params" :headers="headers" :list-type="listType" :multiple="multiple" :drag="drag" :action="action" :file-list="fileList">
        <template v-if="drag">
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
            <div class="el-upload__tip" slot="tip">{{fileDesc}}} </div>
        </template>
        <template v-else>
            <i class="el-icon-plus"></i>
            <div class="el-upload__tip" slot="tip">{{fileDesc}}</div>
        </template>
    </el-upload>
    <!-- 图片预览 -->
    <el-dialog :visible.sync="dialogVisible">
        <img width="100%" :src="dialogImageUrl" alt="">
    </el-dialog>
</div>
</template>

<script>
import {
    utils
} from '@/mixins'
import {
    baseURL
} from '@/util/https/http.js'
import {
    uploadFiles
} from '@/util/apis/common.js'
export default {
    name: "Upload",
    mixins: [utils],
    props: {
        //上传限制
        limit: {
            type: Number,
            default: () => 3
        },
        //是否支持拖拽
        drag: {
            type: Boolean,
            default: () => false
        },
        //是否支持多选
        multiple: {
            type: Boolean,
            default: () => true
        },
        //预览列表的形式 可选值 text/picture/picture-card
        listType: {
            type: String,
            default: () => "picture-card"
        },
        //上传时需要的入参
        params: {
            type: Object,
            default: () => {
                return {
                    type: 1
                }
            }
        },
        //是否在选取文件后立即进行上传
        autoUpload: {
            type: Boolean,
            default: () => true
        },
        //文件大小
        fileSize: {
            type: Number,
            default: () => 10
        },
        //是否自定义上传文件
        customize: {
            type: Boolean,
            default: () => false
        },
        //导出去的list
        finalListProps: {
            type: Array,
            default: () => []
        },
        fileDesc: {
            type: String,
            default: () => "只能上传图片文件,且不超过10M"
        }
    },
    data() {
        return {
            action: this.customize ? "" : baseURL + '/oss/file/upload', //baseURL + '/oss/file/upload',
            dialogImageUrl: '',
            dialogVisible: false,
            headers: {
                // "Content-type": "multipart/form-data"
            }, //请求头
            fileList: [],
            defaultParams: {
                type: 1
            },
            finalList: this.finalListProps,
        }
    },
    model: {
        prop: 'finalListProps',
        event: 'change'
    },
    watch: {
        finalList(n) {
            this.$emit('change', n)
        }
    },
    created() {
        console.log(this.action)
    },
    methods: {
        //上传文件之前的钩子,参数为上传的文件,若返回 false 或者返回 Promise 且被 reject,则停止上传。
        beforeUpload(file) {
            console.log("beforeUpload ====>")
            console.log(file)
            //进行大小的限制 限制为10MB
            const checkSize = file.size > 1024 * 1024 * this.fileSize
            //进行格式的限制 限制为图片
            const checkType = !file.type.includes("image")
            return new Promise((resolve) => {
                if (checkSize) {
                    this.$message.error('照片大小超过' + this.fileSize + "M!")
                    this.clearErrorList(file)
                    return false
                } else if (checkType) {
                    this.$message.error('图片格式有误!请重新选择')
                    this.clearErrorList(file)
                    return false
                } else {
                    resolve(file)
                }
            })
        },
        /**
         * @function handleRemove  文件删除
         * @params file 文件
         * @params fileList 文件列表
         */
        handleRemove(file, fileList) {
            console.log(file, fileList);
            if (file.status == 'success') {
                this.notifyTips('文件操作提示', '成功删除', 'success')
            } else {
                this.notifyTips('文件操作提示', "删除失败", 'error')
            }
        },
        //删除文件之前的钩子,参数为上传的文件和文件列表,若返回 false 或者返回 Promise 且被 reject,则停止删除。
        beforeRemove(file, fileList) {
            console.log("beforeRemove 文件删除====>")
            console.log(file)
            console.log(fileList)
            return new Promise((resolve, reject) => {
                this.$confirm('此操作将永久删除当前文件,是否继续?', '提示', {
                    confirmButtonText: '确定',
                    cancelButtonText: '取消',
                    type: 'warning'
                }).then(() => {
                    //清除当前列表的数据
                    resolve(file)
                    //将删除的list数据清除
                    this.finalList = this.delListById(file.response.data.id, this.finalList)
                }).catch(() => {
                    this.notifyTips('文件操作提示', "取消删除", 'warning')
                    reject(file)
                });
            })
        },
        /**
         * @function handlePreview  文件预览
         * @params file 文件
         * @params fileList 文件列表
         */
        handlePreview(file) {
            console.log("andlePreview 文件预览====>")
            console.log(file)
            this.dialogImageUrl = file.url;
            this.dialogVisible = true;
        },
        //文件超出个数限制时的钩子
        handleExceed(files, fileList) {
            console.log("handleExceed ====>")
            console.log(files)
            console.log(fileList)

        },
        //文件上传时候的钩子
        onSuccess(response, file, fileList) {
            console.log("onSuccess ====>")
            console.log(response)
            if (response.success) {
                this.$emit('onSuccess', response.data)
                let _data = {
                    imgUrl: response.data.url,
                    ossId: response.data.id,
                    imgName: response.data.fileName
                }
                this.finalList.push(_data)
            } else {
                this.clearErrorList(file)
            }
            console.log(file)
            console.log(fileList)
        },
        //文件上传失败
        onError(err, file, fileList) {
            this.clearErrorList(file)
            console.log("onError ====>")
            console.log(err)
            console.log(file)
            console.log(fileList)
        },

        //文件状态改变时的钩子,添加文件、上传成功和上传失败时都会被调用
        onChange(file, fileList) {
            console.log("onChange ====>")
            console.log(file)
            // this.$emit('getLists', res.data)
            console.log(fileList)
        },
        //文件上传时的钩子
        onProgress(event, file, fileList) {
            console.log("onProgress ====>")
            console.log(event)
            console.log(file)
            console.log(fileList)
        },
        //清除上传失败的文件列表 去除文件列表失败文件
        clearErrorList(file) {
            let uid = file.uid
            let idx = this.$refs.uploadFile.uploadFiles.findIndex(item => item.uid === uid)
            this.$refs.uploadFile.uploadFiles.splice(idx, 1)
        },
        //自定义上传文件 此时是不再执行上传成功的钩子  目前不使用
        upLaodFiles(files) {
            console.log("uploadFiles====>")
            console.log(files)
            let file = files.file
            console.log(file)
            let formData = new FormData();
            formData.append("uid", file.uid);
            formData.append("name", file.name);
            formData.append("size", file.size);
            formData.append("type", file.type);
            formData.append("webkitRelativePath", file.webkitRelativePath);
            formData.append("lastModified", file.lastModified);
            console.log(formData)
            let params = {
                file: formData,
                type: 1
            }
            uploadFiles(params).then(res => {
                console.log(res)
            }).catch(err => {
                console.log(err)
                this.clearErrorList(file)
            })
        },
    }
}
</script>

<style lang="less" scoped>
</style>
全局安装该组件 install.js
代码语言:javascript
复制
/*
 * @use: 
 * @description: 全局安装封装的组件
 * @SpecialInstructions: 无
 * @Author: clearlove
 * @Date: 2021-08-28 10:46:43
 * @LastEditTime: 2021-12-31 11:27:51
 * @FilePath: /activityGd/src/components/install.js
 */
// 组件全局注册
import Vue from 'vue'

import Upload from './Upload'
// 组件库
const Components = [   
    Upload,
]
// 注册全局组件
Components.map((com) => {
    Vue.component(com.name, com)
})
export default Vue
具体使用
第一步:main.js
代码语言:javascript
复制
import './components/install'
vue页面需要使用的地方
代码语言:javascript
复制
<Upload v-model="filelist"></Upload>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-12-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 特殊说明
  • 组件源码
  • 全局安装该组件 install.js
  • 具体使用
    • 第一步:main.js
      • vue页面需要使用的地方
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档