問題
最近碰到兩個問題:
- 從首頁進入列表頁之后,點擊下一頁的時候,使用ajax請求更新數(shù)據(jù), 然后點擊瀏覽器“后退”按鈕就直接返回到首頁,實際這里想要的效果是返回列表頁上一頁。
- 在列表頁分頁為2的頁面進入詳情頁,然后點擊“后退”按鈕,返回的事列表頁分頁為1的頁面。沒法記住之前分頁狀態(tài)。
優(yōu)化前代碼
代碼如下,在頁數(shù)變化的時候,去異步請求數(shù)據(jù),渲染頁面。
const currentchange = (currentpage) => { ajax(`請求地址/${currentpage}`) .then(renderpage) }
history
經(jīng)過幾番搜索,發(fā)現(xiàn)可以用history 接口來實現(xiàn)我們想要功能。
history.pushstate()
按指定的名稱和url(如果提供該參數(shù))將數(shù)據(jù)push進會話歷史棧,數(shù)據(jù)被dom進行不透明處理;你可以指定任何可以被序列化的javascript對象。具體描述可以參考文檔
通過history.pushstate(state, title, url)可以修改會話歷史棧,把我們需要保存的數(shù)據(jù)存到state中,這里我們存入一個對象,屬性為當前頁數(shù);title一般沒什么用,這里傳入null;url會修改當前歷史紀錄的地址,瀏覽器在調(diào)用pushstate()方法后不會去加載這個url
假設(shè)當前currentpage為1,當前url為www.example.com/search/index
... const pushstate = () => { const url = `/search/index/${currentpage}` history.push({ page: currentpage }, null, url) } const currentchange = (currentpage) => { ajax(`請求地址/${currentpage}`) .then(res =>{ pushstate(currentpage) renderpage() }) } ...
現(xiàn)在代碼執(zhí)行順序是:頁數(shù)改變 => ajax請求 => pushstate => renderpage()
在pushstate之后當前url變成www.example.com/search/index/1
window.onpopstate
現(xiàn)在我們通過history.pushstate()方法把狀態(tài)存入歷史會話中了,接下來就要監(jiān)聽window.onpopstate事件
參考mdn文檔window.onpopstate
每當處于激活狀態(tài)的歷史記錄條目發(fā)生變化時,popstate事件就會在對應(yīng)window對象上觸發(fā).
調(diào)用history.pushstate()或者history.replacestate()不會觸發(fā)popstate事件. popstate事件只會在瀏覽器某些行為下觸發(fā), 比如點擊后退、前進按鈕(或者在javascript中調(diào)用history.back()、history.forward()、history.go()方法).
接下來監(jiān)聽這個事件
window.addeventlistener("popstate", (event) => { if(event.state !== null){ page = event.state.page changecurrentpage(page) // 修改當前頁數(shù) } })
當popstate觸發(fā)時,會修改當前頁數(shù),然后觸發(fā)之前定義的currentchange方法,更新數(shù)據(jù),渲染頁面。
問題2
到此為止,問題1就解決了。
接下來要解決問題二:從詳情頁返回列表頁,記住之前的狀態(tài)
這里我用url來記錄狀態(tài),之前pushstate推入的url就派上用場了。 只要把進入頁面首次請求的地址改成當前url就可以了
假設(shè)之前push的url為www.example.com/search/index/5,從詳情頁返回之后url還會顯示www.example.com/search/index/5
mounted () { ajax(location.href) }
這樣就完成了。 當然如果你的狀態(tài)比較復(fù)雜,可以把數(shù)據(jù)存入本地storage,添加一些判斷即可
以上就是history保存列表頁ajax請求的狀態(tài)使用示例詳解的詳細內(nèi)容,更多關(guān)于history保存列表頁ajax請求狀態(tài)的資料請關(guān)注碩編程其它相關(guān)文章!