若依--文件上传前端

news/2024/10/5 1:43:24 标签: 前端, 状态模式, 若依, 低代码开发, 文件上传

前端

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-upload
      multiple   允许多个文件上传
      :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 加上uploadlist
    fileList.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`**:
   ```javascript
   watch(() => 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.niftyadmin.cn/n/5690563.html

相关文章

音视频入门基础:FLV专题(9)——Script Tag简介

一、SCRIPTDATA 根据《video_file_format_spec_v10_1.pdf》第75页到76页&#xff0c;如果某个Tag的Tag header中的TagType值为18&#xff0c;表示该Tag为Script Tag&#xff08;脚本Tag&#xff0c;又称Data Tag、SCRIPTDATA tag&#xff09;。这时如果Filter的值不为1表示未加…

AIGC:生成式人工智能的5个层次

随着人工智能技术的迅猛发展&#xff0c;生成式人工智能在多个领域展现出巨大的应用潜力。为了帮助大家理解生成式人工智能的进化过程&#xff0c;我们借鉴“真格基金”的分类方式&#xff0c;将其应用分为五个层次&#xff0c;每个层次代表了 AI 与人类合作深度的不同。在这篇…

LeNet与AlexNet原理

LeNet-5网络 也就是说&#xff0c;模型很容易搭建&#xff0c;真正的难点在于数据处理和训练以及后续验证 LeNet(LeNet-5)两个部分&#xff1a;特征提取部分由两个卷积层和两个平均池化层组成&#xff1b;全连接层&#xff1a;由三个全连接层组成。 模型单元结构&#xff1a…

深入探讨Windows 11专业版与Windows 11专业工作站版的差异

前言 深入探讨Windows 11专业版与Windows 11专业工作站版的差异&#xff0c;可以更全面地理解这两款操作系统版本面向的不同用户群体、硬件支持、性能特点以及应用场景&#xff0c;从而为专业用户和企业选择最合适的平台提供依据。 硬件支持与扩展能力 Windows 11专业版&…

Vue3实现动态菜单功能

文章目录 0.效果演示1.搭建Vue3项目1.1 vite 脚手架创建 Vue3 项目1.2 设置文件别名1.3 安装配置 element-plus1.4 安装配置路由2.登录页面3.后台管理页面3.1 搭建后台框架3.2 左侧菜单栏3.3 header 用户信息3.4 主要内容3.5 footer4.配置静态路由5.记录激活菜单5.1 el-menu 绑…

等额本金和等额本息是什么意思?

等额本金和等额本息是两种常见的贷款还款方式&#xff0c;它们各自有着不同的特点和适用场景。下面我将用通俗易懂的语言来解释这两种还款方式&#xff1a; 等额本金 定义&#xff1a;等额本金指的是在贷款期限内&#xff0c;每月偿还相同数额的本金&#xff0c;而利息则随着剩…

使用python基于DeepLabv3实现对图片进行语义分割

DeepLabv3 介绍 DeepLabv3 是一种先进的语义分割模型&#xff0c;由 Google Research 团队提出。它在 DeepLab 系列模型的基础上进行了改进&#xff0c;旨在提高图像中像素级分类的准确性。以下是 DeepLabv3 的详细介绍&#xff1a; 概述DeepLabv3 是 DeepLab 系列中的第三代…

22.2 k8s中ksm采集的使用的dns解析

本节重点介绍 : k8s 会为service创建cordns解析pod中dns的搜索域模拟prometheus进行dns解析后访问数据 k8s对象资源指标 kube-stats-metrics项目 prometheus 采集kube-state-metrics通过下面的配置段&#xff0c; - job_name: kube-state-metricshonor_timestamps: truescr…