vue+element-plus上传图片及回显问题及数量限制

让我详细讲解一下“vue+element-plus上传图片及回显问题及数量限制”的完整攻略。

1. 准备工作

在开始写代码之前,需要先准备好以下工具和库:

  • vue.js:一个流行的 JavaScript 框架,用于构建前端应用程序。
  • element-plus:一个基于 Element UI 的 Vue 3 组件库,提供了丰富的 UI 组件和样式。
  • axios:一个简单易用的 http 客户端,用于处理前后端之间的数据传输。

2. 实现图片上传

2.1 HTML 代码

首先,需要在 HTML 中添加一个文件上传的 input 标签,示例代码如下:

<el-upload
  class="upload-demo"
  :action="uploadUrl"
  :limit="10"
  :on-exceed="handleExceed"
  :headers="headers"
  :data="{uploadType: 'image'}"
  :on-success="handleSuccess"
  :file-list="fileList"
>
  <el-button size="small" type="primary">上传图片</el-button>
  <div slot="tip" class="el-upload__tip">上传图片数量不得超过 10 张</div>
</el-upload>
  • class="upload-demo":设置样式,用于自定义样式;
  • :action="uploadUrl":指定上传的接口地址;
  • :limit="10":设置上传图片的最大数量为 10 张;
  • :on-exceed="handleExceed":当上传图片数量超出限制时触发的函数;
  • :headers="headers":设置请求头;
  • :data="{uploadType: 'image'}":额外的上传参数;
  • :on-success="handleSuccess":上传成功后的回调函数;
  • :file-list="fileList":显示已上传的图片列表。

2.2 JavaScript 代码

然后,在 Vue 组件中实现上传图片的相关逻辑,示例代码如下:

import axios from 'axios'

export default {
  data () {
    return {
      fileList: [],  // 已上传的图片列表
      uploadUrl: '/api/upload/image',  // 上传图片的接口地址
      headers: {Authorization: 'Bearer ' + localStorage.getItem('token')}  // 请求头
    }
  },
  methods: {
    handleExceed (files, fileList) {
      this.$message.warning(`只能上传 ${this.limit} 张图片!`)
    },
    handleSuccess (response, file, fileList) {
      this.fileList.push({
        id: response.id,
        url: response.url
      })
      this.$message.success('图片上传成功!')
    }
  }
}
  • fileList: []:初始化一个空的图片列表;
  • uploadUrl: '/api/upload/image':指定上传图片的接口地址;
  • headers: {Authorization: 'Bearer ' + localStorage.getItem('token')}:设置请求头;
  • handleExceed:当上传图片数量超出限制时触发的函数;
  • handleSuccess:上传成功后的回调函数;
  • id: response.id:将上传成功后返回的图片 ID 存储在图片列表中;
  • url: response.url:将上传成功后返回的图片 URL 存储在图片列表中。

3. 实现图片回显

3.1 HTML 代码

为了在页面中显示已上传的图片,需要添加一个图片列表,示例代码如下:

<el-image
  v-for="(item, index) in fileList"
  :key="item.id"
  :src="item.url"
  fit="contain"
  :preview-src-list="[item.url]"
  :lazy="false"
>
</el-image>
  • v-for="(item, index) in fileList":遍历已上传的图片列表;
  • :key="item.id":设置每个图片的唯一标识;
  • :src="item.url":指定要显示图片的 URL;
  • fit="contain":设置图片显示方式为自适应;
  • :preview-src-list="[item.url]":设置图片预览列表;
  • :lazy="false":关闭图片懒加载。

3.2 JavaScript 代码

为了在页面中显示已上传的图片,还需要在 Vue 组件中实现获取已上传的图片列表的接口,示例代码如下:

export default {
  data () {
    return {
      fileList: []  // 初始化一个空的图片列表
    }
  },
  mounted () {
    // 在组件挂载完成之后立即获取已上传的图片列表
    this.getFileList()
  },
  methods: {
    getFileList () {
      // 发送请求获取已上传的图片列表,并将返回的数据存储在 fileList 中
      axios.get('/api/upload/image/list').then(res => {
        this.fileList = res.data
      })
    }
  }
}
  • getFileList:定义获取已上传的图片列表的函数;
  • axios.get('/api/upload/image/list').then(res => { this.fileList = res.data }):发送请求获取已上传的图片列表,并将返回的数据存储在 fileList 中。

