Vue封装一个简单轻量的上传文件组件的示例

下面是Vue封装一个简单轻量的上传文件组件的示例:

1. 实现思路

  • 在父组件中使用<input type="file">标签,然后监听change事件。
  • 将上传文件的操作交给上传文件组件,上传文件组件通过监听父组件传递的file事件来实现上传操作。
  • 在上传文件组件中创建一个<input type="file">标签,并在相应的事件中使用FormData对象构建文件内容,并使用axios.post()方法发送文件内容到后台。

2. 示例说明

示例 1

通过<input type="file">标签,在父组件中手动选择上传文件,并且给子组件传递选中的文件信息,然后在子组件中将文件信息再次处理并上传。

<!-- 父组件 template -->
<template>
  <div>
    <input type="file" @change="fileChanged">
    <upload-component :file="file" @upload-success="uploadSuccess"></upload-component>
  </div>
</template>

<script>
  import UploadComponent from './UploadComponent'

  export default {
    components: {
      UploadComponent
    },
    data () {
      return {
        file: null
      }
    },
    methods: {
      fileChanged (event) {
        this.file = event.target.files[0]
      }
      uploadSuccess (response) {
        console.log('上传成功', response)
      }
    }
  }
</script>

<!-- 子组件 template -->
<template>
  <button @click="uploadFile">上传文件</button>
</template>

<script>
  import axios from 'axios'

  export default {
    props: {
      file: {
        required: true,
        type: Object
      }
    },
    methods: {
      async uploadFile () {
        const formData = new FormData()
        formData.append('file', this.file)
        try {
          const response = await axios.post('/api/upload', formData)
          this.$emit('upload-success', response)
        } catch (error) {
          console.log('上传失败', error)
        }
      }
    }
  }
</script>

示例 2

封装通用的上传文件组件,支持文件类型限制、文件大小限制等配置。

<!-- 上传文件组件 template -->
<template>
  <div>
    <input type="file" ref="fileInput" @change="fileChanged">
  </div>
</template>

<script>
  import axios from 'axios'

  export default {
    data () {
      return {
        formData: new FormData(),
        fileName: '',
        fileSize: 0
      }
    },
    props: {
      accept: {
        default: '',
        type: String
      },
      maxFileSize: {
        default: 5 * 1024 * 1024,
        type: Number
      },
      allowFileTypes: {
        default: ['jpg', 'jpeg', 'png', 'gif'],
        type: Array
      }
    },
    methods: {
      fileChanged (event) {
        const fileList = event.target.files
        if (fileList.length === 0) {
          return
        }
        const file = fileList[0]
        this.fileName = file.name
        this.fileSize = file.size
        const fileType = this.getFileType(file.name)
        if (this.allowFileTypes.indexOf(fileType) === -1) {
          alert('不支持该文件类型')
          this.$refs.fileInput.value = ''
          return
        }
        if (this.fileSize > this.maxFileSize) {
          alert('文件过大')
          this.$refs.fileInput.value = ''
          return
        }
        this.formData.append('file', file)
      },
      getFileType (fileName) {
        const index = fileName.lastIndexOf('.')
        if (index === -1) {
          return ''
        }
        return fileName.substr(index + 1, fileName.length)
      },
      async uploadFile () {
        try {
          const response = await axios.post('/api/upload', this.formData)
          this.$emit('upload-success', response)
        } catch (error) {
          console.log('上传失败', error)
        }
      }
    }
  }
</script>

