vue-使用input封装上传文件图片全局组件

前言

  • 实际开发过程中,我们经常遇见需要上传文件图片功能,可以封装一个全局组件来调用

  • 原理很简单,首先获取到文件或图片对象,调用自己公司文档服务器的接口,上传文件图片

  • 为了方便用户体验,我们应该在上传之前开启遮罩层,上传成功之后关闭遮罩层。

  • 我们还可以根据实际开发场景自定义把url和文件名称传回父组件

代码实现

1.定义api
export function uploadvideo (data) {return request({url: '/upload/video',method: 'post',headers: { 'Content-Type': 'multipart/form-data' },data})
}
2.在src/components/建立DocUpload文件夹/index.vue-代码如下
<template><el-dialogtitle="上传":visible.sync="dialogVisible"width="40%":before-close="handleClose"><el-form ref="form" :model="form" size="small" label-width="80px"><el-form-item label="文件名称:"><el-input v-model="form.contitle" disabled></el-input></el-form-item><el-form-item label="文件上传:"><div class="uppicture"><input type="file" class="upinput" ref="file" @change="showimg" /><i class="el-icon-plus" id="changes" @click="changeimg"></i><p>上传合同文件附件</p></div><el-button type="primary" class="uploadbutton" @click="addupload">上传附件</el-button></el-form-item></el-form>
​<span slot="footer" class="dialog-footer"><el-button @click="handleClose" style="background: #f7f7f7" size="small">取 消</el-button><!-- <el-button type="primary" @click="upload">确 定</el-button> --></span></el-dialog>
</template>
​
<script>
import { uploadvideo } from '@/api/entering'
// 遮罩层
import { Loading } from 'element-ui'
export default {name: 'DocUpload',data () {return {form: {// 合同名称contitle: ''},formdata: {}}},props: {// 显示隐藏dialogVisible: {type: Boolean,//   必传required: true}},methods: {// 关闭之前handleClose () {console.log('关闭之前')// .sync语法糖,单向数据流问题,// 父组件传递给子组件的数据,子组件直接修改会报错,需要传递给父组件修改this.$emit('update:dialogVisible', false)},// 输入款获取事件showimg () {const that = thisconsole.log(that.$refs.file)console.log(that.$refs.file.files[0])// 文件名称复制that.form.contitle = that.$refs.file.files[0].name// 声明一个formdata对象this.formdata = new FormData()// 赋值需要传递的文件this.formdata.append('multipartFile', that.$refs.file.files[0])},// 图标触发输入框事件changeimg () {// 点击图标时候,触发input选择文件按钮this.$refs.file.dispatchEvent(new MouseEvent('click'))},// 上传附件async addupload () {// 上传文文件提示,未选择文件提示用户if (!this.form.contitle) {return this.$message.warning('请先在左侧上传文件')}//开启遮罩层let loadingInstance = Loading.service({lock: true, //lock的修改符--默认是falsetext: '正在上传文件,请耐心等待', //显示在加载图标下方的加载文案spinner: 'el-icon-loading', //自定义加载图标类名background: 'rgba(0, 0, 0, 0.7)', //遮罩层颜色target: document.querySelector('#futureTransferDialog') //loadin覆盖的dom元素节点})const res = await uploadvideo(this.formdata)console.log('文档服务器上传文件', res)// 传递文件存储idthis.$emit('updataurl', res.data.url)// 回显文件名称给父组件的form表单this.$emit('updata', this.form.contitle)//  清空表单this.form.contitle = ''this.formdata = {}// 关闭弹框this.handleClose()//关闭遮罩层loadingInstance.close()}}
}
</script>
​
<style lang="scss" scoped>
::v-deep .el-dialog {border-radius: 10px;.el-dialog__header {border-radius: 9px 9px 0 0;background-color: #1488c6;padding: 8px 20px;.el-dialog__title {color: white;font-size: 16px;}
​.el-dialog__headerbtn {top: 12px;i {color: white;}}}.el-dialog__footer {text-align: center;}.el-dialog__body {padding: 12px;}.uppicture {width: 120px;height: 120px;border: 1px solid #717376;position: relative;cursor: pointer;input {width: 100%;height: 100%;vertical-align: middle;opacity: 0;}i {position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);font-size: 30px;// background-color: skyblue;}p {position: absolute;bottom: -2px;left: 50%;word-break: keep-all;transform: translate(-50%);}.uploadbutton {position: absolute;bottom: 0;margin-left: 20px;position: relative;}&:hover {color: #2da9fa;border: 1px solid #2da9fa;p {color: #2da9fa;}}}.uploadbutton {position: absolute;top: 70%;left: 150px;}
}
</style>
3.全局组件注册-省略
4.父组件使用
4.1组件使用
<DocUpload:dialogVisible.sync="dialogannex"//  form是父组件表单,上传成功之后,直接通过子传父,把url和文件名称传递到父组件表单@updata="form.name = $event"@updataurl="form.ontractAttachment = $event"></DocUpload>
4.2父组件data
 // 上传组件开关dialogannex: false,// 表单form: {},
4.3打开组件-methods
addupload () {this.dialogannex = true
},

总结:

经过这一趟流程下来相信你也对 vue-使用input封装上传文件图片全局组件 有了初步的深刻印象,但在实际开发中我 们遇到的情况肯定是不一样的,所以我们要理解它的原理,万变不离其宗。加油,打工人!

有什么不足的地方请大家指出谢谢 -- 風过无痕

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/160253.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Godot

前言 为什么要研究开源引擎 主要原因有&#xff1a; 可以享受“信创”政策的红利&#xff0c;非常有利于承接政府项目。中美脱钩背景下&#xff0c;国家提出了“信创”政策。这个政策的核心就是&#xff0c;核心技术上自主可控。涉及的产业包括&#xff1a;芯片、操作系统、数据…

【Django使用】md文档10大模块第5期:Django数据库增删改查和Django视图

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能强大的第三方插件&#xff0c;你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展…

Vue项目 配置项设置

一、项目运行时浏览器自动打开 找到package.json文件 找到"sctipts"配置项 在"serve"配置项最后加上--open "scripts": {"serve": "vue-cli-service serve --open","build": "vue-cli-service build&quo…

Redis面试内容,Redis过期策略,Redis持久化方式,缓存穿透、缓存击穿和缓存雪崩,以及解决办法

文章目录 一、redis什么是RedisRedis使用场景1、缓存2、数据共享[分布式](https://so.csdn.net/so/search?q分布式&spm1001.2101.3001.7020)3、分布式锁4、全局ID5、计数器6、限流7、位统计 Redis有5中数据类型&#xff1a; SSHLZRedis中一个key的值每天12点过期&#xff…

Cookie、Session、CBV加装饰器的三种方法

【0】cookie、session和Token的发展史 【1】Cookie的形式 存储形式&#xff1a;k&#xff1a;v键值对存储位置&#xff1a;客户端缺点&#xff1a;不安全&#xff0c;信息可能会泄露 【2】session的形式 标识符&#xff0c;表示我是当前用户加密出来的数据对敏感信息进行加密…

排序算法-----快速排序(非递归实现)

目录 前言 快速排序 基本思路 非递归代码实现 前言 很久没跟新数据结构与算法这一栏了&#xff0c;因为数据结构与算法基本上都发布完了&#xff0c;哈哈&#xff0c;那今天我就把前面排序算法那一块的快速排序完善一下&#xff0c;前面只发布了快速排序递归算法&#xff0c;…

单链表相关面试题--3.链表的中间节点

3.链表的中间节点 876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; /* 解题思路&#xff1a; 通过快慢指针找到中间节点&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff0c;当快指针走到结尾的时候&#xff0c;慢指针正好走到中间位置 */ typ…

HTTPS协议的加密流程

目录 一&#xff0c;HTTPS是什么 二&#xff0c;两种加密方式 三&#xff0c;HTTPS的加密过程 3.1 引入对称加密 3.2 引入非对称加密 3.3 引入证书 一&#xff0c;HTTPS是什么 HTTPS也是一个应用层协议&#xff0c;它是在HTTP协议的基础上引入了一个加密层。因为HTTP协议…

每天一道算法题(十)——获取和为k的子数组

文章目录 1、问题2、示例3、解决方法&#xff08;1&#xff09;方法1——双指针 总结 1、问题 给你一个整数数组 nums 和一个整数 k &#xff0c;请你统计并返回 该数组中和为 k 的子数组的个数 。 子数组是数组中元素的连续非空序列。 2、示例 示例 1&#xff1a; 输入&#x…

多分类自定义采样比例

多分类自定义采样比例 import torch from torch.utils.data import DataLoader, Dataset, WeightedRandomSampler from torchvision import transforms from torchvision.datasets import ImageFolder# 假设你有一个自定义的数据集类 class CustomDataset(Dataset):def __init…

51单片机按键控制LED灯亮灭的N个玩法

51单片机按键控制LED灯亮灭的N个玩法 1.概述 这篇文章介绍按键的使用&#xff0c;以及通过控制LED灯的小实验&#xff0c;发现按键中存在的问题&#xff0c;然后思考并解决这些问题。达到熟练使用按键控制元器件。 2.搭建硬件环境 1.硬件准备 名称型号数量单片机STC12C205…

2023全球数字贸易创新大赛9-12

目录 回答评委提问:先说痛点-再说怎样解决 食品安全溯源是否全流程 星火• 链网

Sleuth

Sleuth 一 引言 随着服务的越来越多&#xff0c;对调⽤链的分析会越来越复杂。它们之间的调⽤关系也许如下图&#xff1a; 问题&#xff1a; 1&#xff1a;微服务之间的调⽤错综复杂&#xff0c;⽤户发送的请求经历那些服务&#xff0c;调⽤链不清楚&#xff0c;没有⼀ 个⾃…

【SpringCloud微服务全家桶学习笔记-Hystrix(服务降级,熔断,接近实时的监控,服务限流等)】

服务雪崩 &#xff08;微服务面临的问题&#xff09; 多个微服务之间调用的时候&#xff0c;假设微服务A调用微服务B和微服务C&#xff0c;微服务B和微服务C又调用其它的微服务&#xff0c;这就是所谓的“扇出”。如果扇出的链路上某个微服务的调用响应时间过长或者不可用&…

HarmonyOS开发(五):常用基础组件

1、组件介绍 组件&#xff08;Component&#xff09;,是界面搭建及显示的最小单元。 组件根据功能可以分为五大类&#xff1a;基础组件、容器组件、媒体组件、绘制组件、画布组件 2、基础组件 基础组件是视图层的基本组成单元&#xff0c;它包含&#xff1a;Text、Image、T…

OpenCV C++ 张正友相机标定【相机标定原理、相机标定流程、图像畸变矫正】

文章目录 3.1 标定原理3.2 相机标定流程步骤1:采集棋盘格图像,批处理(调整尺寸、重命名)步骤2:提取棋盘格内角点坐标步骤3:进一步提取亚像素角点信息在棋盘标定图上绘制找到的内角点(非必须,仅为了显示)步骤4:相机标定--计算出相机内参数矩阵和畸变系数步骤5:畸变图像…

Spring (二)@Order, Ordered 失效

Spring &#xff08;二&#xff09;Order, Ordered 失效 先上例子 public class OrderAnnotationExample {Order(2)static class MyBeanFactoryPostProcessor1 implements BeanFactoryPostProcessor {Overridepublic void postProcessBeanFactory(ConfigurableListableBeanFa…

如何加速JavaScript 代码运行速度

如何加速JavaScript 代码运行速度 前言减少DOM访问避免不必要的变量延迟script加载异步和同步使用异步编程避免使用With关键词 前言 本文主要通过五个方面来讲解如何使Js代码得到性能优化&#xff0c;从而实现加快Js代码运行速度的作用。那么好&#xff0c;本文正式开始。 减…

感染了后缀为.[bkpsvr@firemail.cc].EKING勒索病毒如何应对?数据能够恢复吗?

导言&#xff1a; 在当前数字时代&#xff0c;勒索病毒成为网络威胁的一大隐患。本文将深入介绍一种名为[bkpsvrfiremail.cc].EKING的勒索病毒&#xff0c;以及如何应对遭受其攻击后&#xff0c;有效地恢复被加密的数据文件&#xff0c;并提供一些预防措施以减少感染的风险。数…

sqlserver==索引解析,执行计划,索引大小

1创建测试表 -- 创建大型表 CREATE TABLE LargeTableWithIndex (ID int IDENTITY(1,1) PRIMARY KEY,IndexedColumn int,NonIndexedColumn nvarchar(255),OtherData nvarchar(255) );2插入测试数据 -- 使用 T-SQL 插入大量数据 DECLARE @i int = 1; WHILE @i <= 100000 -- …