項(xiàng)目結(jié)構(gòu):?
目錄
???????index.ts
????????api.ts
看完需要預(yù)計(jì)花費(fèi)10分鐘。
請(qǐng)求攔截器與響應(yīng)攔截器?
閱讀下面代碼需先了解以下內(nèi)容:
? ?
????請(qǐng)求攔截器:
? ? 請(qǐng)求攔截器的作用是在請(qǐng)求發(fā)送前進(jìn)行一些操作,例如在每個(gè)請(qǐng)求體里加上token,每次請(qǐng)求攜帶token傳給后端,統(tǒng)一做處理。
? ? 響應(yīng)攔截器:
? ? 響應(yīng)攔截器的作用是在接收到響應(yīng)后進(jìn)行一些操作,例如在服務(wù)器返回登錄狀態(tài)token失效,需要重新登錄的時(shí)候,跳轉(zhuǎn)到登錄頁,對(duì)不同狀態(tài)碼做不同處理。
???????index.ts
?
?先檢查package.json文件是否已安裝axios,沒安裝先安裝。。。
安裝命令如下:?
npm i axios -S
import axios from "axios";
//創(chuàng)建axios實(shí)例
const service = axios.create({
baseURL: "https://www.xxxxxxx.site/mock/xxxxx/api",
timeout: 5000,//超時(shí)時(shí)間
headers: {//編譯語言
"Content-type": "application/json;charset=utf-8"
}
})
//請(qǐng)求攔截
//就是你請(qǐng)求接口的時(shí)候,我會(huì)先攔截下來,對(duì)你的數(shù)據(jù)做一個(gè)判斷,或者攜帶個(gè)token給你
service.interceptors.request.use((config) => {//請(qǐng)求的數(shù)據(jù)
config.headers = config.headers || {} // 沒有數(shù)據(jù)的話就設(shè)置為空設(shè)置為數(shù)據(jù)
if (localStorage.getItem("token")) {//先確保登錄
config.headers.token = localStorage.getItem("token") || ""
}
return config//必須返回出去,不然請(qǐng)求發(fā)不出去
}, error => {
//處理錯(cuò)誤請(qǐng)求
return Promise.reject(error)
})
//響應(yīng)攔截:后端返回來的結(jié)果
service.interceptors.response.use((res) => {
const code: number = res.data.code//code是后端的狀態(tài)碼
if (code !== 200) {
//請(qǐng)求失敗(包括token失效,302,404...根據(jù)和后端約定好的狀態(tài)碼做出不同的處理)
return Promise.reject(res)
} else {
//請(qǐng)求成功
console.log(res, '成功----')
return Promise.resolve(res.data)
}
}, (err) => {
console.log(err, '錯(cuò)誤信息的處理')//錯(cuò)誤信息的處理
//處理錯(cuò)誤響應(yīng)
return Promise.reject(err)
})
//因?yàn)閯e的地方要用,所以就把實(shí)例暴露出去,導(dǎo)出
export default service
????????api.ts
//我要用到的一些接口
import service from "@/request/index";
import {ILoginData} from "@/type/login"; //引入接口
// 登錄接口
export function login(data: ILoginData) {//接口ILoginData接口的變量名
return service({
url: "/login",
method: "POST",
data
})
}
// 商品列表接口
export function getGoodsList(){
return service({
url: "/getGoodsList",
method: "GET"
})
}
// 用戶列表接口
export function getUserList(){
return service({
url: "/getUserList",
method: "GET"
})
}
// 角色列表接口
export function getRoleList(){
return service({
url: "/getRoleList",
method: "GET"
})
}
// 權(quán)限列表接口
export function getAuthorityList(){
return service({
url: "/getAuthorityList",
method: "GET",
})
}
?調(diào)用封裝好的axios方法,下面有個(gè)Login登錄調(diào)用接口示例:
login(data.ruleForm).then((res) => {
console.log(res,'111')
//使用 localStorage.setItem,將token保存到localStorage
// res.data.token是后端返回的信息
localStorage.setItem("token", res.data.token);
// 并且跳轉(zhuǎn)到首頁
router.push('/')
}).catch((err)=>{
console.log(err,'err')
});
????????看完整示例:
<template>
<div class="login-box">
<div>
<el-form ref="ruleFormRef" :model="ruleForm" status-icon :rules="rules" label-width="70px">
<el-form-item style="width:400px" label="用戶名:" prop="username">
<el-input v-model="ruleForm.username" type="text" autocomplete="off" />
</el-form-item>
<el-form-item style="width:400px" label="密碼:" prop="password">
<el-input v-model="ruleForm.password" type="password" autocomplete="off" />
</el-form-item>
<el-form-item>
<el-button class="login-btn" type="primary" @click="submitForm(ruleFormRef)">登錄</el-button>
<el-button class="login-btn" @click="resetForm()">重置</el-button>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script lang="ts">
//ts中有一個(gè)類型推斷
// ref有個(gè)value屬性,可以獲取值
import {
defineComponent,
reactive,
toRefs,
ref
} from 'vue'
import {LoginData} from '../type/login'
import type {FormInstance} from 'element-plus'
import {login} from '../request/api'
import {useRouter} from 'vue-router'
export default defineComponent({
setup() {
const data = reactive(new LoginData()); //調(diào)用這個(gè)類,然后實(shí)例化對(duì)象
const router = useRouter(); // 等于$router
// 表單輸入規(guī)則
const rules = {
username: [{
required: true, //是否必須字段
message: "請(qǐng)輸入用戶名", // 觸發(fā)的提示信息
trigger: "blur" // 觸發(fā)時(shí)機(jī): 當(dāng)失去焦點(diǎn)時(shí)(光標(biāo)不顯示的時(shí)候),觸發(fā)此提示
},
{
min: 3, // 最小字符書
max: 5, // 最大字符數(shù)
message: "用戶名長(zhǎng)度需要在3-5個(gè)字符之間", // 觸發(fā)的提示信息
trigger: "blur"
}
],
password: [{
required: true, //是否必須字段
message: "請(qǐng)輸入密碼", // 觸發(fā)的提示信息
trigger: "blur" // 觸發(fā)時(shí)機(jī): 當(dāng)失去焦點(diǎn)時(shí)(光標(biāo)不顯示的時(shí)候),觸發(fā)此提示,就會(huì)進(jìn)行校驗(yàn)
},
{
min: 3, // 最小字符書
max: 6, // 最大字符數(shù)
message: "密碼長(zhǎng)度需要在3-5個(gè)字符之間", // 觸發(fā)的提示信息
trigger: "blur"
}
]
}
//登錄
const ruleFormRef = ref < FormInstance > () //ref獲取這個(gè)表單的所有值
// formEl獲取到的是一整個(gè)原型,里面有很多方法和屬性
// 比如 formEl.resetFields()就可以直接清空表單,具體可以看element的文檔
const submitForm = (formEl: FormInstance | undefined) => {
if (!formEl) return //沒有就返回
// 驗(yàn)證表單,valid是一個(gè)布爾類型
formEl.validate((valid) => {
if (valid) { //如果為true,則調(diào)用接口,完成登錄
login(data.ruleForm).then((res) => {
console.log(res,'111')
//使用 localStorage.setItem,將token保存到localStorage
// res.data.token是后端返回的信息
localStorage.setItem("token", res.data.token);
// 并且跳轉(zhuǎn)到首頁
router.push('/')
}).catch((err)=>{
console.log(err,'err')
});
} else {
console.log('error submit!')
return false
}
})
}
// 重置
const resetForm = () => {
data.ruleForm.username = "";
data.ruleForm.password = "";
};
return {
...toRefs(data),
rules,
ruleFormRef,
submitForm,
resetForm
} //要用到的數(shù)據(jù)都要導(dǎo)出來
}
})
</script>
小提示: vue 請(qǐng)求報(bào)錯(cuò) Uncaught (in promise) 的解決方法 :
??
如果promise中 reject的錯(cuò)誤沒有被捕獲到就會(huì)報(bào)這個(gè)錯(cuò)誤,只要在
Function(data).then(res => {.......})
后面加上.catch((e) => {}),就不會(huì)報(bào)錯(cuò)了?
?
?文章來源:http://www.zghlxwxcb.cn/news/detail-770240.html
??結(jié)束語??
???????后續(xù)新出會(huì)陸續(xù)補(bǔ)充...文章來源地址http://www.zghlxwxcb.cn/news/detail-770240.html
到了這里,關(guān)于Vue3創(chuàng)建項(xiàng)目(四)axios封裝及接口配置的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!