欢迎光临
我们一直在努力

微信小程序 页面跳转

小程序的页面跳转和 Vue 的路由跳转逻辑相似,但语法、API 完全不同,小程序是微信原生的页面栈机制,没有 Vue Router 的概念,所有跳转都是微信官方提供的 API 方法 + 标签跳转,而且小程序的跳转场景更多、细节限制也更多,这篇内容把小程序「所有跳转方式 + 区别 + 适用场景 + 传参 + 回退 + 避坑」全部讲透,零基础也能直接上手,项目开发直接套用即可。

一、小程序页面跳转的核心基础:「页面栈」机制(必懂)

小程序的页面跳转,底层核心是 「页面栈」 的管理,这是理解所有跳转方式区别的核心,也是避坑关键,一定要先搞懂:

  • 小程序的页面,会以 栈(先进后出) 的形式存储,每打开一个新页面,就往「栈」里新增 1 个页面;
  • 每点击左上角的「返回」按钮,就从「栈」里移除最顶部的 1 个页面;
  • 小程序的页面栈有数量限制:最多只能存放 10 个页面,超过会无法打开新页面,所以不同场景要选对跳转方式。

一句话总结:所有跳转 API 的本质,都是对「页面栈」做 新增、替换、清空、返回 操作。

二、方式一:声明式跳转(标签跳转,最简单,推荐优先用)

和 Vue 的 <router-link> 完全对标,小程序提供了专属的跳转标签,无需写 JS 代码,直接在 WXML 中写标签即可实现跳转,适合「无逻辑的静态跳转」,比如导航栏、列表点击、底部 tab 跳转等,开发效率极高,小程序里80% 的跳转场景都用它。

✅ 核心标签:<navigator> 导航组件

这是小程序官方的跳转专属标签,也是原生组件,兼容性拉满,无任何兼容问题。

✔ 1. 基础跳转(最常用) open-type="navigate"

xml

<!– 写法1:直接跳转指定页面,不带参数 –>
<navigator url="/pages/index/index">跳转到首页</navigator>
<navigator url="/pages/article/article">跳转到文章列表</navigator>

<!– 写法2:跳转并携带参数(小程序核心!博客/列表必备) –>
<!– 格式:url="页面路径?参数名1=值1&参数名2=值2" 多个参数用 & 拼接 –>
<navigator url="/pages/detail/detail?id=1&title=小程序跳转教程">跳转到文章详情</navigator>

✅ 核心说明:

  • open-type="navigate" 是默认值,可以省略不写;
  • 特点:点击后 新增页面到页面栈,左上角会自动出现「返回箭头」,点击返回能回到上一页,完全符合用户习惯;
  • 适用场景:首页→列表页、列表页→详情页、任意需要「能返回」的跳转场景,小程序最常用的跳转方式。

✔ 2. 重定向跳转 open-type="redirect"

xml

<!– 重定向跳转,无返回箭头 –>
<navigator url="/pages/index/index" open-type="redirect">回到首页(无返回)</navigator>

✅ 核心说明:

  • 特点:点击后 关闭当前页面 + 新增目标页面,是「替换」的逻辑,页面栈的数量不变;
  • 效果:跳转后页面左上角没有返回箭头,无法返回上一页;
  • 适用场景:详情页→首页、登录成功→首页、404 页面→首页,不希望用户返回上一页的场景。

✔ 3. 返回到上一页 open-type="navigateBack"

xml

<!– 返回上一级页面 –>
<navigator open-type="navigateBack">返回上一页</navigator>

<!– 返回上两级页面 –>
<navigator open-type="navigateBack" delta="2">返回上两级</navigator>

✅ 核心说明:

  • delta 属性:必填,返回的页面层数,默认值是 1(返回上一页),写2就是返回上两级,以此类推;
  • 特点:从页面栈中移除指定层数的页面,不会新增任何页面;
  • 适用场景:详情页→列表页、表单页→编辑页,需要主动触发返回的场景。

✔ 4. 关闭所有页面,跳转新页面 open-type="reLaunch"

xml

<!– 关闭所有页面,跳转到首页,彻底清空页面栈 –>
<navigator url="/pages/index/index" open-type="reLaunch">回到首页(清空所有页面)</navigator>

