# 页面路由

小程序中所有页面的路由由小程序框架管理。框架以栈的形式维护小程序的所有页面，其中页面栈最多为十层。

## 页面栈

当发生路由切换的时候，页面栈的表现如下表所示。

|路由方式|表现类型|
|-----|---|
|初始化|新页面入栈。|
|打开新页面|新页面入栈。|
|页面重定向|当前页面出栈，新页面入栈。|
|页面返回|页面不断出栈，直到目标返回页。|
|Tab 切换|页面全部出栈，只留下新的 Tab 页面。|
|重加载|页面全部出栈，只留下新的页面。|

**getCurrentPages()**

你可以通过 `getCurrentPages()` 函数获取当前页面栈的实例。函数以数组形式按栈的顺序进行获取，第一个元素为首页，最后一个元素为当前页面。

## 路由方式

路由的控制接口说明如下表所示。

路由方式 | 触发时机 | 路由前页面 | 路由后页面
---|---|---|---
初始化 | 小程序打开的第一个页面。 | \- | onLoad, onShow
打开新页面 | 调用 API [`tt.navigateTo`](https://open.feishu.cn/document/uYjL24iN/uYTOz4iN5MjL2kzM) 或使用组件 [`<navigator open-type="navigateTo"/>`](https://open.feishu.cn/document/uYjL24iN/uMzNuMzNuMzN)。 | onHide | onLoad, onShow
页面重定向 | 调用 API [`tt.redirectTo`](https://open.feishu.cn/document/uYjL24iN/ucTOz4yN5MjL3kzM) 或使用组件 [`<navigator open-type="redirectTo"/>`](https://open.feishu.cn/document/uYjL24iN/uMzNuMzNuMzN)。 | onUnload | onLoad, onShow
页面返回 | 调用 API [`tt.navigateBack`](https://open.feishu.cn/document/uYjL24iN/uADM04CMwQjLwADN) 或使用组件 [`<navigator open-type="navigateBack"/>`](https://open.feishu.cn/document/uYjL24iN/uMzNuMzNuMzN) 或用户按左上角返回按钮。 | onUnload | onShow
Tab 切换 | 调用 API [`tt.switchTab`](https://open.feishu.cn/document/uYjL24iN/ukTOz4SO5MjL5kzM) 或使用组件 [`<navigator open-type="switchTab"/>`](https://open.feishu.cn/document/uYjL24iN/uMzNuMzNuMzN) 或用户切换 Tab。 | \- | 各类情况，可参见下文 **Tab 切换对应的生命周期** 表。
重启动 | 调用 API [`tt.reLaunch`](https://open.feishu.cn/document/uYjL24iN/uEDM04SMwQjLxADN) 或使用组件 [`<navigator open-type="reLaunch"/>`](https://open.feishu.cn/document/uYjL24iN/uMzNuMzNuMzN)。 | onUnload | onLoad, onShow

* navigateTo 、 redirectTo 只能打开非 tabBar 页面。
* switchTab 只能打开 tabBar 页面。
* reLaunch 可以打开任意页面。
* 页面底部的 tabBar 由页面决定，即只要是定义为 tabBar 的页面，底部都有 tabBar。
* 调用页面路由带的参数可以在目标页面的 onLoad 中获取。 

**Tab 切换对应的生命周期**

示例场景：A、B 页面为 Tabbar 页面，C 是从 A 页面打开的页面，D 页面是从 C 页面打开的页面。

路由方式 | 触发时机 | 路由前页面
---|---|---
A | A | Nothing happend
A | B | A.onHide(), B.onLoad(), B.onShow()
A | B（再次打开） | A.onHide(), B.onShow()
C | A | C.onUnload(), A.onShow()
C | B | C.onUnload(), B.onLoad(), B.onShow()
D | B | D.onUnload(), C.onUnload(), B.onLoad(), B.onShow()
D（从转发进入） | A | D.onUnload(), A.onLoad(), A.onShow()
D（从转发进入） | B | D.onUnload(), B.onLoad(), B.onShow()

