若依--文件上传前端

前端

ry的前端文件上传单独写了一个FileUpload.Vue文件。在main.js中进行了全局的注册,可以在页面中直接使用文件上传的组件。全局导入

在main.js中

import 组件名称 from '@/components/FileUpLoad'app.compoent(组件名称)   //全局挂载组件

在项目中使用

组件命令 中间有一个-。因为这是两个大写的单词拼接在一起的
<el-form-item label="选择文件" prop="file"><file-upload v-model="fileData"/>
</el-form-item>

对于上传FileUpload组件。

使用element-plus的el-upload组件

 <el-uploadmultiple   允许多个文件上传:action="uploadFileUrl"  上传的地址:before-upload="handleBeforeUpload"  在山川之间检查:file-list="fileList":limit="limit":on-error="handleUploadError":on-exceed="handleExceed":on-success="handleUploadSuccess":show-file-list="false":headers="headers"  //请求头class="upload-file-uploader"ref="fileUpload"  //拿到这个fileupload>//展示上传的文件列表<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul"><li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList"><el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank"><span class="el-icon-document"> {{file.fileName}}</span></el-link><div class="ele-upload-list__item-content-action"><el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link></div></li></transition-group>

上传文件需要携带token。所以需要导入

import { getToken } from "@/utils/auth";//请求头是键值对的形式
const headers = ref({ Authorization: "Bearer " + getToken() });
//上传组件绑定
:headers="headers"

基本的方法包括 上传之前需要校验文件格式和大小、文件数量、成功回调函数、失败回调函数、删除文件、上传结束。

defineProps 是 Vue 3 中的一个组合式 API,用于在组件中定义接收的 props。它允许你声明组件的属性及其类型和默认值,使得组件能够接收父组件传递的数据。具体功能如下:

定义父组件传过来的内容

const props = defineProps({modelValue: [String, Object, Array],// 数量限制limit: {type: Number,default: 10,},// 大小限制(MB)fileSize: {type: Number,default: 100,},// 文件类型, 例如['png', 'jpg', 'jpeg']fileType: {type: Array,default: () => ["doc", "xls", "ppt", "txt", "pdf",'mp3'],},// 是否显示提示isShowTip: {type: Boolean,default: true}
});

文件数据

//上传的数据
const uploadList = ref([]);  //这个是每一次点击上传后的内容const fileList = ref([]);  //所有的文件列表

上传成功回调函数