✅ 核心说明:

  • 特点:清空页面栈中所有页面 + 打开新的目标页面,跳转后页面栈里只有 1 个目标页面;
  • 效果:跳转后无任何返回箭头,小程序的「转发 / 分享」也会默认指向这个页面;
  • 适用场景:小程序的「我的」页面→首页、退出登录→登录页、支付成功→结果页,需要彻底重置页面栈的场景。

✔ 5. 底部 tab 栏页面跳转 open-type="switchTab"

小程序开发中必用的特殊场景!如果你的小程序配置了「底部 tab 栏」(比如首页、分类、我的),普通的 navigate/redirect 跳转对 tab 页面无效,必须用这个方式!

xml

<!– 跳转到底部tab的首页,tabBar中配置的页面必须用switchTab –>
<navigator url="/pages/index/index" open-type="switchTab">首页</navigator>
<navigator url="/pages/my/my" open-type="switchTab">我的</navigator>

✅ 核心说明:

  • 特点:专门用于 tabBar 配置的页面之间切换,会自动匹配 tabBar 的高亮状态;
  • 注意:switchTab 跳转时,不能携带任何参数!url 后面拼接参数也会失效,这是小程序的硬性规则。

三、方式二:编程式跳转(JS 跳转,最灵活,必学)

和 Vue 的 this.$router.push() 对标,小程序的编程式跳转是通过 JS API 实现,所有跳转逻辑写在 .js 文件的事件方法中,由点击、表单提交、接口请求成功等事件触发。

