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日

相关文章

  • vuex操作state对象的实例代码

    下面是详细讲解“Vuex操作state对象的实例代码”的攻略。 1. 理解Vuex和state对象的基本概念 Vuex是一个专门为Vue.js设计的状态管理库,主要用于管理Vue.js应用程序中的状态。在使用Vuex的过程中,最核心的概念就是state对象。 state对象是Vuex中的一个重要部分,它类似于Vue.js组件中的data对象,但是它被所有组件…

    Vue 2023年5月28日
    00
  • vue的异步数据更新机制与$nextTick用法解读

    让我来详细地讲解一下“Vue的异步数据更新机制与$nextTick用法解读”。 异步更新机制 在Vue中,数据更新是异步进行的。这是因为当我们修改数据后,Vue并不会立即去更新所有相关的视图,而是先把这些更新放在一个队列里,等到下一个事件循环时再去执行更新操作。这样做的好处是可以避免不必要的DOM操作,提高性能,同时也可以确保在修改数据后能够得到最新的视图。…

    Vue 2023年5月27日
    00
  • Vue脚手架的简单使用实例

    下面是关于“Vue脚手架的简单使用实例”的完整攻略: 什么是Vue脚手架 Vue脚手架是一款基于Node.js构建的Vue.js项目脚手架工具,用来快速搭建一个Vue.js开发环境。Vue脚手架可以帮助我们自动生成Vue项目的基础结构,集成了一些常用的插件和组件,同时还提供了开发、打包和测试等一系列的命令。 如何使用Vue脚手架搭建一个Vue.js项目 安装…

    Vue 2023年5月28日
    00
  • Vue EventBus自定义组件事件传递

    Vue EventBus自定义组件事件传递可以让我们在Vue项目中进行组件间的数据传递,在实现一些特殊的功能时非常有用。下面是Vue EventBus自定义组件事件传递的完整攻略。 步骤一:创建EventBus EventBus是一个全局的事件总线,用于在组件间传递数据。我们需要在Vue项目中创建一个新的js文件来实现EventBus。 import Vue…

    Vue 2023年5月28日
    00
  • Vue 自定义动态组件实例详解

    接下来我会详细讲解“Vue 自定义动态组件实例详解”的完整攻略。这篇攻略主要涉及以下内容: 自定义动态组件的基本概念和用法。 组件的渲染函数和选项 API。 自定义动态组件的实例方法和生命周期函数。 组件的动态注册和使用。 使用示例和注意事项。 在具体讲解之前,我先简单介绍一下什么是 Vue 自定义动态组件。Vue 自定义动态组件是一种可以在运行时动态创建的…

    Vue 2023年5月28日
    00
  • vue跨域问题:Access to XMLHttpRequest at‘httplocalhost解决

    跨域问题指的是在同源策略下,浏览器禁止向不同源地址发送请求,这是为了保证客户端数据的安全性。而Vue.js作为常用的前端框架,在与后台服务进行交互时,就需要面对跨域问题。 下面,我们就来详细讲解一下“Vue跨域问题:Access to XMLHttpRequest at ‘http://localhost’解决”的完整攻略。 什么是跨域问题 跨域问题是浏览器…

    Vue 2023年5月27日
    00
  • axios post提交formdata的实例

    下面是详细的攻略。 1. axios post提交formdata的基本语法 在使用axios提交formdata时,需要使用FormData类来创建一个表单对象。具体语法如下: const formData = new FormData() formData.append(‘name1’, ‘value1’) formData.append(‘name2’…

    Vue 2023年5月28日
    00
  • axios请求二次封装之避免重复发送请求

    让我给你详细讲解“axios请求二次封装之避免重复发送请求”的完整攻略。 在前端开发中,我们经常使用axios这个库来进行http请求,但是如果在某个操作频繁执行时,如果频繁发送多次相同的请求,会浪费网络资源和服务器资源,可能还会造成意外的程序错误。因此,在使用axios时,我们需要进行请求二次封装,避免重复发送请求。 以下是实现这个目标的步骤: 1. 安装…

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