亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
vue3 ts axios pinia實作無感刷新
vue3無痛刷新(無感刷新)
實作過程
首頁 web前端 Vue.js 怎麼使用vue3+ts+axios+pinia實現(xiàn)無感刷新

怎麼使用vue3+ts+axios+pinia實現(xiàn)無感刷新

May 25, 2023 pm 03:37 PM
vue3 axios pinia

vue3 ts axios pinia實作無感刷新

1.先在專案中下載aiXos和pinia

npm i pinia --save
npm install axios --save

2.封裝axios請求-----

#下載js-cookie

npm i JS-cookie -s
//引入aixos
import type { AxiosRequestConfig, AxiosResponse } from "axios";
import axios from 'axios';
import { ElMessage } from 'element-plus';
import { useUserInfoStore } from '@/stores/modules/UserInfo'
import router from '@/router';
import qs from 'qs';
import Cookie from "js-cookie";
let baseURL = "";
// console.log(process.env.NODE_ENV);//判斷環(huán)境
if (process.env.NODE_ENV === 'development') {
    baseURL = '/m.api'//后臺請求接口地址
} else {
    baseURL = 'http://xxxx.cn:8080';//這里是項目上線后的地址
   
}
declare interface TypeResponse extends AxiosResponse {
    /**
     * 錯誤號,200表示成功,10006令牌過期
     */
    errno: number,
    /**
     * 返回的信息
     */
    errmsg: string
}
 
//創(chuàng)建axios實例
 
const instance = axios.create({
    baseURL,  // 接口地址
    timeout: 3000,
    headers: {
        "Content-Type": 'application/x-www-form-urlencoded'
    }
 
});
 
 
//添加攔截器
instance.interceptors.request.use((config) => {
    // 在發(fā)送請求之前做些什么--給請求頭添加令牌token
    (config as any).headers['AdminToken'] = Cookie.get('token')//從cookie中拿token值,
//這里是使用了js-cookie插件。
    // console.log(config, "請求攔截器")
    return config
}, reeor => {
    // 對請求錯誤做些什么
    return Promise.reject(reeor);
});
// 需要無痛刷新的操作頁面
const METHOD_TYPE = ["_mt=edit", "_mt=create", "_mt=delete"]
// //響應(yīng)攔截器
instance.interceptors.response.use(async (response: AxiosResponse) => {
    // 對響應(yīng)數(shù)據(jù)做點什么
    let data = response.data;
    let { errno, errmsg } = data;
    console.log(response, "響應(yīng)攔截器");
    let path = router.currentRoute.value.fullPath;//當(dāng)前路由路徑
    if (10006 === errno) {
        const configData = response.config.data || ''
        // 判斷請求類型是否需要無痛刷新,index !== -1則需要無痛刷新
        let index = METHOD_TYPE.findIndex(item => configData.includes(item))
        if (-1 === index) {//需要重新登入獲取令牌
            router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
            return
        } else {//需要無痛刷新令牌
            const store = useUserInfoStore();
            const { username, password } = store.LoginInfo//在狀態(tài)管理里面定義一個loginInfo
            // 1.重新獲取令牌
            let loginData = { _gp: 'admin', _mt: 'login', username, password };
            const { errno, errmsg, data } = await post(loginData)//這里是通過async 將異步序列化改為同步
            if (200 == errno) {
                Cookie.set('token', data)//保存令牌
            } else {
                router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
                return Promise.reject({ errno, errmsg, data })
            }
            return instance.request(response.config)
        }
    // ElMessage.error(errmsg);//錯誤信息
    }
    return data;
}, reeor => {
    console.log(reeor);
 
    return Promise.reject(reeor);
})
 
