返回上一页可能是 web 应用中最常用的一个功能,实现方式也有很多种。
一般在设计返回上一页功能时,都要记住上一页的状态。
比如从一个列表页点击到详情页时,列表页可能有一些状态,比如当前的搜索条件,或者是列表的分页等状态,再从详情页点击“返回上一页”时,除了要跳转到列表页,还要记住之前的搜索条件或分页等状态。
但如果只是简单的使用history.back()
,会丢失之前页面的状态。
所以要记住之前页面的状态,就必须在跳转时,带上这些状态数据。
进行路由跳转时携带数据,可以使用queryParams
,将参数以 query 的形式拼装在 url 后面,这种方式能达到效果,但也有一定的限制,页面之间的跳转都是一一对应写死的,并不灵活。并且由于会在 url 后面携带参数,直接刷新页面时,并不能“真正刷新”页面。
所以比较常用的就是使用 History.state,各大框架对其也有一定的封装应用。
在 angular 中,其路由模块在使用routerLink
进行路由跳转时可附加 state 进行状态传递。
我们可以抽象出一个公共的 ServiceGobackService
来监听路由变化并存储页面跳转的 state 数据:
1 | import { Injectable } from "@angular/core"; |
然后在需要返回上一页功能的页面中导入该 Service。
比如这里我们有两个页面:A-List 和 A-Detail 两个页面,从 A-List 页面中某个具体的一项点击进入 A-Detail 页面查看详情。在 A-Detail 页有一个“返回上一页”的按钮。
我们只需要在 A-List 页面中使用:
1 | <a [routerLink]="['/prizes', data.id]" [state]="toBackState()"></a> |
1 | fromBackState() { |
在 A-Detail 页面中直接使用service.goBack()
即可。
1 | fromBackState() { |