Vue淺析axios二次封裝與節(jié)流及防抖的實現(xiàn)
什么是axios
Axios,是一個基于 promise 的網(wǎng)絡(luò)請求庫,作用于node.js和瀏覽器中,它是 isomorphic 的(即同一套代碼可以運行在瀏覽器和node.js中)。
使用方式如下:
<script> //調(diào)用axios方法得到的返回值是 promise 對象 axios({ //請求方式 method: 'get', // 請求地址 url: 'http://www.liulongbin.top:3006/api/getbooks'//黑馬的老師提供的地址 }).then(function(books) { console.log(books.data) }) // 另一種寫法 const result = axios({ method: 'get', url: 'http://www.liulongbin.top:3006/api/getbooks' }) result.then(function(books){ console.log(books.data) }) </script>
axios請求圖例
axios的二次封裝
為什么要進行二次封裝
請求攔截器和響應(yīng)攔截器
- 請求攔截器:可以在發(fā)請求之前可以處理一些業(yè)務(wù)
- 響應(yīng)攔截器:當(dāng)服務(wù)器數(shù)據(jù)返回以后,可以處理一些事情
代碼如下:
//對于axios進行二次封裝 import axios from 'axios' import nprogress from 'nprogress'; // start:進度條開始 done:進度條結(jié)束 //1:利用axios對象的方法create,去創(chuàng)建一個axios實例 //引入進度條樣式 import 'nprogress/nprogress.css' //2:request就是axios,只不過稍微配置一下子 const requests =axios.create({ //配置對象 //基礎(chǔ)路徑,發(fā)請求的時候,;路徑中會出現(xiàn)/api,自己就不用手動添加了 baseURL:'/api',//這里實現(xiàn)二次封裝 //設(shè)置請求超時時間5s timeout:5000, }); //請求攔截器:在發(fā)送請求之前可以檢測到,可以在請求發(fā)出去之前做一些事情 requests.interceptors.request.use((config)=>{ //config:配置對象,對象里面有一個很重要的header請求頭 nprogress.start()//請求網(wǎng)絡(luò)接口進度條開始 return config; }); //響應(yīng)攔截器 requests.interceptors.response.use((res)=>{ //成功的回調(diào)函數(shù):服務(wù)器相應(yīng)的數(shù)據(jù)回來之后,響應(yīng)攔截器可以檢測到,可以做一些事情 nprogress.done()//請求網(wǎng)絡(luò)接口進度條結(jié)束 return res.data; },(error)=>{ console.log(error) return Promise.reject(new Error('faile')); }) //對外暴露 export default requests;
防抖與節(jié)流
概念:
- 節(jié)流:在規(guī)定的時間范圍內(nèi)不會重復(fù)觸發(fā)回調(diào),只有大于這個時間間隔才會觸發(fā)回調(diào),把頻繁觸發(fā)變?yōu)樯倭坑|發(fā)。
- 防抖:前面的所有觸發(fā)都被取消,最后一次執(zhí)行在規(guī)定的時間之后才會觸發(fā),也就是說如果連續(xù)快速的觸發(fā),只會執(zhí)行一次
節(jié)流可以理解為游戲里面的技能cd時間,你使用一次后只能等下一次時間好了,才可以釋放技能,我們這里就是才可以調(diào)用這個函數(shù)。它的意義就是防止因為用戶多次點擊造成多次請求服務(wù)器,從而返回錯誤的信息。有時候也造成瀏覽器沒有充足的時間去解析。我這里設(shè)置的時間是3s,在三秒內(nèi)無論你怎么點擊都不會產(chǎn)生效果。demo如下:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <h2>計數(shù)器count的值為<span>0</span></h2> <title>防抖節(jié)流小案例</title> </head> <body> <button onclick="add()">點我加一</button> </body> </html> <script> /* 防止重復(fù)點擊 */ let count=0; let clickTimer = 0 function add() { let now = +new Date(); // 獲取當(dāng)前時間的時間戳 let timer = clickTimer; // 記錄觸發(fā)事件的事件戳 let span =document.querySelector('span'); if (now - timer < 3000) { // 如果當(dāng)前時間 - 觸發(fā)事件時的事件 < 3s,那么不符合條件,直接return , // 不讓當(dāng)前事件繼續(xù)執(zhí)行下去 return ; } else { // 反之,記錄符合條件觸發(fā)了事件的時間戳,使事件繼續(xù)往下執(zhí)行 clickTimer = now; count++; span.innerHTML=count console.log(count) } } </script>
用戶操作很頻繁但是只執(zhí)行最后一次。防抖可以理解為回城,被打斷了就要重新讀秒。下面是一個封裝好的防抖函數(shù)
function debounce(fn, time) {//fn是一個函數(shù),time是延遲時間 let timeID = null //初始化定時器id return function () { if (timeID !== null) { clearTimeout(timeID) //如果id不為空則清空定時器,從新執(zhí)行定時器 } timeID = setTimeout(() => {//定時器返回一個id fn.call(this)//如果時間到了且id不為空則產(chǎn)生回調(diào)函數(shù)執(zhí)行原本的fn函數(shù) }, time||2000);//如果time不傳或為空則默認延遲時間為2s } }
這里要注意防抖和節(jié)流的區(qū)別,節(jié)流是由執(zhí)行很多次變?yōu)閳?zhí)行少量次數(shù),防抖是有多次變?yōu)閳?zhí)行最后一次
到此這篇關(guān)于Vue淺析axios二次封裝與節(jié)流及防抖的實現(xiàn)的文章就介紹到這了,更多相關(guān)Vue axios內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue響應(yīng)式原理及雙向數(shù)據(jù)綁定示例分析
這篇文章主要為大家介紹了Vue響應(yīng)式原理及雙向數(shù)據(jù)綁定的示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-07-07Vue2.X 通過AJAX動態(tài)更新數(shù)據(jù)
這篇文章主要介紹了Vue2.X 通過AJAX動態(tài)更新數(shù)據(jù)的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-07-07vuex2中使用mapGetters/mapActions報錯的解決方法
這篇文章主要介紹了vuex2中使用mapGetters/mapActions報錯解決方法 ,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-10-10vue中提示$index is not defined錯誤的解決方式
這篇文章主要介紹了vue中提示$index is not defined錯誤的解決方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09