✅ 核心特点

  • 必须写在 bindtap/catchtap 绑定的事件方法中,支持先执行业务逻辑,再跳转页面;
  • 所有 <navigator> 标签能实现的跳转,编程式跳转都能实现,灵活性拉满;
  • 小程序的核心场景:提交表单后跳转、请求接口成功后跳转、判断登录状态后跳转,只能用编程式跳转实现;
  • 所有 API 都挂载在小程序的全局对象 wx 上,统一前缀 wx.navigateXXX。
  • ✅ 重要提示:小程序的所有跳转 API,路径必须以 / 开头(绝对路径),比如 /pages/detail/detail,写相对路径会直接报错!

    ✔ 1. 基础跳转(新增页面,可返回) wx.navigateTo

    对应标签的 open-type="navigate",小程序最常用的编程式跳转 API

    js

    // wxml 绑定点击事件
    <button bindtap="goDetail">跳转到文章详情</button>

    // js 页面 写跳转逻辑
    Page({
    // 跳转并携带参数(核心用法,列表→详情必用)
    goDetail() {
    wx.navigateTo({
    url: '/pages/detail/detail?id=1&title=小程序编程式跳转'
    })
    }
    })

    ✅ 特点:新增页面到栈、左上角有返回箭头、可返回上一页,无参数数量限制。

    ✔ 2. 重定向跳转(替换页面,无返回) wx.redirectTo

    对应标签的 open-type="redirect"

    js

    // wxml
    <button bindtap="goHome">回到首页(无返回)</button>

    // js
    Page({
    goHome() {
    wx.redirectTo({
    url: '/pages/index/index'
    })
    }
    })

    ✅ 特点:关闭当前页面、打开新页面、无返回箭头,页面栈数量不变,适合无需返回的场景。

    ✔ 3. 返回上一页(关闭当前页面) wx.navigateBack

    对应标签的 open-type="navigateBack",小程序唯一的「返回 API」

    js

    // wxml
    <button bindtap="goBack">返回上一页</button>

    // js
    Page({
    goBack() {
    wx.navigateBack({
    delta: 1 // 返回的层数,默认1,可写2、3…
    })
    }
    })

    ✅ 特殊补充:返回上一页时,如果需要刷新上一页的数据(比如详情页修改内容后返回列表页,需要刷新列表),这个 API 有一个超级实用的写法:

    js

    Page({
    goBack() {
    // 返回上一页的同时,执行上一页的自定义方法(比如刷新数据)
    const pages = getCurrentPages() // 获取当前页面栈的所有页面
    const prevPage = pages[pages.length – 2] // 获取上一页的页面实例
    prevPage.getArticleList() // 调用上一页的 getArticleList 方法刷新数据

    wx.navigateBack({ delta: 1 })
    }
    })

    这个用法是小程序开发的高频实战技巧,解决了「返回后页面数据不刷新」的痛点,一定要记住!

    ✔ 4. 清空所有页面,跳转新页面 wx.reLaunch

    对应标签的 open-type="reLaunch",小程序的「重置跳转」

    js

    // wxml
    <button bindtap="reLaunchHome">回到首页(清空所有页面)</button>

    // js
    Page({
    reLaunchHome() {
    wx.reLaunch({
    url: '/pages/index/index'
    })
    }
    })

    ✅ 特点:清空整个页面栈,无论之前打开了多少页面,跳转后栈里只有目标页面,彻底解决页面栈溢出(超过 10 页)的问题,优先级极高。

    ✔ 5. 底部 tab 栏页面切换 wx.switchTab

    对应标签的 open-type="switchTab",tab 页面专属跳转 API

    js

    // wxml
    <button bindtap="goTabMy">跳转到我的页面</button>

    // js
    Page({
    goTabMy() {
    wx.switchTab({
    url: '/pages/my/my'
    })
    }
    })

    ✅ 硬性规则(必记,避坑):

  • wx.switchTab 跳转的页面,必须是在 app.json 的 tabBar 数组中配置过的页面;
  • wx.switchTab 的 url 中不能携带任何参数,即使拼接了参数也不会传递,会被小程序自动忽略;
  • 跳转后会自动高亮对应的 tab 栏,无需手动处理样式。

  • 四、小程序 页面跳转传参 + 接收参数(核心闭环,必学)

    和 Vue 的路由传参一样,跳转的核心需求之一就是传递参数:列表页把「文章 ID / 商品 ID / 分类 ID」传给详情页,详情页接收参数后请求对应的数据,这是小程序开发的核心业务逻辑,也是完整的跳转闭环,缺一不可。

    ✅ 一、跳转传参的写法(所有跳转方式通用)

    小程序的传参规则非常简单:在跳转路径后面拼接 ?参数名=值&参数名2=值2,支持字符串、数字类型的参数,多个参数用 & 分隔。

    js

    // 编程式传参示例(标签传参同理)
    wx.navigateTo({
    url: '/pages/detail/detail?id=1001&author=程序员&type=原创'
    })

    ✅ 二、目标页面接收参数的写法(唯一写法,所有场景通用)

    小程序的页面参数,统一在目标页面的 onLoad 生命周期中接收,这是小程序的官方规则,参数会被封装在 onLoad 的形参 options 中,直接取值即可!

    注意:onLoad 是页面加载时只执行一次的生命周期,完美匹配「页面打开时接收参数」的需求。

    完整实战示例(列表→详情 完整流程)

    js

    // 列表页 pages/list/list.js 跳转传参
    Page({
    goDetail(e) {
    // 从点击事件中获取当前列表项的id(循环列表时常用)
    const articleId = e.currentTarget.dataset.id
    wx.navigateTo({
    url: `/pages/detail/detail?id=${articleId}`
    })
    }
    })

    // 详情页 pages/detail/detail.js 接收参数 + 请求数据
    Page({
    data: {
    article: {} // 文章详情数据
    },
    // 页面加载时接收参数,必写!
    onLoad(options) {
    console.log('接收的参数', options) // { id: "1001" }
    const articleId = options.id
    // 拿到参数后,请求对应的文章详情数据
    this.getArticleDetail(articleId)
    },
    // 请求文章详情
    getArticleDetail(id) {
    // 这里写wx.request请求接口的逻辑
    wx.request({
    url: `https://你的接口地址/api/article/${id}`,
    success: (res) => {
    this.setData({
    article: res.data
    })
    }
    })
    }
    })

    ✅ 补充:标签跳转的传参 + 接收,写法完全一致,只是把参数写在标签的 url 里即可,接收还是在 onLoad 中。


    五、小程序跳转 特殊补充:wx.navigateTo 的页面栈限制(避坑重点)

    这是小程序最容易踩坑的知识点,也是高频面试题,必须重点记住:

    • wx.navigateTo 是「新增页面到栈」的跳转方式,最多只能打开 10 个页面;
    • 当页面栈的数量达到 10 个时,再次调用 wx.navigateTo 会失效,无法打开新页面,控制台会报错;
    • 解决方案:
    • 对于「无需返回」的页面,用 wx.redirectTo 替代 wx.navigateTo,替换页面而不是新增页面;
    • 对于「需要回到首页」的场景,用 wx.reLaunch 清空页面栈,彻底释放内存;
    • 避免在小程序中做「无限层级的跳转」,比如详情页→子详情页→孙详情页,尽量控制层级。

    六、小程序跳转 vs Vue 路由跳转 核心区别(易混点整理,清晰区分)

    很多人会把小程序和 Vue 的跳转搞混,这里做一个清晰的对比,看完再也不会混淆,也能理解两种技术的设计逻辑:

  • 依赖不同:Vue 跳转依赖 Vue Router 插件,小程序跳转是微信原生 API,无任何依赖;
  • 跳转标签不同:Vue 用 <router-link to="xxx">,小程序用 <navigator url="xxx">;
  • 编程式 API 不同:Vue 用 this.$router.push(),小程序用 wx.navigateTo() 等 wx 前缀的 API;
  • 传参接收不同:Vue 用 $route.params/query 接收,小程序用 onLoad(options) 接收;
  • 页面管理不同:Vue 是「路由映射组件」,小程序是「页面栈管理页面」,有 10 页数量限制;
  • tab 跳转不同:Vue 的 tab 是路由匹配,小程序的 tab 是专属的 switchTab API,有硬性规则。

  • 七、小程序跳转 避坑指南(新手必看,少走 90% 的弯路)

  • 路径错误:跳转路径必须以 / 开头(绝对路径),比如 /pages/index/index,写 pages/index/index 会直接报错;
  • 页面未注册:跳转的页面必须在 app.json 的 pages 数组中注册,未注册的页面无法跳转;
  • switchTab 传参失效:给 switchTab 的 url 拼接参数,不会传递,小程序会自动忽略,tab 页面传参需要用全局变量 / 缓存;
  • navigateTo 层级溢出:连续跳转超过 10 页,无法打开新页面,改用 redirectTo 或 reLaunch;
  • 接收参数的位置错误:在 onShow/onReady 中接收参数,会拿不到值,参数只能在 onLoad 中接收;
  • 跳转后页面不刷新:返回上一页时,上一页的数据不会自动刷新,需要用 getCurrentPages 调用上一页的方法手动刷新;
  • 重定向后返回失效:用 redirectTo 跳转后,页面栈被替换,左上角没有返回箭头,不要在需要返回的场景用这个 API。

  • 八、小程序所有跳转方式 汇总速查表(收藏备用,开发直接查)

    跳转方式对应标签写法对应 JS API核心特点适用场景
    基础跳转(可返回) <navigator url="路径"> wx.navigateTo 新增页面、有返回箭头、栈 + 1 列表→详情、首页→分类、任意需返回的场景
    重定向跳转(无返回) <navigator open-type="redirect"> wx.redirectTo 替换页面、无返回箭头、栈不变 详情→首页、登录→首页、无需返回的场景
    返回上一页 <navigator open-type="navigateBack"> wx.navigateBack 关闭页面、栈 – 1、可指定层数 详情→列表、表单→编辑页、主动返回
    清空所有页面跳转 <navigator open-type="reLaunch"> wx.reLaunch 清空栈、只留目标页、优先级最高 解决栈溢出、退出登录、支付成功页
    tab 栏页面切换 <navigator open-type="switchTab"> wx.switchTab tab 专属、无参数、自动高亮 底部 tab 栏切换(首页 / 分类 / 我的)

    九、总结(核心知识点速记,看完不忘)

  • 小程序跳转核心是 页面栈机制,所有 API 都是对页面栈的增删改,栈最多存 10 个页面;
  • 声明式跳转 <navigator>:无逻辑静态跳转首选,写法简单,无需写 JS,适配 80% 的场景;
  • 编程式跳转 wx.xxx:有逻辑动态跳转首选,支持先执行业务逻辑再跳转,是小程序的核心跳转方式;
  • 传参 + 接收是完整闭环:跳转路径拼接参数,目标页 onLoad(options) 接收参数,必写;
  • tab 栏页面必须用 switchTab,且不能传参;层级溢出用 reLaunch,无需返回用 redirectTo;
  • 返回上一页刷新数据,用 getCurrentPages() 获取上一页实例,调用对应方法即可。
  • 以上就是小程序页面跳转的全部核心知识点,覆盖了所有开发场景、避坑点、实战技巧,内容原创无照搬,适合博客发布,也适合自己收藏学习,希望能帮你彻底吃透小程序的跳转逻辑!

    👉 **觉得有用的点点关注谢谢~**

    赞(0)
    未经允许不得转载:171主机测评 » 微信小程序 页面跳转
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址