以上就是Vue封装一个简单轻量的上传文件组件的攻略,希望能够帮到你!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Vue封装一个简单轻量的上传文件组件的示例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • vue+video.js实现视频播放列表

    下面是关于“vue+video.js实现视频播放列表”的完整攻略。 1. 准备工作 安装 video.js 首先,我们需要安装 video.js。可以使用 npm 命令进行安装: npm install video.js –save 引入 video.js 在 Vue 项目的入口文件(比如 main.js)中,需要引入 video.js 和 video-j…

    Vue 2023年5月28日
    00
  • 构建大型 Vue.js 项目的10条建议(小结)

    当构建大型 Vue.js 项目时,有一些建议可以帮助你避免一些常见的问题和错误。以下是构建大型 Vue.js 项目的10条建议: 使用组件化设计:将UI组件分解为更小的组件,提高组件复用性。 Vuex状态管理方案:将应用程序的状态集中在一个地方进行管理,方便协作和调试。 使用 Vue CLI 3:提供各种脚手架、插件和构建工具,使构建应用程序更简单。 使用 …

    Vue 2023年5月27日
    00
  • Vue动态组件与异步组件实例详解

    Vue动态组件与异步组件实例详解 在 Vue 中,可以使用动态组件和异步组件实现按需加载组件,从而提高应用的性能。下面我们详细讲解 Vue 动态组件与异步组件。 动态组件 动态组件是一种将组件挂载到动态绑定的组件上的方式。可以在同一个挂载点上动态地切换不同的组件。 示例1 首先我们需要在 Vue 上下文中注册两个组件:Home 和 User。 // Home…

    Vue 2023年5月27日
    00
  • 一步步详细讲解vue3配置ESLint

    下面是一步步详细讲解vue3配置ESLint的完整攻略: 步骤一:安装ESLint 首先,我们需要在项目中安装ESLint。可以使用下面的命令来进行安装: npm install eslint –save-dev 步骤二:安装Vue3的ESLint插件 接下来,我们需要安装Vue3的ESLint插件。可以使用下面的命令进行安装: npm install e…

    Vue 2023年5月28日
    00
  • Vue 组件注册实例详解

    Vue 组件注册实例详解 在 Vue 中,组件是构建应用程序的核心部分之一。如果我们想要将一个特定的组件或指令作为全局组件注册,我们可以使用 Vue.component() 方法。另外,我们还可以通过在一个父组件中使用 components 选项来在该组件内部注册一个局部组件。 注册全局组件 如果我们想要在全部的组件中都使用一个组件,那么我们应该将它注册成为…

    Vue 2023年5月28日
    00
  • Vue组件中使用防抖和节流实例分析

    下面是关于”Vue组件中使用防抖和节流实例分析”的攻略: 什么是防抖和节流 在介绍如何在Vue组件中使用防抖和节流之前,我们先来了解一下什么是防抖和节流。 防抖 防抖,顾名思义,就是防止抖动。在前端开发中,防抖指的是在一段时间内连续触发某个事件时,只执行一次处理函数。也就是说,当事件触发后,只有在指定的间隔时间内没有再次触发事件,才会执行函数。 节流 节流是…

    Vue 2023年5月28日
    00
  • vue中this.$refs.name.offsetHeight获取不到值问题

    问题背景: 在vue开发中,有时候我们需要获取某个元素或者组件的高度值,利用this.$refs.name.offsetHeight是个非常简便的方式,但是它并不总是奏效,许多开发者在这种情况下却无法获取到对应的高度值,究竟是为什么呢? 解决方案: 经过笔者的实践和总结,出现这种问题的情况大多是因为元素或组件还没有被渲染到Dom树上,因此高度值无法获取。针对…

    Vue 2023年5月29日
    00
  • SpringBoot集成支付宝沙箱支付的实现示例

    下面是详细讲解“SpringBoot集成支付宝沙箱支付的实现示例”的完整攻略: 一、前置准备 注册并开通阿里云账号。 创建一个支付宝沙箱应用,获取支付宝沙箱应用 ID 和秘钥。 了解支付宝接口文档和SDK相关内容。 选择合适的开发语言和开发框架。本教程采用 SpringBoot 框架。 二、添加依赖 在 pom.xml 文件中添加 Alibaba maven…

    Vue 2023年5月28日
    00
合作推广
合作推广
分享本页
返回顶部