小程序最大的卖点是"轻":不用下载安装,点开就能用。但"轻"也意味着用户的耐心更有限——进来之后如果几秒内找不到想看的内容,手指一划就退出了。所以别看页面跳转是个基础功能,它其实直接关系到体验的好坏。在小程序里做跳转,常用的思路就三种:navigator 组件、路由 API,再加上几乎形影不离的参数传递。下面结合实际开发场景挨个聊聊。
先说最直观的 navigator 组件。它的用法和网页里的 a 标签很像,直接写在 wxml 里,指个目标地址就行。比如首页要放个入口,引导用户去看商品列表:
<navigator url="/pages/list/list">
<button type="primary">查看商品列表</button>
</navigator>
点一下按钮,页面就跳过去了,没什么好说的。不过这里有个新手特别容易踩的坑:navigator 用的是 url 属性,不是 H5 里的 href。刚从网页开发转过来的人十有八九会顺手写错,结果点了半天没反应,还以为出了什么大 bug,查来查去才发现只是属性名写错了。
如果想在跳转前做点判断——比如先校验登录状态,再决定跳不跳、跳去哪儿——组件就不够用了,得上路由 API。最常用的两个方法是 wx.navigateTo 和 wx.redirectTo:
wx.navigateTo({
url: '/pages/detail/detail'
})
这两个方法都能跳,但行为完全不同。navigateTo 会保留当前页面,跳过去之后还能点返回键回来,所以像"列表页进详情页"这种需要来回切换的场景,用它正合适;redirectTo 则是直接把当前页面关掉,跳过去就回不来了,适合登录成功直达首页这类"单程票"式的流程。另外有个容易被忽略的限制:如果目标是 tabBar 页面(就是底部导航栏里的那几个),这两个方法都会失效,必须换成 wx.switchTab。麻烦的是这种情况下跳转是静默失败的,控制台什么报错都没有,不留意的话能卡很久。

跳转搞定了,接下来往往会遇到另一个问题:数据怎么带过去?用户在列表页点了某件商品,详情页怎么知道该显示哪一个?办法是把参数拼在 url 后面:

<navigator url="/pages/detail/detail?id=1001&from=home">查看详情</navigator>
到了目标页面,在 onLoad 生命周期里就能通过参数对象拿到这些值:
Page({
onLoad(options) {
console.log(options.id) // 输出 1001
console.log(options.from) // 输出 home
}
})
要注意的是,url 里传的所有参数都是字符串,而且长度有限。碰上对象、数组这类复杂数据,一般先 JSON.stringify 序列化,再 encodeURIComponent 编码,接收端再解码还原,免得特殊字符把链接搞坏。如果数据量实在太大,就别硬往 url 里塞了,用全局变量或者本地缓存中转一下更稳妥。

最后再补一句:上面说的这些跳转都只限于小程序内部页面。想打开外部网页的话,常规做法是用 web-view 组件来承载 H5 页面,而且域名得提前在小程序后台配置成业务域名,不是随便丢个链接就能打开的。
简单总结一下:navigator 组件简单直观,适合写在页面结构里的固定入口;路由 API 灵活,跟着业务逻辑走最顺手;参数传递则是跳转的"伴生技能",几乎每次都用得上。这三样用熟了,小程序里的页面流转基本不会有什么障碍,用户体验自然也就顺畅了。
Login Now