history保存列表页ajax哀求的状态使用示例详解
问题
最近遇到两个问题:
- 从首页入进列表页之后,点击下一页的时候,使用ajax哀求更新数据, 然后点击浏览器“后退”按钮就直接返归到首页,实际这里想要的效果是返归列表页上一页。
- 在列表页分页为2的页面入进详情页,然后点击“后退”按钮,返归的事列表页分页为1的页面。没法记住之前分页状态。
优化前代码
代码如下,在页数变化的时候,往异步哀求数据,渲染页面。
const currentChange = (currentPage) => { ajax(`哀求地址/${currentPage}`) .then(renderPage) }
history
经过几番搜索,发现可以用History 接口来实现我们想要功能。
history.pushState()
按指定的名称和URL(假如提供该参数)将数据push入会话历史栈,数据被DOM入行不透明处理;你可以指定任何可以被序列化的javascript对象。详细描述可以参考文档
通过history.pushState(state, title, url)可以修改会话历史栈,把我们需要保存的数据存到state中,这里我们存进一个对象,属性为当前页数;title一般没什么用,这里传进null;url会修改当前历史纪录的地址,浏览器在调用pushState()方法后不会往加载这个URL
假设当前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() }) } ...
现在代码执行顺序是:页数改变 => ajax哀求 => pushState => renderPage()
在pushState之后当前url变成www.example.com/search/index/1
window.onpopstate
现在我们通过history.pushState()方法把状态存进历史会话中了,接下来就要监听window.onpopstate事件
参考mdn文档window.onpopstate
每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发.
调用history.pushState()或者history.replaceState()不会触发popstate事件. popstate事件只会在浏览器某些行为下触发, 比如点击后退、前入按钮(或者在JavaScript中调用history.back()、history.forward()、history.go()方法).
接下来监听这个事件
window.addEventListener("popstate", (event) => { if(event.state !== null){ page = event.state.page changeCurrentPage(page) // 修改当前页数 } })
当popstate触发时,会修改当前页数,然后触发之前定义的currentChange方法,更新数据,渲染页面。
问题2
到此为止,问题1就解决了。
接下来要解决问题二:从详情页返归列表页,记住之前的状态
这里我用url来记录状态,之前pushState推进的url就派上用场了。 只要把入进页面首次哀求的地址改成当前url就可以了
假设之前push的url为www.example.com/search/index/5,从详情页返归之后url还会显示www.example.com/search/index/5
mounted () { ajax(location.href) }
这样就完成了。 当然假如你的状态比较复杂,可以把数据存进本地Storage,添加一些判定即可
以上就是history保存列表页ajax哀求的状态使用示例详解的具体内容,更多关于history保存列表页ajax哀求状态的资料请关注其它相关文章!