uni-app 微信小程序开发:常用函数总结(一)

发布时间:2026/7/22 4:48:35
uni-app 微信小程序开发:常用函数总结(一) 一、 getCurrentPages()获取当前页面栈的实例1. 定义getCurrentPages()是微信小程序原生提供的全局函数用于获取当前页面栈的实例。页面栈是一个数组记录了从小程序启动到当前页面依次打开的所有页面。在 Uniapp 中我们可以直接在.vue文件中调用此方法也可以通过uni.$emit等方式结合使用。核心特点返回值返回一个数组数组中第一个元素为首页最后一个元素为当前页面。实时性获取的是当前真实的页面栈状态。2. 基础用法如何获取数据假设我们的应用从首页启动然后跳转到了详情页。此时页面栈长度为 2。// 在详情页 const pages getCurrentPages(); console.log(pages.length); // 输出: 2 // 获取当前页面实例 const currentPage pages[pages.length - 1]; console.log(currentPage.route); // 输出: pages/detail/detail // 获取上一个页面实例 const prevPage pages[pages.length - 2]; console.log(prevPage.route); // 输出: pages/index/index3. 实战场景如何使用在实际开发中getCurrentPages()并不是单纯用来打日志的它在以下三个场景中有着不可替代的作用。场景 1页面返回时的数据传递最常用痛点小程序并没有像 Vue 的$emit那么方便的跨页面通信机制。比如从“编辑页面”返回“个人中心页面”需要刷新用户数据。传统做法使用全局变量或 Storage但这不够优雅且有时序问题。getCurrentPages()解法直接修改上一页的数据。// 页面 B (编辑页面) export default { methods: { saveNickname() { const pages getCurrentPages(); // 获取上一个页面实例 const prevPage pages[pages.length - 2]; // 【关键点】直接调用上一页的方法或修改数据 if (prevPage) { // 假设上一页有 updateUserInfo 方法 // 注意在 Uniapp 中prevPage 实例直接对应 Vue 组件的 this prevPage.updateUserInfo({ nickname: 新名字 }); // 或者直接修改上一页的 data (Vue2 写法) // prevPage.$vm.userInfo 新名字; } uni.navigateBack(); } } }场景 2动态设置导航栏标题有时我们需要根据接口返回的数据动态设置当前页面的标题。const pages getCurrentPages(); const currentPage pages[pages.length - 1]; // 通过微信原生 API 设置 uni.setNavigationBarTitle({ title: currentPage.data.dynamicTitle || 默认标题 });场景 3判断页面栈深度防止“循环地狱”在使用uni.navigateTo时微信小程序保留了最大 10 层的页面栈限制。如果用户反复点击跳转很容易触达上限导致报错。我们可以封装一个安全跳转方法function safeNavigateTo(url) { const pages getCurrentPages(); // 判断页面栈是否即将超过 10 层 if (pages.length 10) { // 此时建议使用 reLaunch 关闭所有页面打开新页面 // 或者使用 redirectTo 关闭当前页面 uni.redirectTo({ url }); } else { uni.navigateTo({ url }); } }4. 注意事项Vue2 与 Vue3 的差异这是 Uniapp 开发者最容易踩坑的地方。随着 Uniapp 对 Vue3 的支持获取到的页面栈实例结构发生了变化。(1) Vue2 环境下getCurrentPages()返回的数组元素直接就是页面的实例你可以直接访问this下的属性和方法。// Vue2 const prevPage pages[pages.length - 2]; prevPage.myMethod(); // 直接调用 console.log(prevPage.myData); // 直接访问2. Vue3 环境下 (重要!)在 Vue3 的 Uniapp 项目中为了适配 Vue3 的响应式原理获取到的页面实例结构有所不同。返回的对象通常包含一个$vm属性这才是真正的 Vue 组件实例。// Vue3 const pages getCurrentPages(); const currentPage pages[pages.length - 1]; // 获取真正的 Vue 实例 const instance currentPage.$vm; // 调用方法或修改数据 instance.myMethod(); instance.myData new value;注意如果你在 Vue3 环境下直接操作currentPage.setData虽然也能生效渲染层但无法触发 Vue 的响应式更新且可能导致数据不一致。务必通过$vm操作。