返回顶部
首页 > 资讯 > 精选 >vue如何实现上传组件
  • 436
分享到

vue如何实现上传组件

2023-06-15 07:06:23 436人浏览 八月长安
摘要

这篇文章主要介绍Vue如何实现上传组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!思路文件上传的两种实现方式From形式<fORM   method="post&quo

这篇文章主要介绍Vue如何实现上传组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

思路

文件上传的两种实现方式

From形式

<fORM   method="post"   enctype="multipart/from-data"  action="api/upload">  <input type="file name="file">  <button type="submit">Submit</button></form>

form的method属性指定为 "post" 请求,通过html表单发送数据给服务器,并返回服务器的修改结果,在这种情况下Content-Type是通过在<form>元素中设置正确的enctype属性。

form的enctype属性规定在发送到服务器之前应该如何对表单数据进行编码。

  • application/x-www-form-urlencoded(默认值):表示在发送前编码所有字符,数据被编码成以"&"分隔的键值对,同时以"="分隔键和值,("name=seven&age=19")。不支持二进制数据。

  • multipart/form-data:支持二进制数据(上传文件时必须指定)

javascript异步请求形式

我们知道 FormData 接口提供了一种表示表单数据的键值对 key/value 的构造方式,并且可以轻松的将数据通过XMLHttpRequest.send()方法发送出去,本接口和此方法都相当简单直接。如果送出时的编码类型被设为 "multipart/form-data",它会使用和表单一样的格式。

var formdata = new FormData(); // 创建FormData对象formdata.append("name","laotie"); // 通过append()方法添加新的属性值... // 更多方法请点下面链接

FormData接口

生命周期

上传组件也有它的生命周期

beforeUpload --> uploading --> fileUploaded 或者 uploadedError

代码草稿

本例中采用js异步请求的方式开发上传组件