4. 图片数量限制

在 HTML 中的上传组件中,我们设置了图片上传的最大数量为 10 张,当用户上传的图片数量超出限制时,会触发 handleExceed 回调函数,示例代码如下:

handleExceed (files, fileList) {
  this.$message.warning(`只能上传 ${this.limit} 张图片!`)
}

在该函数中,我们可以使用 this.$message 方法弹出一个提示框,告知用户上传图片的数量超出限制。

同时,我们还可以在后端的图片上传接口中进行数量限制的验证,示例代码如下:

if (files.length > 10) {
  return res.status(400).json({ message: '只能上传 10 张图片!' })
}

这样,当用户上传的图片数量超出限制时,服务器会返回一个 HTTP 状态码为 400 的错误对象,并在错误对象中添加一个 message 属性,以向前端发送错误信息。

5. 示例演示

下面给出两个示例,分别演示了如何上传单张图片和批量上传多张图片。

5.1 示例1:上传单张图片

HTML 代码:

<template>
  <div>
    <h3>上传单张图片</h3>
    <el-upload
      class="upload-demo"
      :action="uploadUrl"
      :limit="1"
      :on-exceed="handleExceed"
      :headers="headers"
      :data="{uploadType: 'image'}"
      :on-success="handleSuccess"
      :file-list="fileList"
    >
      <el-button size="small" type="primary">上传图片</el-button>
      <div slot="tip" class="el-upload__tip">只能上传 1 张图片</div>
    </el-upload>
    <el-image
      :src="fileList[0] ? fileList[0].url : ''"
      fit="contain"
      :lazy="false"
    >
    </el-image>
  </div>
</template>

JavaScript 代码:

<script>
import axios from 'axios'

export default {
  data () {
    return {
      fileList: [],  // 已上传的图片列表
      uploadUrl: '/api/upload/image',  // 上传图片的接口地址
      headers: {Authorization: 'Bearer ' + localStorage.getItem('token')}  // 请求头
    }
  },
  methods: {
    handleExceed (files, fileList) {
      this.$message.warning(`只能上传 ${this.limit} 张图片!`)
    },
    handleSuccess (response, file, fileList) {
      this.fileList = [{
        id: response.id,
        url: response.url
      }]
      this.$message.success('图片上传成功!')
    }
  }
}
</script>

5.2 示例2:批量上传多张图片

HTML 代码:

<template>
  <div>
    <h3>批量上传多张图片</h3>
    <el-upload
      class="upload-demo"
      :action="uploadUrl"
      :limit="10"
      :on-exceed="handleExceed"
      :headers="headers"
      :data="{uploadType: 'image'}"
      :on-success="handleSuccess"
      :file-list="fileList"
    >
      <el-button size="small" type="primary">上传图片</el-button>
      <div slot="tip" class="el-upload__tip">上传图片数量不得超过 10 张</div>
    </el-upload>
    <el-image
      v-for="(item, index) in fileList"
      :key="item.id"
      :src="item.url"
      fit="contain"
      :preview-src-list="[item.url]"
      :lazy="false"
    >
    </el-image>
  </div>
</template>

JavaScript 代码:

<script>
import axios from 'axios'

export default {
  data () {
    return {
      fileList: [],  // 已上传的图片列表
      uploadUrl: '/api/upload/image',  // 上传图片的接口地址
      headers: {Authorization: 'Bearer ' + localStorage.getItem('token')}  // 请求头
    }
  },
  mounted () {
    // 在组件挂载完成之后立即获取已上传的图片列表
    this.getFileList()
  },
  methods: {
    handleExceed (files, fileList) {
      this.$message.warning(`只能上传 ${this.limit} 张图片!`)
    },
    handleSuccess (response, file, fileList) {
      this.fileList.push({
        id: response.id,
        url: response.url
      })
      this.$message.success('图片上传成功!')
    },
    getFileList () {
      // 发送请求获取已上传的图片列表,并将返回的数据存储在 fileList 中
      axios.get('/api/upload/image/list').then(res => {
        this.fileList = res.data
      })
    }
  }
}
</script>

这两个示例演示了如何通过 Vue.js 和 Element Plus 实现图片上传、回显和数量限制的功能。在实际项目中,可以根据需求进行相应的定制,并适配自己的业务场景。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:vue+element-plus上传图片及回显问题及数量限制 - Python技术站

