vue3實(shí)戰(zhàn)-axios請(qǐng)求封裝問(wèn)題(get、post、put、delete)
vue3實(shí)戰(zhàn)axios請(qǐng)求封裝問(wèn)題
1、在src目錄下創(chuàng)建http文件夾,在http文件夾下分別創(chuàng)建index.js、request.js、api.js
2、index.js的作用:用于導(dǎo)出api.js定義的所有接口,代碼如下
export * from './api';
3、request.js代碼如下:
import axios from 'axios'; import buildURL from 'axios/lib/helpers/buildURL'; import { merge } from 'axios/lib/utils'; //判斷指定參數(shù)是否是一個(gè)純粹的對(duì)象,所謂"純粹的對(duì)象",就是該對(duì)象是通過(guò)"{}"或"new Object"創(chuàng)建的 function isPlainObject (val) { ? ?? ?return val && val.constructor.name === 'Object' } //請(qǐng)求之前進(jìn)行攔截,可做的操作:1、添加loading的加載;2、添加請(qǐng)求頭;3、判斷表單提交還是json提交 let requestInterceptors = [ ?? ?config => { ?? ??? ?//添加loading的加載 ?? ??? ? ?? ??? ?//添加請(qǐng)求頭 ?? ??? ?config.headers.authorization = sessionStorage.getItem('Token'); ?? ??? ?//判斷表單提交還是json提交 ?? ??? ?if (config.emulateJSON && isPlainObject(config.data)) { ?? ??? ??? ?config.data = buildURL('', config.data).substr(1); ?? ??? ?} ?? ??? ?return config; ?? ?} ] //請(qǐng)求響應(yīng)之后進(jìn)行攔截,可做操作:1、取消loading的加載;2、對(duì)返回狀態(tài)進(jìn)行判斷:如請(qǐng)求錯(cuò)誤、請(qǐng)求超時(shí)、獲取數(shù)據(jù)失敗、暫無(wú)數(shù)據(jù)等等 let responseInterceptors = [ ?? ?res => { ?? ??? ?//取消loading加載 ?? ??? ? ?? ??? ?//對(duì)返回狀態(tài)進(jìn)行判斷:如請(qǐng)求錯(cuò)誤、請(qǐng)求超時(shí)、獲取數(shù)據(jù)失敗等等 ?? ??? ?//返回結(jié)果 ?? ??? ?return Promise.resolve(res); ?? ?}, ?? ?err => { ?? ??? ?//取消loading加載 ?? ??? ? ?? ??? ?//對(duì)返回狀態(tài)進(jìn)行判斷:如請(qǐng)求錯(cuò)誤、請(qǐng)求超時(shí)、獲取數(shù)據(jù)失敗等等 ?? ??? ?//返回結(jié)果 ?? ??? ?return Promise.reject(err); ?? ?} ] //組裝請(qǐng)求 let serviceCreate = config => { ?? ?let service = axios.create(merge({}, config)); ?? ?service.interceptors.request.use(...requestInterceptors); ?? ?service.interceptors.response.use(...responseInterceptors); ?? ?return service } serviceCreate(); export { serviceCreate, merge };
4、api.js代碼如下:
import { serviceCreate, merge } from '@/http/request'; //這種方式可以采用單個(gè)項(xiàng)目的接口,也可以使用多個(gè)項(xiàng)目的接口,看自己的項(xiàng)目情況而定 let http0 = serviceCreate({ ? ? baseURL: '/project1/api1', ? ? timeout: 15000,//請(qǐng)求超時(shí) ? ? emulateJSON: true,//默認(rèn)表單提交 }) let http1 = serviceCreate({ ? ? baseURL: '/project2/api2', ? ? timeout: 15000,//請(qǐng)求超時(shí) ? ? emulateJSON: true,//默認(rèn)表單提交 }) //get請(qǐng)求示例 export function getData(params, config) { ? ? return http0.get('/project/list', merge(config, { params })); } //delete請(qǐng)求示例 export function deleteData(params, config) { ? ? return http0.delete('/project/list', merge(config,{ params })); } //post請(qǐng)求示例(表單提交) export function postDataFrom(params, config) { ? ? return http0.post('/project/list', params, config); } //post請(qǐng)求示例(json提交) export function postDataJson(params, config) { ? ? return http0.post('/project/list', params, merge(config, { emulateJSON: false })); } //put請(qǐng)求示例(表單提交) export function putDataFrom(params, config) { ? ? return http0.put('/project/list', params, config); } //put請(qǐng)求示例(json提交) export function putDataJson(params, config) { ? ? return http0.put('/project/list', params, merge(config, { emulateJSON: false })); }
5、頁(yè)面中調(diào)用
import { getData, deleteData, postDataFrom, postDataJson, putDataFrom, putDataJson } from "@/http"; getData({ name: "我是參數(shù)" }).then(res => { console.log("返回?cái)?shù)據(jù)", res) }) deleteData({ name: "我是參數(shù)" }).then(res => { console.log("返回?cái)?shù)據(jù)", res) }) postDataFrom({ name: "我是參數(shù)" }).then(res => { console.log("返回?cái)?shù)據(jù)", res) }) postDataJson({ name: "我是參數(shù)" }).then(res => { console.log("返回?cái)?shù)據(jù)", res) }) putDataFrom({ name: "我是參數(shù)" }).then(res => { console.log("返回?cái)?shù)據(jù)", res) }) putDataJson ({ name: "我是參數(shù)" }).then(res => { console.log("返回?cái)?shù)據(jù)", res) })
vue3 axios簡(jiǎn)易封裝教程
首先在根目錄下新建utils文件夾,并在下面新建兩個(gè)文件,requests.js和html.js
requests.js用于引入axios并設(shè)置根域名以及一些默認(rèn)設(shè)置、攔截器等。
import axios from "axios"; const service = axios.create({ baseURL: 'http://localhost:3000', timeout: 10000, }) // 請(qǐng)求攔截器 service.interceptors.request.use(config=>{ return config },err=>{ return Promise.reject(err) //返回錯(cuò)誤 }) // 響應(yīng)攔截器 service.interceptors.response.use(res=>{ return res },err=>{ return Promise.reject(err) //返回錯(cuò)誤 }) export default service
寫完之后將創(chuàng)建的實(shí)例對(duì)象暴露出去,在html.js中進(jìn)行引入
html.js文件的作用是調(diào)用requests的實(shí)例對(duì)象,并將所有的訪問(wèn)均存放在這個(gè)文件中(api),使用的時(shí)候按需引入即可。
import request from "./requests"; export const GetPosts = () => request.get('posts/1') export const GetsearchData = (params) => request.get('/list',{params}) export const PostPosts = (params) => request.post('posts',params)
引入的文件:
<template> <el-button type="primary" @click="clickGet">點(diǎn)我發(fā)送get請(qǐng)求</el-button> <el-button type="primary" @click="clickPost">點(diǎn)我發(fā)送post請(qǐng)求</el-button> <el-button type="primary" @click="clickPut">點(diǎn)我發(fā)送put請(qǐng)求</el-button> <el-button type="primary" @click="clickDel">點(diǎn)我發(fā)送delete請(qǐng)求</el-button> </template> <script> import { GetPosts, PostPosts } from "../../utils/html" export default { setup(){ function clickGet(){ GetPosts().then(res => { console.log(res) }) // axios({ // method: 'GET', // url: 'http://localhost:3000/posts' // }).then(res => { // console.log(res) // }) } function clickPost(){ PostPosts({ title: '我超級(jí)喜歡打游戲', author: '賬本兒erer', age: '24' }).then(res => { console.log(res) }) } function clickPut(){ } function clickDel(){ } return { clickDel, clickGet, clickPost, clickPut } } } </script> <style> </style>
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
vue組件定義,全局、局部組件,配合模板及動(dòng)態(tài)組件功能示例
這篇文章主要介紹了vue組件定義,全局、局部組件,配合模板及動(dòng)態(tài)組件功能,結(jié)合實(shí)例形式分析了vue.js中組件的定義、全局組件、局部組件、配合模板組件及動(dòng)態(tài)組件的相關(guān)使用方法與操作注意事項(xiàng),需要的朋友可以參考下2019-03-03vue中el-select 和el-tree二次封裝實(shí)現(xiàn)
本文介紹了vue中el-select 和el-tree二次封裝實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-11-11vue后臺(tái)項(xiàng)目如何使用router.addRoutes動(dòng)態(tài)加入路由的思路
這篇文章主要介紹了vue后臺(tái)項(xiàng)目如何使用router.addRoutes動(dòng)態(tài)加入路由的思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06vue中element 上傳功能的實(shí)現(xiàn)思路
這篇文章主要介紹了vue中element 的上傳功能的實(shí)現(xiàn)思路,本文大概通過(guò)兩種實(shí)現(xiàn)思路,具體內(nèi)容詳情大家跟隨腳本之家小編一起看看吧2018-07-07vue 解決移動(dòng)端彈出鍵盤導(dǎo)致頁(yè)面fixed布局錯(cuò)亂的問(wèn)題
今天小編就為大家分享一篇vue 解決移動(dòng)端彈出鍵盤導(dǎo)致頁(yè)面fixed布局錯(cuò)亂的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-11-11vue2利用html2canvas+jspdf動(dòng)態(tài)生成多頁(yè)P(yáng)DF方式
利用vue2結(jié)合html2canvas和jspdf,可以實(shí)現(xiàn)前端頁(yè)面內(nèi)容導(dǎo)出為PDF的功能,首先需要安裝相關(guān)依賴,使用html2canvas將指定div內(nèi)容捕捉為圖像,再通過(guò)jspdf將圖像轉(zhuǎn)換為PDF2024-09-09vue3中WatchEffect高級(jí)偵聽器的實(shí)現(xiàn)
本文主要介紹了vue3中WatchEffect高級(jí)偵聽器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01