小程序里只要涉及多个页面,跳转就是绕不开的事。用户点一张商品卡片、打开活动规则,或者从个人中心进设置页,背后都得有一套清楚的跳转逻辑。跳转处理不好,页面切起来就会显得卡。日常开发中常用的方式主要有三种:用 navigator 组件、调用页面跳转 API,以及跳转时携带参数。它们各有各的适用场景,实际中也常常搭配着用。
如果以前写过网页,可能第一反应是用 a 标签做跳转。小程序里对应的组件是 navigator,作用差不多,只是属性从 href 换成了 url。比如想放一个返回首页的入口,可以这样写:
<navigator url="/pages/index/index">点击跳转至首页</navigator>
用户一点这段文字,就会直接进首页。navigator 很适合目标固定、不需要判断的入口,比如快捷按钮、列表标题这类。它直接写在 WXML 里,看起来直观,后面维护也方便。如果只是单纯跳转,没有额外的条件判断,用它比在 JS 里绑事件再跳要省事。

但不是所有跳转都能提前写死。很多场景要先判断状态,或者等接口返回后再决定去哪个页面。比如点“提交订单”后,得先检查库存和地址,再进支付页;或者点一个入口,未登录先去登录页,已登录就进会员中心。这类动态逻辑,更适合用 API 来处理。
最常用的是 wx.navigateTo:

wx.navigateTo({
url: '/pages/index/index'
})
调用后新页面会压入页面栈,也就是盖在当前页上面,用户点返回还能回到上一页,所以列表进详情这类操作很常见。如果跳转后不想让用户返回,比如登录成功直接进首页,可以用 wx.redirectTo 把当前页替换掉。页面层级已经很深的时候,也可以换 wx.reLaunch,避免返回链路越叠越长。
跳转时带参数也很常见。比如从文章列表进详情页,总得让详情页知道用户点的是哪一篇。navigator 可以直接在 url 后面拼 query:
<navigator url="/pages/detail/detail?id=1">点击查看详情</navigator>
到了详情页,参数不会自动出现,需要在 onLoad 里接收。微信会把 url 上的 query 解析后传进来,直接读 options.id 就行:
Page({
onLoad(options) {
console.log(options.id) // 1
}
})
拿到 id 之后,再用它去请求详情数据或渲染内容,整条链路就完整了。如果参数里有中文、空格或特殊符号,建议先用 encodeURIComponent 处理一下,避免传递时丢失或截断。

实际项目里,这三种方式很少只用一个。静态入口交给 navigator,动态逻辑走 API,页面之间要传数据就把参数带上。跳转方式选对了,页面切换会更顺,用户也不会觉得突兀。
Login Now