function get(params?: object): Promise<TypeResponse> {
    return instance.get(&#39;&#39;, { params });
};
function post(data: object, params?: object): Promise<TypeResponse> {
    return instance.post(&#39;&#39;, qs.stringify(data), { params });
};
 
 
//暴露實列
export {
    post, get,
}

3.qs.stringify(data)是將請求的資料轉(zhuǎn)成表單格式,如果不需要直接去掉就可以了;

4.重新登入後跳轉(zhuǎn)路由需要設(shè)置,不需要可以去掉

#5。狀態(tài)管理--數(shù)據(jù)

下載持久化工具

npm install pinia-plugin-persistedstate --s

在main.js中配置持久化

//引入數(shù)據(jù)持久化插件
import piniaPluginPersistedstate from &#39;pinia-plugin-persistedstate&#39;;
const pinia = createPinia()
pinia.use(piniaPluginPersistedstate);
app.use(pinia)
import { defineStore } from &#39;pinia&#39;
export const useUserInfoStore = defineStore(&#39;UserInfo&#39;, {
    state:() => ({
       
        LoginInfo:{
            username:&#39;&#39;,
            password:&#39;&#39;
        }
      }),
     
      persist:true;//狀態(tài)存儲持久化
})

6.登入頁面--儲存表單數(shù)據(jù),也就是用戶姓名和密碼

npm i lodash --s
import Cookies from &#39;js-cookie&#39;;//引入cookie
import * as _ from &#39;lodash&#39;;//防抖節(jié)流插件
import {post} from &#39;@/util&#39;;
import {useUserInfoStore} from &#39;@/stores/modules/UserInfo&#39; ;//用戶信息
import { useRouter,useRoute } from &#39;vue-router&#39; ;//引入路由
//這里是表單輸入的數(shù)據(jù)
const ruleForm = reactive({
    password: &#39;123456&#39;,
    username: &#39;admin&#39;
});
//請求接口數(shù)據(jù)
let data = {
    _gp: "admin",
    _mt: &#39;login&#39;,
    ...ruleForm
};
 
let LoginInfo = useUserInfoStore().LoginInfo;//狀態(tài)管理定義的數(shù)據(jù)
async function init() {
    await post(data).then((res:any) => {
        let { data: token, errno, errmsg } = res
        if (200 === errno) {
            let time = new Date() //設(shè)置過期時間
            time.setTime(time.getTime() + 1000 * 60 * 30)
            Cookies.set(&#39;token&#39;, token, { expires: time });
            Object.assign(LoginInfo,ruleForm)
            if (route.query.back) { //如果存在參數(shù)
             let paths = route.query.back+&#39;&#39;//拼接字符串
             console.log(paths);
             if (paths==&#39;/&#39;) {
//因為我的home是&#39;/&#39;,所有需要判斷
                router.replace(&#39;/Surface&#39;)//跳轉(zhuǎn)至主頁
                return
             }else{
                router.replace(paths)//則跳轉(zhuǎn)至進(jìn)入登錄頁前的路由
             }
             
           } else {
            router.replace(&#39;/Surface&#39;)//否則跳轉(zhuǎn)至首頁
           }
            
        } else {
            ElMessage.error(errmsg)
        }
    }).catch((err:any) => {
        ElMessage.error(&#39;登錄異常!&#39;)
    })
    let info = {//用戶信息請求信息接口數(shù)據(jù)
        _gp: "admin",
        _mt: &#39;info&#39;,
    }
//下面這個函數(shù)是請求用戶信息的,不需要可以不寫
    await post(info).then((res:any) => {
        let {data} = res
        console.log(data);
        infos(data)
 
    }).catch((err:any)=>{
        ElMessage.error(&#39;登錄異常!&#39;)
    })
}
//防抖節(jié)流
const fangdou = _.debounce(init, 1500, {
    leading: true,  // 延長開始后調(diào)用
    trailing: false  // 延長結(jié)束前調(diào)用
})
//移除組件時,取消防抖
onUnmounted(() => {
    fangdou.cancel()
})

7.main.js設(shè)定路由守衛(wèi)

import Cookie from &#39;js-cookie&#39;
import router from &#39;./router&#39;//引入路由
 
//路由守衛(wèi)
router.beforeEach(async (to, from ) => {
    let tokent:string|undefined = Cookie.get(&#39;token&#39;)
    if (!tokent && to.path == &#39;/login&#39;) {
        return  true
    }
    // 沒有登錄,強制跳轉(zhuǎn)登錄頁
    if (!tokent && to.path !== &#39;/login&#39;) {
        router.replace({path:&#39;/login&#39;,query:{back:to.path}});
    }
    // 防止重復(fù)登錄
    if (tokent && to.path === &#39;/login&#39;) {
        return {
            path: from.path ? from.path : &#39;/Surface&#39;
        }
    }
    return true
})

大概就是這麼多了

vue3無痛刷新(無感刷新)

#無痛刷新的原理:當(dāng)token過期後,在回應(yīng)攔截器透過判斷重新進(jìn)行登錄請求

實作過程

在狀態(tài)管理state中定義一個loginInfo物件用於儲存使用者的帳號和密碼

//在狀態(tài)管理文件中
import { defineStore } from &#39;pinia&#39;
import Cookies from "js.cookie"
import {post} from &#39;@/http&#39;
 
import router from &#39;@/router&#39;;
import { ElMessage } from &#39;element-plus&#39;;
export const useUserStore = defineStore({
  id: "userStore",
  persist: {
    paths:[&#39;user&#39;]
  },//持久化
  state: () => ({
    loginInfo:{
      username:&#39;&#39;, 
      password:&#39;&#39;
    }
  }),
  getters: {},
  actions: {
    setUser(user:UserInfo) {
      this.user = user;
    },
    loginOut(){
      const data ={
        _gp:"admin",
        _mt:"logout"
      }
      post({},data).then((res:any)=>{
        let {errmsg,errno} = res
        if(200==errno){
          localStorage.removeItem("userStore")
          Cookies.remove("token")
          router.replace(&#39;/login&#39;)
          ElMessage.success(errmsg);
        }else{
          ElMessage.error(errmsg);
        }
      }).catch(res=>{
      console.log(res,"退出登入失敗");
      })
    }
  }
})

登錄頁面中,在登錄請求成功後將使用者的帳號和密碼儲存在狀態(tài)管理

//在登入頁面文件中
const data = { ...ruleForm, _gp: "admin", _mt: "login" }//轉(zhuǎn)換成字符串
post({}, data).then(res => {
    let { data: token, errmsg, errno } = res as any;//獲取登錄狀態(tài)
    if (200 == errno) {//登錄成功的判斷
        ElMessage.success("登錄成功!")//消息提示登錄成功
        let now = new Date();//獲取當(dāng)前時間
        now.setTime(now.getTime() + 1000 * 60 * 30);//轉(zhuǎn)成時間類型
        Cookies.set("token", res.data, { expires: now })//獲取token存到cookie
        Object.assign(store.loginInfo, ruleForm)//將賬號密碼存儲到狀態(tài)管理
        return Promise.resolve(token)
    } else {
        ElMessage.error(errmsg);//登入失敗
        return Promise.reject(errmsg)
    }
})

3.在http中,先定義一個數(shù)組變量,該數(shù)組存放需要無痛刷新的操作如:刪除、新增、編輯

4.在回應(yīng)攔截器中,判斷10006是否等於errno,如果相等說明令牌過期了,否則沒過期

# 5.令牌過期,取得介面請求資料在定義的陣列中尋找判斷請求類型是否需要無痛刷新

#6.index===-1則表示在陣列中沒有找到也就不需要無痛刷新,直接跳到登入頁面進(jìn)行登錄

7.index! ==-1則表示需要無痛刷新,將狀態(tài)管理中儲存的使用者帳號和密碼解構(gòu)出來,進(jìn)行登入介面請求從而達(dá)到重新取得令牌,進(jìn)而達(dá)到不需要進(jìn)入登入頁面就可以進(jìn)行登入請求也就達(dá)到無痛刷新的效果

//在封裝的http文件中
import axios, { type AxiosResponse } from &#39;axios&#39;;
import qs from &#39;qs&#39;
import Cookies from "js.cookie"
import router from &#39;@/router&#39;;
import { ElMessage } from &#39;element-plus&#39;;
import { useUserStore } from &#39;@/stores/admin&#39;;
 
declare interface TypeResponse extends AxiosResponse {
    url(url: any): unknown;
    [x: string]: any;
    /**
     * 錯誤號,200表示成功,10006令牌過期
     */
    errno: number,
    /**
     * 失敗返回的消息
     */
    error: string,
    /**
     * 成功后返回的消息
    */
    errmsg: string
 
}
let baseURL = &#39;&#39;
 
if (process.env.NODE_ENV === "development") {
    baseURL = &#39;/m.api&#39;
} else {
    baseURL = "http://zxwyit.cn:8080/m.api"//上線后的路徑
}
 
const instance = axios.create({//創(chuàng)建實例
    baseURL,
    headers: { "content-type": "application/x-www-form-urlencoded" }
})
 
// 請求攔截器
instance.interceptors.request.use(function (config) {
    if (config.headers) {
        config.headers[&#39;AdminToken&#39;] = Cookies.get("token") + &#39;&#39;
    }
    return config
}, function (error) {
    console.error(&#39;請求錯誤&#39;, error)
    return Promise.reject(error)
}
)
// 無痛刷新的原理:當(dāng)token過期后,在響應(yīng)攔截器通過判斷重新進(jìn)行登入請求
// 實現(xiàn)過程:
// 1.在狀態(tài)管理state中定義一個loginInfo對象用于存儲用戶的賬號和密碼
// 2.登入頁面中,在登入請求成功后將用戶的賬號和密碼存儲在狀態(tài)管理
// 3.在http中,先定義一個數(shù)組變量,該數(shù)組存放需要無痛刷新的操作如:刪除、添加、編輯
// 4.在響應(yīng)攔截器中,判斷10006是否等于errno,如果相等說明令牌過期了,否則沒過期
// 5.令牌過期,獲取接口請求數(shù)據(jù)在定義的數(shù)組中查找判斷請求類型是否需要無痛刷新
// 6.index===-1則表示在數(shù)組中沒有找到也就不需要無痛刷新,直接跳到登入頁面進(jìn)行登入
// 7.index!==-1則表示需要無痛刷新,將狀態(tài)管理中存儲的用戶賬號和密碼解構(gòu)出來,
// 進(jìn)行登入接口請求從而達(dá)到重新獲取令牌,進(jìn)而達(dá)到不需要進(jìn)入登入頁面就可以進(jìn)行登入請求也就達(dá)到無痛刷新的效果
 
// 需要無痛刷新的操作頁面
const METHOD_TYPE = ["_mt=edit", "_mt=create", "_mt=delete"]
// 響應(yīng)攔截器
instance.interceptors.response.use(async function (response) {
    let data = response.data//強解
    let { errno, errmsg } = data//結(jié)構(gòu)賦值
    let path = router.currentRoute.value.fullPath//獲取路徑
    console.log(errno,&#39;errno&#39;);
    
    if (10006 == errno) {
        // 獲取接口請求數(shù)據(jù)
        const configData = response.config.data || &#39;&#39;
        // 判斷請求類型是否需要無痛刷新,index !== -1則需要無痛刷新
        let index = METHOD_TYPE.findIndex(item => configData.includes(item))
        if (-1 === index) {//需要重新登入獲取令牌
            router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
            return
        } else {//需要無痛刷新令牌
            const store = useUserStore();
            const { username, password } = store.loginInfo//在狀態(tài)管理里面定義一個loginInfo
            // 1.重新獲取令牌
            let loginData = { _gp: &#39;admin&#39;, _mt: &#39;login&#39;, username, password };
            const { errno, errmsg, data } = await post(loginData)//這里是通過async 將異步序列化改為同步
            if (200 == errno) {
 
                Cookies.set(&#39;token&#39;, data)//保存令牌
            } else {
        console.log(55);
 
                router.replace({ path: "/login", query: { back: path } })//登入后需要跳回的地址
                return Promise.reject({ errno, errmsg,data})
            }
            return instance.request(response.config)
        }
    }
    return data
}, function (error) {
    console.error(&#39;響應(yīng)錯誤&#39;, error)
    return Promise.reject(error)
}
)
function get(params?: object): Promise<TypeResponse> {
    return instance.get("", { params })
}
function post(data: object, params?: object): Promise<TypeResponse> {
    return instance.post("", qs.stringify(data), { params })
}
 
/**
 * 富文本框圖片上傳請求
 */
export function upload(data: object): Promise<TypeResponse> {
    return instance.post("http://192.168.1.188:8080/upload/admin", data);
}
 
export { get, post }

以上是怎麼使用vue3+ts+axios+pinia實現(xiàn)無感刷新的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

在Vue應(yīng)用程式中使用axios時出現(xiàn)「Uncaught (in promise) Error: Request failed with status code 500」怎麼辦? 在Vue應(yīng)用程式中使用axios時出現(xiàn)「Uncaught (in promise) Error: Request failed with status code 500」怎麼辦? Jun 24, 2023 pm 05:33 PM

在Vue應(yīng)用程式中使用axios是十分常見的,axios是一種基於Promise的HTTP客戶端,可以用於瀏覽器和Node.js。在開發(fā)過程中,有時會出現(xiàn)「Uncaught(inpromise)Error:Requestfailedwithstatuscode500」的錯誤提示,對於開發(fā)者來說,這個錯誤提示可能有些難以理解和解決。本文將會探討這

在Vue應(yīng)用程式中使用axios時出現(xiàn)「Error: Network Error」怎麼解決? 在Vue應(yīng)用程式中使用axios時出現(xiàn)「Error: Network Error」怎麼解決? Jun 25, 2023 am 08:27 AM

在Vue應(yīng)用程式中使用axios時出現(xiàn)「Error:NetworkError」怎麼解決?在Vue應(yīng)用程式的開發(fā)中,我們常常會使用到axios進(jìn)行API的請求或資料的獲取,但是有時我們會遇到axios請求出現(xiàn)「Error:NetworkError」的情況,這時我們該怎麼辦呢?首先,需要了解「Error:NetworkError」是什麼意思,它通常表示網(wǎng)路連

在Vue應(yīng)用程式中使用axios時出現(xiàn)「TypeError: Failed to fetch」怎麼辦? 在Vue應(yīng)用程式中使用axios時出現(xiàn)「TypeError: Failed to fetch」怎麼辦? Jun 24, 2023 pm 11:03 PM

最近,在使用Vue應(yīng)用程式開發(fā)過程中,我遇到了一個常見的問題:「TypeError:Failedtofetch」錯誤提示。這個問題出現(xiàn)在使用axios進(jìn)行HTTP請求時,後端伺服器沒有正確回應(yīng)請求時發(fā)生。這種錯誤提示通常表示請求無法到達(dá)伺服器,可能是由於網(wǎng)路原因或伺服器未回應(yīng)造成的。出現(xiàn)這個錯誤提示後,我們該怎麼辦呢?以下是一些解決方法:檢查網(wǎng)路連接由於

Vue中資料請求的選擇:Axios or Fetch? Vue中資料請求的選擇:Axios or Fetch? Jul 17, 2023 pm 06:30 PM

Vue中資料請求的選擇:AxiosorFetch?在Vue開發(fā)中,處理資料請求是一個非常常見的任務(wù)。而選擇使用哪種工具來進(jìn)行資料請求,則是需要考慮的問題。在Vue中,最常見的兩種工具是Axios和Fetch。本文將會比較這兩種工具的優(yōu)缺點,並給出一些範(fàn)例程式碼來幫助你做出選擇。 Axios是一個基於Promise的HTTP客戶端,可以在瀏覽器和Node.

Vue3中怎麼實現(xiàn)選取頭像並裁剪 Vue3中怎麼實現(xiàn)選取頭像並裁剪 May 29, 2023 am 10:22 AM

最終效果安裝VueCropper組件yarnaddvue-cropper@next上面的安裝值針對Vue3的,如果時Vue2或想使用其他的方式引用,請訪問它的npm官方地址:官方教程。在元件中引用使用時也很簡單,只需要引入對應(yīng)的元件和它的樣式文件,我這裡沒有在全域引用,只在我的元件檔案中引入import{userInfoByRequest}from'../js/api' import{VueCropper}from'vue-cropper&

高效利用Vue和Axios實現(xiàn)前端資料的批次處理 高效利用Vue和Axios實現(xiàn)前端資料的批次處理 Jul 17, 2023 pm 10:43 PM

高效利用Vue和Axios實現(xiàn)前端資料的批次處理在前端開發(fā)中,資料的處理是一個常見的任務(wù)。當(dāng)我們需要處理大量資料時,如果沒有有效的方法,處理資料將會變得十分繁瑣和低效。 Vue是一種優(yōu)秀的前端框架,而Axios是一個流行的網(wǎng)路請求庫,它們可以協(xié)同工作來實現(xiàn)前端資料的批次處理。本文將詳細(xì)介紹如何有效利用Vue和Axios來進(jìn)行資料的批次處理,並提供相關(guān)的程式碼範(fàn)例

在Vue應(yīng)用程式中使用axios時出現(xiàn)「Error: timeout of xxxms exceeded」怎麼辦? 在Vue應(yīng)用程式中使用axios時出現(xiàn)「Error: timeout of xxxms exceeded」怎麼辦? Jun 24, 2023 pm 03:27 PM

在Vue應(yīng)用程式中使用axios時出現(xiàn)「Error:timeoutofxxxmsexceeded」怎麼辦?隨著網(wǎng)路的快速發(fā)展,前端技術(shù)也不斷地更新迭代,Vue作為優(yōu)秀的前端框架,近年來受到大家的歡迎。在Vue應(yīng)用程式中,我們常常需要使用axios來進(jìn)行網(wǎng)路請求,但是有時候會出現(xiàn)「Error:timeoutofxxxmsexceeded」的錯誤

Vue實作檔案上傳的完整指南(axios、element-ui) Vue實作檔案上傳的完整指南(axios、element-ui) Jun 09, 2023 pm 04:12 PM

Vue實作檔案上傳的完整指南(axios、element-ui)在現(xiàn)代Web應(yīng)用程式中,檔案上傳已成為一項基本的功能。無論是上傳頭像、圖片、文件或視頻,我們都需要一個可靠的方法來將文件從用戶的電腦上傳到伺服器中。本文將為您提供一份詳細(xì)的指南,介紹如何使用Vue、axios和element-ui來實現(xiàn)檔案上傳。什麼是axiosaxios是一個基於prom

See all articles