色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術(shù)文章
文章詳情頁

history保存列表頁ajax請求的狀態(tài)使用示例詳解

瀏覽:225日期:2022-06-12 08:16:33
目錄
  • 問題
    • 優(yōu)化前代碼
  • history
    • history.pushState()
    • window.onpopstate
  • 問題2

    問題

    最近碰到兩個問題:

    • 從首頁進入列表頁之后,點擊下一頁的時候,使用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中,這里我們存入一個對象,屬性為當(dāng)前頁數(shù);title一般沒什么用,這里傳入null;url會修改當(dāng)前歷史紀錄的地址,瀏覽器在調(diào)用pushState()方法后不會去加載這個URL

    假設(shè)當(dāng)前currentPage為1,當(dāng)前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之后當(dāng)前url變成www.example.com/search/index/1

    window.onpopstate

    現(xiàn)在我們通過history.pushState()方法把狀態(tài)存入歷史會話中了,接下來就要監(jiān)聽window.onpopstate事件

    參考mdn文檔window.onpopstate

    每當(dāng)處于激活狀態(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) // 修改當(dāng)前頁數(shù)
    	}
    })
    

    當(dāng)popstate觸發(fā)時,會修改當(dāng)前頁數(shù),然后觸發(fā)之前定義的currentChange方法,更新數(shù)據(jù),渲染頁面。

    問題2

    到此為止,問題1就解決了。

    接下來要解決問題二:從詳情頁返回列表頁,記住之前的狀態(tài)
    這里我用url來記錄狀態(tài),之前pushState推入的url就派上用場了。 只要把進入頁面首次請求的地址改成當(dāng)前url就可以了

    假設(shè)之前push的url為www.example.com/search/index/5,從詳情頁返回之后url還會顯示www.example.com/search/index/5

    mounted () {
        ajax(location.href)
    }
    

    這樣就完成了。 當(dāng)然如果你的狀態(tài)比較復(fù)雜,可以把數(shù)據(jù)存入本地Storage,添加一些判斷即可

    以上就是history保存列表頁ajax請求的狀態(tài)使用示例詳解的詳細內(nèi)容,更多關(guān)于history保存列表頁ajax請求狀態(tài)的資料請關(guān)注其它相關(guān)文章!

    標(biāo)簽: Ajax
    主站蜘蛛池模板: 欧美三级欧美成人高清www | 99青青| 手机免费黄色网址 | 日本在线免费观看视频 | 男女性高爱潮免费的国产 | 91精品国产色综合久久不 | 国产精品一区久久精品 | 亚洲精品一区二区观看 | 日韩亚洲欧美在线 | 色婷婷色综合激情国产日韩 | 欧美一级毛片在线观看 | 欧美高清在线精品一区 | 又摸又揉又黄又爽的视频 | 国产成人高清亚洲一区91 | 欧美成人亚洲欧美成人 | 亚洲一区二区三区91 | 欧美精品做人一级爱免费 | 日本欧美一区二区三区片 | 四川一级片 | 欧美很黄视频在线观看 | 国产成人精品亚洲一区 | 97在线观看完整免费 | 日韩精品三级 | 欧美精品专区55页 | 国产大乳孕妇喷奶水在线观看 | 久草视频网站 | 日本免费小视频 | 久久久不卡国产精品一区二区 | 国产精品久久久久久久久久久威 | 国产精品视频第一区二区三区 | 午夜美女网站 | 男人扒开双腿女人爽视频免费 | 色欧美在线 | 国产九九免费视频网站 | 欧美精品一区二区在线观看 | 亚洲欧美日韩精品高清 | 极品国产在线 | 久久久久久久99视频 | 久久免费视频在线 | 中文字幕亚洲一区二区三区 | 黄色美女免费 |