<input type="file" name="file" @change.prevent="handleFileChange">// 创建一个file类型的input,用于触发文件上传,后面可以把input隐藏掉,自定义好看的样式// 自定义样式的时候可以用slot区分不同上传状态的样式(loading,success,defult)
const handleFileChange = (e:Event)=>{  const target = e.target as HTMLInputElement  const files = Array.from(target.files)// 注意这里取得的是一个类数组  if(files){    // 取得文件    const uploadedFile = files[0]        if(!validateFormat) return    // ...这里只是提供一种思路,具体校验不再讲述    // 在这里做一些上传文件前的校验,比如文件格式,大小等,    // 不符合要求的话就不在继续发送请求        const formData = new FormData()    formData.append(uploadedFile.name,uploadedFile)        axiOS.post('/upload',formData,{      headers:{         // 注意设置编码类型        'Content-Type': 'multipart/form-data'      }    }).then(res=>{      console.log('上传成功')    }).catch(error =>{      // 文件上传失败    }).finally(()=>{      // 文件上传完成,无论成功还是失败      // 这里可以清除一下input.value    })  }}

具体实现

// Upload.vue<template>  <div class="upload-container">    <div class="upload-box" @click.prevent="triggerUpload" v-bind="$attrs">      <slot name="loading" v-if="fileStatus==='loading'">        <button class="btn btn-primary">上传中</button>      </slot>      <slot name="uploaded" v-else-if="fileStatus==='success'" :uploadedData="fileData">        <button class="btn btn-primary">上传成功</button>      </slot>      <slot v-else name="default">        <button class="btn btn-primary">点击上传</button>      </slot>    </div>    <input type="file" class="file-input d-none" name="file" ref="uploadInput" @change="hanldeInput"/>  </div></template><script lang="ts">import { defineComponent, ref, PropType, watch } from 'vue'import axios from 'axios'type UploadStatus = 'ready' | 'loading' | 'success' | 'error'type FunctionProps = (file:File) => booleanexport default defineComponent({  name: 'Upload',  inheritAttrs: false,  props: {    // 上传的url    action: {      type: String,      required: true    },    // 上传之前的校验,是一个返回布尔值的函数    beforeUpload: {      type: Function as PropType<FunctionProps>    },    // 上传好的数据,用来判断状态或做初始化展示    uploadedData: {      type: Object    }  },  emits: ['file-uploaded-success', 'file-uploaded-error'],  setup(props, ctx) {    const uploadInput = ref<null | HTMLInputElement>(null)    const fileStatus = ref<UploadStatus>(props.uploadedData ? 'success' : 'ready')    const fileData = ref(props.uploadedData)    watch(() => props.uploadedData, (val) => {      if (val) {        fileStatus.value = 'success'        fileData.value = val      }    })    const triggerUpload = () => {      if (uploadInput.value) {        uploadInput.value.click()      }    }    const hanldeInput = (e:Event) => {      const target = e.target as HTMLInputElement      const files = target.files      console.log(target)      if (files) {        const uploadFile = Array.from(files)        const validateFormat = props.beforeUpload ? props.beforeUpload(uploadFile[0]) : true        if (!validateFormat) return        fileStatus.value = 'loading'        const formData = new FormData()        formData.append('file', uploadFile[0])        axios.post(props.action, formData, {          headers: {            'Content-Type': 'multipart/form-data'          }        }).then(res => {          console.log('文件上传成功', res)          fileStatus.value = 'success'          fileData.value = res.data          ctx.emit('file-uploaded-success', res.data)        }).catch(error => {          console.log('文件上传失败', error)          fileStatus.value = 'error'          ctx.emit('file-uploaded-error', error)        }).finally(() => {          console.log('文件上传完成')          if (uploadInput.value) {            uploadInput.value.value = ''          }        })      }    }    return {      uploadInput,      triggerUpload,      hanldeInput,      fileStatus,      fileData    }  }})</script>

使用示例:

<template>  <div class="create-post-page">    <upload      action="/upload"      :beforeUpload="beforeUpload"      :uploadedData="uploadedData"      @file-uploaded-success="hanldeUploadSuccess"      class="d-flex align-items-center justify-content-center bg-light text-secondary w-100 my-4"      >      <template #uploaded="slotProps">        <div class="uploaded-area">          <img :src="slotProps.uploadedData.data.url"/>          <h4>点击重新上传</h4>        </div>       </template>       <template #default>         <h3>点击上传头图</h3>       </template>       <template #loading>         <div class="d-flex">          <div class="spinner-border text-secondary" role="status">            <span class="sr-only"></span>          </div>         </div>       </template>    </upload>  </div></template><script lang="ts">import { defineComponent, ref, onMounted } from 'vue'import Upload from '../components/Upload.vue'import createMessage from '../components/createMessage'export default defineComponent({  name: 'CreatePost',  components: { Upload },  setup() {    const uploadedData = ref() //创建一个响应式数据    let imageId = ''    onMounted(() => {      ....      // 这里有逻辑省略了,取到初始化数据image      if (image) {        uploadedData.value = { data: image }      }    })    // 上传前校验,返回布尔值    const beforeUpload = (file:File) => {      const res = beforeUploadCheck(file, {        format: ['image/jpeg', 'image/png'],        size: 1      })      const { error, passed } = res      if (error === 'format') {        createMessage('上传图片只能是JPG/PNG格式!', 'error')      }      if (error === 'size') {        createMessage('上传图片大小不能超过1MB', 'error')      }      return passed    }    // 上传成功后拿到imageId就可以进行后续处理,创建表单啥的    const hanldeUploadSuccess = (res:ResponeseProps<ImageProps>) => {      createMessage(`上传图片ID ${res.data._id}`, 'success')      if (res.data._id) {        imageId = res.data._id      }    }    return {      beforeUpload,      hanldeUploadSuccess,      uploadedData    }  }})</script><style>.create-post-page{  padding:0 20px 20px;}.create-post-page .upload-box{  height:200px;  cursor: pointer;  overflow: hidden;}.create-post-page .upload-box img{  width: 100%;  height: 100%;  object-fit: cover;}.uploaded-area{  position: relative;}.uploaded-area:hover h4{  display: block;}.uploaded-area h4{  display: none;  position: absolute;  color: #999;  text-align: center;  width: 100%;  top:50%}</style>

以上是“vue如何实现上传组件”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网精选频道!

--结束END--

本文标题: vue如何实现上传组件

本文链接: https://lsjlt.com/news/278607.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • vue如何实现上传组件
    这篇文章主要介绍vue如何实现上传组件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!思路文件上传的两种实现方式From形式<form   method="post&quo...
    99+
    2023-06-15
  • vue 实现上传组件
    目录1.介绍2.思路文件上传的两种实现方式3.生命周期4.代码草稿5.具体实现1.介绍 效果如下图   2.思路 文件上传的两种实现方式 1.From形式 <...
    99+
    2024-04-02
  • vue如何实现上传图片组件
    这篇文章给大家分享的是有关vue如何实现上传图片组件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。未上传状态上传状态其他状态(查看/删除)自定义组件文件名称 - 这里叫UploadImg.vue<templ...
    99+
    2023-06-25
  • vue如何实现文件上传
    本篇内容主要讲解“vue如何实现文件上传”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“vue如何实现文件上传”吧!1、使用elementUI的 el-upload插件进行上传。html:<...
    99+
    2023-06-29
  • vue-cropper组件如何实现图片切割上传
    小编给大家分享一下vue-cropper组件如何实现图片切割上传,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!vue-cropper在vue中的引入1、组件内引入...
    99+
    2023-06-15
  • Vue如何实现封装一个切片上传组件
    今天小编给大家分享一下Vue如何实现封装一个切片上传组件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。组件效果单文件切片上传...
    99+
    2023-07-05
  • vue中如何实现多附件上传
    这篇文章主要介绍vue中如何实现多附件上传,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!核心代码<div class="upload-flie-btn"> &nbs...
    99+
    2023-06-14
  • vue如何实现上传图片文件
    这篇文章给大家分享的是有关vue如何实现上传图片文件的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。原始input标签form表单上传<input type="file"&nbs...
    99+
    2023-06-15
  • vue如何实现文件切片上传
    这篇文章主要介绍了vue如何实现文件切片上传的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue如何实现文件切片上传文章都会有所收获,下面我们一起来看看吧。在实际开发项目过程中有时候需要上传比较大的文件,然后呢...
    99+
    2023-07-05
  • vue如何实现父子组件传值
    小编给大家分享一下vue如何实现父子组件传值,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!父子组件传值<!DOCTYPE&...
    99+
    2024-04-02
  • Vue祖孙组件如何实现传值
    目录先看基础$props$attrs$listeners祖传孙1. $props 链2. $attrs孙传祖$listeners总结先看基础 祖孙组件,也就是 3 层嵌套的组件。关于...
    99+
    2023-03-24
    Vue祖孙组件 Vue传值 Vue组件
  • vue-cropper插件如何实现图片截取上传组件封装
    小编给大家分享一下vue-cropper插件如何实现图片截取上传组件封装,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!需求场景:后台开发需要上传图片并进行相应比例尺寸图片的截取,本组件开发采用Ant Design Vue组...
    99+
    2023-06-15
  • vue-cropper组件实现图片切割上传
    本文实例为大家分享了vue-cropper组件实现图片切割上传的具体代码,供大家参考,具体内容如下 这几日,等来了些空闲,用vue和spring boot实践一次头像上传,因此记下...
    99+
    2024-04-02
  • vue实现文件上传
    本文实例为大家分享了vue实现文件上传的具体代码,供大家参考,具体内容如下 记录问题,方便回顾 1、使用elementUI的 el-upload插件进行上传。 2、使用input。 ...
    99+
    2024-04-02
  • Vue+axios+Node+express如何实现文件上传
    小编给大家分享一下Vue+axios+Node+express如何实现文件上传,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Vu...
    99+
    2024-04-02
  • Vue中如何实现父子组件传值
    Vue中如何实现父子组件传值,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(一)传递数值1.子组件:Header.vue<templat...
    99+
    2024-04-02
  • vue组件中如何实现数据传递
    这篇文章给大家分享的是有关vue组件中如何实现数据传递的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。具体如下:1、props:父组件 -->传值到子组件app.vue是父组...
    99+
    2024-04-02
  • Vue中父子组件如何实现传值
    目录前言一、将子组件引入父组件二、父组件如何传值给子组件三、子组件如何接收父组件传过来的值并使用(props)四、子组件如何传值给父组件($emit)五、父组件使用子组件传过来的值总...
    99+
    2023-01-28
    Vue父子组件 Vue组件传值 Vue父子组件传值
  • Vue和React组件间如何实现传值
    这篇文章主要讲解了“Vue和React组件间如何实现传值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue和React组件间如何实现传值”吧!组件间的传值方式组件的传值场景无外乎以下几种:...
    99+
    2023-07-04
  • vue如何实现子组件向父组件进行传值
    这篇文章主要为大家展示了“vue如何实现子组件向父组件进行传值”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“vue如何实现子组件向父组件进行传值”这篇文章吧。子组件向父组件进行传值:父组件内设置...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作