(0)
上一篇 2023年6月9日
下一篇 2023年6月9日

相关文章

  • CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解

    这里是关于“CSS3自定义滚动条样式 ::webkit-scrollbar的示例代码详解”的完整攻略。 什么是::webkit-scrollbar ::webkit-scrollbar是一个用于Webkit内核浏览器(如Chrome、Safari)的CSS3伪元素,它用于定义滚动条的样式。通过对该伪元素进行样式修改,可以实现滚动条的自定义样式,从而提高网站的…

    css 2023年6月10日
    00
  • mac版vscode注释时怎么先插入空格?

    在Mac版的VSCode编辑器中,我们可以使用以下快捷键快速注释当前选中的代码段或行: 注释单行代码:选中要注释的行,按下“Command+/”(⌘+/)注释多行代码:选中要注释的多行代码,按下“Shift+Option+A”(⇧+⌥+A) 默认情况下,使用这些快捷键会将选中的代码注释掉,但并不会在注释符号“//”和代码之间插入空格,这会导致注释的可读性不够…

    css 2023年6月9日
    00
  • css3手动实现pc端横向滚动

    针对“css3手动实现pc端横向滚动”的完整攻略,我将从下面这几个部分来逐一讲解: 实现横向滚动的前提 实现原理介绍 实现步骤及示例说明 下面我们来逐一讲解。 1. 实现横向滚动的前提 在 CSS3 中,实现横向滚动需要使用到 overflow-x 属性,它的取值为 scroll 或 auto。 在实现横向滚动的时候,首先需要保证有足够的空间来容纳横向滚动的…

    css 2023年6月10日
    00
  • js实现加载更多功能实例

    下面我将详细讲解如何通过JavaScript实现加载更多功能。 前置知识 在开始之前,需要对以下知识有一定的了解: HTML和CSS基础 JavaScript基础 JSON数据格式基础 AJAX异步请求基础 如果以上内容还不熟悉的话,建议先学习这些基础知识。 实现步骤 第一步:准备数据 在实现加载更多之前,需要准备好需要显示的数据。可以通过JSON格式的数据…

    css 2023年6月10日
    00
  • 一款基于css3麻将筛子3D翻转特效的实例教程

    下面是“一款基于CSS3麻将筛子3D翻转特效的实例教程”的完整攻略: 简介 本教程将详细介绍如何通过使用CSS3实现一个麻将筛子3D翻转特效。该特效通过使用CSS3的transform属性,配合相应的动画效果,使得麻将筛子在屏幕上进行3D的翻转动画,非常生动有趣。 步骤 1. 准备HTML结构 首先,我们需要准备HTML结构,在HTML中添加对应的div和面…

    css 2023年6月10日
    00
  • 一篇文章教你学会HTML

    「一篇文章教你学会HTML」是一个比较基础的教程,适合刚刚接触HTML的人学习。本篇文章将分为以下几个部分: HTML的定义与结构 常用的HTML标签示例 嵌套HTML标签 HTML属性与CSS样式 HTML的定义与结构 HTML全称为“Hyper Text Markup Language”, 这是一种用于创建网页的标记语言。HTML代码用于构建网页的结构和…

    css 2023年6月10日
    00
  • 浅谈webpack构建工具配置和常用插件总结

    浅谈webpack构建工具配置和常用插件总结 1. 什么是Webpack Webpack 是一个现代化 JavaScript 应用程序的静态模块打包器(module bundler)。Webpack 能够对模块进行打包处理,将多个模块打包成一个或多个打包文件,将应用程序的所有资源视为模块,把它们视为一个整体,并建立各个模块之间的依赖关系,最终生成最终的合并版…

    css 2023年6月9日
    00
  • css布局之负margin妙用及其他实现

    下面我将详细讲解“CSS布局之负margin妙用及其他实现”的完整攻略。 一、负margin的作用 负margin是CSS中一个非常强大的属性,它可以对元素产生“向外”的效果,也就是说,用负margin可以调整元素的位置,让元素在布局中跨越父元素的边界,或者重叠在其他元素上。通过巧妙地运用负margin,可以实现各种独特的布局效果。 1.1 引入负margi…

    css 2023年6月9日
    00
合作推广
合作推广
分享本页
返回顶部