关于vue中利用axios常用的表单提交以及文件上传如何传递参数给后端的详解

3 篇文章 1 订阅
1 篇文章 0 订阅

前言

看到好多vue初学者还不会调用接口包括参数的传递,这里做一个详细的介绍以供各位初学者参考,本文主要讲解表单提交,post与get的参数传递写法区别,文件上传提交。

一、Axios

Axios 是一个基于 promise 的易用、简洁且高效的http库。

特性

  • 支持node端和浏览器端:同样的API,node和浏览器全支持,平台切换无压力
  • 支持Promise:使用Promise管理异步,告别传统callback方式
  • 丰富的配置项:支持拦截器等高级配置
  • 拦截请求和响应,转换请求数据和响应数据,自动转换 JSON 数据
  • 客户端支持防御 XSRF

注:vue有自己的数据请求方式axios,这里我们就不需要在用ajax来请求了。

二、安装

# NPM
$ npm install axios
# YARN
$ yarn add  axios

三、引入

打开vue文件目录main.js,通过如下方式引入即可。

//  ES6
import Axios from 'axios';
//将axios挂在到Vue的实例上
Vue.prototype.$axios = Axios 

四、示例

这里我以通常提交表单和文件上传为例,传递数据给后端。为了方便编写和页面美观,本文主要是搭配elementUi的使用。

注:这里仅使用的axios基础功能,供初学者了解使用,通常我们的大中型项目会对axios进行封装处理,配合axios的拦截器和响应器,对接后端状态码的处理,字段是否加密的处理,token传参等等

1.表单提交(post与get)

这里我们以页面、页面html、页面js逻辑展示处理。
在这里插入图片描述

 <el-form
                    ref="form"
                    size="mini"
                    label-width="90px"
                    label-position="right">
                    <el-form-item label="系统编号">
                        <el-input v-model="formData.sysNo"
                                  placeholder="请在此输入">
                        </el-input>
                    </el-form-item>
                <el-form-item label="系统名称">
                    <el-input v-model="formData.name"
                              placeholder="请在此输入">
                    </el-input>
                </el-form-item>
                <el-form-item label="描述">
                    <el-input v-model="formData.desc"
                              type="textarea"
                              rows="6"
                              placeholder="请在此输入">
                    </el-input>
                </el-form-item>
            </el-form>
            <div class="form-button-box">
                <el-button @click="resetForm()" size="small" class="dialog-btn">重置</el-button>
                <el-button @click="submitFormData" type="primary" size="small" class="dialog-btn">保存</el-button>
            </div>
<script type="text/ecmascript-6">
 data () {
    return {
          formData: {},  
}
}
</script>

如上图所示,该表单提交需要编号(sysNo)、名称(name)、描述(desc)三个字段,我们可以直接在data里面声明一个formData:{},此时我们在标签里面通过v-model绑定formData.sysNo,我们声明的formData对象会自动生成一个sysNo属性,其他两个同理如此,这样可以大大减少一些代码的冗余,使之更简洁,同时提交给后端的参数我们直接用formData即可,不需要再去写一长段的字段展示。

methods方法里面写保存或者提交逻辑,通常我们的请求方式分为get和post请求,其他请求方式用的比较少,这里就不展示了。

methods:{
	submitFormData(){
	/*
            * url   url地址
            * params请求数据即需要传递的参数
     */
     console.log(this.formData) 
     /* //params为后端需要传递的参数,通常我们传递参数如下所示。
            let params={
                sysNo:123,
                name:'li',
                desc:'test'
            }
            //此时,我们可以打印一下this.formData,打印结果如下所示或者你通过浏览器控制台可以看到参数与params里面的参数一模一样。
            this.formData={
                sysNo:'123',
                name:'li',
                desc:'test'
            }
            //所以根据上面我们直接用let params=this.formData就可以省略参数的拼写,遇到参数比较多的情况,大大优化了代码量*/
     let params=this.formData
     let url='填写你url地址' //通常本地开发会遇到跨域问题,所以我们需要在config的index.js里面配置proxyTable反向代理,具体详情自行百度,有很多很清楚的讲解与写法。
     // **1.post请求,res即为请求成功后后端返回的信息。**
	  this.$axios.post(url,params).then(res =>{
	    console.log('请求成功')
	    console.log(res)
	  }).catch(error =>{
	    console.log('请求失败')
	    console.log(error )
	  })

	// **2.get请求,get传递参数跟post不同,需要用花括号括起来且只能用 params 来解析,不能换成其他字段,当然你也可以将参数拼接在url后面,如下方式比较简洁。**
		  this.$axios.get(url,{params}).then(res =>{
		    console.log('请求成功')
		    console.log(res)
		  }).catch(error =>{
		    console.log('请求失败')
		    console.log(error )
		  })
		}
}

2.文件上传

这里以上传图片外加一些其他参数为例,上传文件同理如此。
在这里插入图片描述

<el-form
                    ref="form"
                    size="mini"
                    label-width="100px"
                    label-position="right"
                <el-form-item label="图标">
                    <el-upload
                        action=""
                        class="avatar-uploader"
                        :show-file-list="false"
                        :http-request="UnloadImg">
                        <img v-if="imageUrl" :src="imageUrl" class="avatar">
                        <span v-if="imageUrl" class="newHover">
                            <i class="el-icon-delete" ></i>
                        </span>
                        <i v-else class="el-icon-plus avatar-uploader-icon"></i>
                    </el-upload>
                </el-form-item>
                <el-form-item label="描述" prop="desc">
                    <el-input v-model="formData.desc"
                              type="textarea"
                              rows="6"
                              placeholder="请在此输入">
                    </el-input>
                </el-form-item>
            </el-form>
            <div class="form-button-box">
                <el-button @click="resetForm()" size="small" class="dialog-btn">重置</el-button>
                <el-button @click="submitFormData" type="primary" size="small" class="dialog-btn">保存</el-button>
            </div>