function handleUploadSuccess(res, file) {if (res.code ==200) {//将后端返回的数据赋值给uploadlist数组uploadList.value.push({ fileName: res.data.fileName, url: res.data.url });uploadedSuccessfully();} else {number.value--;proxy.$modal.closeLoading();proxy.$modal.msgError(res.msg);proxy.$refs.fileUpload.handleRemove(file);uploadedSuccessfully();}
}function uploadedSuccessfully() {if (number.value > 0 && uploadList.value.length === number.value) {//fileList 加上uploadlistfileList.value = fileList.value.concat(uploadList.value);//将filelist床穿给父组件emit("update:modelValue", fileList.value);proxy.$modal.closeLoading();uploadList.value = [];number.value = 0;}
}

v-model的语法糖使用。

emit 向父组件传递消息在 Vue 3 中,`v-model` 语法糖用于实现双向数据绑定,默认情况下,它实际上是通过发出 `update:modelValue` 事件与父组件进行通信的。### 工作原理1. **v-model 绑定**:- 当你在父组件中使用 `v-model="fileData"` 时,Vue 会自动将其转换为 `:modelValue="fileData"` 和 `@update:modelValue="value => fileData = value"` 的组合。2. **子组件的 emit**:- 在子组件中,调用 `emit("update:modelValue", fileList.value);` 会发出 `update:modelValue` 事件,并将当前的 `fileList.value` 作为新值传递。3. **父组件接收更新**:- 父组件通过 `@update:modelValue` 监听这个事件,接收到的值会自动更新到 `fileData` 中,实现双向绑定。### 总结因此,使用 `v-model` 使得父组件能够方便地接收子组件通过 `emit("update:modelValue", ...)` 发送的数据更新,从而实现了更简洁的状态管理和组件通信。
watch(() => props.modelValue, val => {if (Array.isArray(val) && val.length) {fileList.value = val.map(item => {return {fileName: item.fileName || item,url: item.url || item,// uid: item.uid || new Date().getTime()uid: item.uid || new Date().getTime()};});} else {fileList.value = [];}
}, { deep: true, immediate: true });
这段代码使用 Vue 3 的 `watch` API 来监视 `props.modelValue` 的变化,并根据这个变化更新 `fileList`。具体来说,它的功能如下:### 代码分析1. **监视 `props.modelValue`**:```javascriptwatch(() => props.modelValue, val => { ... }, { deep: true, immediate: true });
  • () => props.modelValue:这是一个计算属性,用于获取 modelValue 的值。
  • val:当 modelValue 发生变化时,这个回调函数将被调用,val 是新的值。
  1. 判断类型和内容

    if (Array.isArray(val) && val.length) { ... } else { fileList.value = []; }
    
    • 检查 val 是否是一个数组且非空。如果是,执行下一步;否则,将 fileList.value 设置为空数组。
  2. 映射 fileList

    fileList.value = val.map(item => { ... });
    
    • 使用 map 方法遍历 val 数组,将每个元素转换为一个对象,包含 fileNameurluid。如果 item 没有提供 fileNameurl,则使用 item 本身。
  3. 选项

    • { deep: true }:如果 modelValue 是一个嵌套对象,深度监视将确保任何内部属性的变化也会触发回调。
    • { immediate: true }:在组件初始挂载时立即调用回调,以便在初始渲染时更新 fileList

总结

这段代码的主要作用是确保当 modelValue 更新时,fileList 也会随之更新,从而保持两个数据状态的一致性。如果 modelValue 是一个有效的数组,fileList 将根据其内容进行填充;如果不是,fileList 将被清空。这种方式适用于处理上传文件列表或类似的场景。


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

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

相关文章

SwipeRefreshLayout和ViewPager滑动冲突的原因和正确的解决方式

重写SwipeRefreshLayout的onIntercept方法就可以很简单的解决了。 思路&#xff1a; 因为下拉刷新&#xff0c;只有纵向滑动的时候才有效&#xff0c;那么我们就判断此时是纵向滑动还是横向滑动就可以了。纵向滑动就拦截事件&#xff0c;横向滑动不拦截。怎么判断是纵向滑动还…

vue ui指令打不开图形化界面解决方案

原因&#xff1a;由于我的node版本过高 和脚手架版本(3)不兼容 导致无法正常运行指令vue ui从而打开图形化界面管理vue项目 报错信息为TypeError: Function.prototype.apply was called on undefined, which is a undefined and not a function 解决措施&#xff1a;我们可以降…

828华为云征文|华为云 Flexus X 实例之家庭娱乐中心搭建

话接上文《828华为云征文&#xff5c;华为云Flexus X实例初体验》&#xff0c;这次我们利用手头的 Flexus X 实例来搭建家庭影音中心和密码管理环境。 前置环境 为了方便小白用户甚至运维人员&#xff0c;我觉得现阶段的宝塔面板 和 1Panel 都是不错的选择。我这里以宝塔为例…

GPTQ vs AWQ vs GGUF(GGML) 速览和 GGUF 文件命名规范

简单介绍一下四者的区别。 参考链接&#xff1a;GPTQ - 2210.17323 | AWQ - 2306.00978 | GGML | GGUF - docs | What is GGUF and GGML? 文章目录 GPTQ vs AWQ vs GGUF&#xff08;GGML&#xff09; 速览GGUF 文件命名GGUF 文件结构文件名解析答案 附录GGUF 文件命名GGUF 文件…

maven安装本地jar包到本地仓库

有时候我们需要把本地的 jar 包 install 到本地的 maven 仓库&#xff0c;这时就需要手动install依赖项。例如&#xff0c;把下面的 zhdx-license-1.0.jar 安装到本地 maven 仓库的操作如下&#xff1a; <dependency><groupId>com.zhdx</groupId><artifa…

CSS综合页布面局案例

写的比较一般,如果想要参考可以点击链接。 CSS综合案例(登录页面)资源-CSDN文库 引言: 我们学习CSS和HTML都是为了想要做一个网页布局,但是每逢上手可能就会需要查阅很多语言,我觉得是没有什么问题的,熟能生巧,编程是需要练的,但是写网页的时候需要实现某个效果时需…

Resdis中关于字符串类型的基础命令

本文主要详解key-value中vaule为字符串类型的情况&#xff0c;value属于其他的数据类型不适应&#xff1b;有几个命令是通用命令 目录 1.set和get 2.keys 3.exists 4.del 5.expire 6.ttl 7.type 8.object encoding key 9.加减操作 10.字符串操作 11.命令小结 1.se…

DCGAN生成漫画头像

tutorials/application/source_zh_cn/generative/dcgan.ipynb MindSpore/docs - Gitee.com 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动漫头像数据集共有70,17…

python UNIT 3 选择与循环(2)

目录 1。循环的优化 经典优化分析&#xff1a; 未优化的代码&#xff1a; 细节分析&#xff1a; 优化后的代码&#xff1a; 优化的细节&#xff1a; 性能对比 优化的关键在于&#xff1a; 经典习题讲解&#xff1a;(紫色的解析请重点关注一下) 1。例三 个人代码解析…

linux常用的命令

一、cd&#xff1a;Change directory 修改工作目录 cd / #进入根目录 cd - #返回上次的目录 cd #返回home目录 cd ~ #返回home目录 cd ../ # 返回上一级目录二、ls&#xff1a;List files 列出目录内容 -a 列出包括.a开头的隐藏文件的所有文件 -A 通-a&#xff0c;但…

SpringMVC源码-AbstractUrlHandlerMapping处理器映射器将实现Controller接口的方式定义的路径存储进去

DispatcherServlet的initStrategies方法用来初始化SpringMVC的九大内置组件 initStrategies protected void initStrategies(ApplicationContext context) {// 初始化 MultipartResolver:主要用来处理文件上传.如果定义过当前类型的bean对象&#xff0c;那么直接获取&#xff0…

随笔(四)——代码优化

文章目录 前言1.原本代码2.新增逻辑3.优化逻辑 前言 原逻辑&#xff1a;后端data数据中返回数组&#xff0c;数组中有两个对象&#xff0c;一个是属性指标&#xff0c;一个是应用指标&#xff0c;根据这两个指标展示不同的多选框 1.原本代码 getIndicatorRange(indexReportLi…

java集合 -- 面试

Java集合框架体系 ArrayList底层实现是数组 LinkedList底层实现是双向链表 HashMap的底层实现使用了众多数据结构&#xff0c;包含了数组、链表、散列表、红黑树等 List ps : 数据结构 -- 数组 ArrayList源码分析 ArrayList底层的实现原理是什么? ArrayList list new…

Electron 进程通信

预加载&#xff08;preload&#xff09;脚本只能访问部分 Node.js API&#xff0c;但是主进程可以访问全部API。此时&#xff0c;需要使用进程通信。 比如&#xff0c;在preload.js中&#xff0c;不能访问__dirname&#xff0c;不能使用 Node 中的 fs 模块&#xff0c;但主进程…

数据挖掘中的常见误区与注意事项

一、引言 数据挖掘是一种通过算法和统计分析方法从大量数据中提取有价值信息的技术。 然而&#xff0c;在这个过程中&#xff0c;我们可能会遇到一些常见的误区。 二、常见误区及具体例子 1. 误区一&#xff1a;数据越多越好 某电商公司收集了数百万用户的购物数据&#xff0c…

简单两步,Spring Boot 定时任务也能动态设置

在Spring Boot项目中实现定时任务通常涉及到使用Scheduled注解&#xff0c;这种方式简单直接&#xff0c;但往往存在一个问题&#xff1a;一旦应用启动&#xff0c;定时任务的执行时间和频率就被固定下来了&#xff0c;难以在不重启应用的情况下进行动态调整。为了实现Spring B…

深度学习的未来:推动人工智能进化的新前沿

深度学习的未来&#xff1a;推动人工智能进化的新前沿 深度学习是近年来人工智能&#xff08;AI&#xff09;领域的核心技术&#xff0c;它在图像识别、自然语言处理和语音识别等多个领域取得了突破性进展。作为机器学习的一种&#xff0c;深度学习通过模拟人脑的神经网络结构…

第二十一章 (动态内存管理)

1. 为什么要有动态内存分配 2. malloc和free 3. calloc和realloc 4. 常⻅的动态内存的错误 5. 动态内存经典笔试题分析 6. 总结C/C中程序内存区域划分 1.为什么要有动态内存管理 我们目前已经掌握的内存开辟方式有 int main() {int num 0; //开辟4个字节int arr[10] …

Django 配置邮箱服务,实现发送信息到指定邮箱

一、这里以qq邮箱为例&#xff0c;打开qq邮箱的SMTP服务 二、django项目目录设置setting.py 文件 setting.py 添加如下内容&#xff1a; # 发送邮件相关配置 EMAIL_BACKEND django.core.mail.backends.smtp.EmailBackend EMAIL_USE_TLS True EMAIL_HOST smtp.qq.com EMAIL…

828华为云征文|部署多功能集成的协作知识库 AFFiNE

828华为云征文&#xff5c;部署多功能集成的协作知识库 AFFiNE 一、Flexus云服务器X实例介绍二、Flexus云服务器X实例配置2.1 重置密码2.2 服务器连接2.3 安全组配置2.4 Docker 环境搭建 三、Flexus云服务器X实例部署 AFFiNE3.1 AFFiNE 介绍3.2 AFFiNE 部署3.3 AFFiNE 使用 四、…