methods里面调用方法,如上图需求所示,我需要上传图片,填写描述之后再进行提交操作,上传图片成功会触发UnloadImg函数,此时我不需要立即提交,需要把文件file储存下来,所以定义了一个fileData字段储存file。

<script type="text/ecmascript-6">
 data () {
    return {
          fileData: '', 
          imageUrl:'', 
          formData:{}
}
}
</script>
methods: {
            UnloadImg(file){
            // 此时我们只是储存了file,并没有直接提交,如果你需要直接提交直接在后面调用接口,传递FormData格式的file参数即可,复制submitFormData 里面的逻辑即可。
                this.imageUrl = URL.createObjectURL(file.file);
                this.fileData=file.file
                console.log(file.file);
            },
            submitFormData () {
            // 通常文件上传,我们需要将参数变成`FormData`格式,所以通过`new FormData`进行转化,根据需要我们需要传递file和desc两个参数。
             let newFormData=new FormData()
             newFormData.append('file',this.fileData)
             newFormData.append('desc',formData.desc)
             this.$axios.post(url,newFormData).then(res =>{
			    console.log('提交成功')
			    console.log(res)
		     }).catch(error =>{
			    console.log('提交失败')
			    console.log(error )
		     })
            }
         }
  • 18
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Vue3 是一种基于组件化的开发模式,而 Element Plus 是一套基于 Vue3 的组件库,提供了丰富的 UI 组件和功能,其包括上传图片组件。以下是详细的步骤来使用 Element Plus 上传图片并发送到后端: 1. 安装 Element Plus 库 首先,在你的 Vue3 项目安装 Element Plus 库。你可以使用 npm 或者 yarn 来安装。 ```bash npm install element-plus --save # 或者 yarn add element-plus ``` 2. 引入 Element Plus 组件 在你的 Vue3 组件,使用 `import` 关键字来引入 Element Plus 组件: ```js import { ElUpload, ElButton } from 'element-plus'; ``` 这里我们引入了上传组件 `ElUpload` 和按钮组件 `ElButton`。你可以根据需要引入其他的组件。 3. 在模板使用上传组件 在你的 Vue3 组件的模板,使用 `el-upload` 标签来使用上传组件。以下是一个简单的示例: ```html <template> <div> <el-upload :action="uploadUrl" :on-success="handleSuccess" :on-error="handleError" :on-exceed="handleExceed" :file-list="fileList" :auto-upload="false" :show-file-list="false" multiple > <el-button>上传图片</el-button> </el-upload> </div> </template> ``` 在这个示例,我们使用了 `el-upload` 标签来创建一个上传组件。`action` 属性指定了上传图片的 URL 地址,`on-success` 属性指定了上传成功后的回调函数,`on-error` 属性指定了上传失败后的回调函数,`on-exceed` 属性指定了上传文件超出限制后的回调函数,`file-list` 属性指定了已上传的文件列表,`auto-upload` 属性设置为 `false` 表示手动触发上传,`show-file-list` 属性设置为 `false` 表示不显示已上传文件列表,`multiple` 属性设置为 `true` 表示支持多个文件上传。 4. 编写上传图片的逻辑 在你的 Vue3 组件的 `methods` 编写上传图片的逻辑。以下是一个简单的示例: ```js methods: { handleSuccess(response, file) { // 上传成功后的回调函数 const imageUrl = response.url; // 假设后端返回的数据包含图片地址 this.$axios.post('/api/saveImage', { imageUrl }) .then(response => { // 处理后端返回的数据 }) .catch(error => { // 处理请求失败的情况 }); }, handleError(error, file) { // 上传失败后的回调函数 console.error(error); }, handleExceed(files, fileList) { // 上传文件超出限制后的回调函数 console.warn('上传文件数量超出限制'); }, beforeUpload(file) { // 上传文件之前的逻辑,比如限制上传文件的大小和类型 const isJPG = file.type === 'image/jpeg'; const isPNG = file.type === 'image/png'; const isLt2M = file.size / 1024 / 1024 < 2; if (!isJPG && !isPNG) { this.$message.error('只支持上传 JPG/PNG 格式的图片'); return false; } if (!isLt2M) { this.$message.error('上传图片大小不能超过 2MB'); return false; } return true; } } ``` 在这个示例,我们编写了四个回调函数:`handleSuccess`、`handleError`、`handleExceed` 和 `beforeUpload`。 `handleSuccess` 函数是上传成功后的回调函数,它接收两个参数:`response` 和 `file`。`response` 是后端返回的数据,你需要从提取出上传图片的地址 `imageUrl`,然后将它发送到后端。这里使用了 Axios 库发送 POST 请求,你也可以使用其他的 Ajax 库或者浏览器的 Fetch API 来发送请求。 `handleError` 函数是上传失败后的回调函数,它接收两个参数:`error` 和 `file`。`error` 是上传失败时的错误信息,你可以在这个函数处理错误逻辑。 `handleExceed` 函数是上传文件超出限制后的回调函数,它接收两个参数:`files` 和 `fileList`。`files` 是即将上传的文件列表,`fileList` 是已上传的文件列表。你可以在这个函数处理上传文件数量超出限制的逻辑。 `beforeUpload` 函数是上传文件之前的逻辑,它接收一个参数:`file`,表示即将上传的文件。在这个函数,你可以限制上传文件的大小和类型,如果不符合条件则返回 `false` 取消上传。如果上传文件符合条件,则返回 `true` 继续上传。 以上就是使用 Element Plus 上传图片并发送到后端的详细步骤。当然,这只是一个简单的示例,你需要根据自己的实际需求来编写更完整的代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值