微信小程序页面数量限制问题

今天记录一下微信小程序关于页面栈不够用的解决方法,这个方法我是从小程序开发书中习得

1.问题

首先微信小程序中页面栈最多十层,也就意味着如果使用wx.navigateTo(保留当前页面,跳转到应用内的某个页面)方法,最多也就开启十层页面,如果在继续往后开会提示报错

其次是微信小程序官方文档建议我们不要尝试修改页面栈,会导致路由以及页面状态错误。
微信小程序官方文档

2.分析

首先微信小程序的跳转方法有
1.wx.navigateTo(Object object) 保留当前页面,跳转到应用内的某个页面。但是不能跳到 tabbar 页面。
2.wx.navigateBack(Object object) 关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。
3.wx.redirectTo(Object object) 关闭当前页面,跳转到应用内的某个页面。但是不允许跳转到 tabbar 页面。
因为我们无法修改页面栈,所以这边的解决思路是自定义一个页面栈数组来记录,再通过封装上述微信小程序的跳转方法,实现十层以上的页面跳转

3.解决方法

1.自定义页面栈
在app.js中创建pageList数组,保存页面的url属性。

// app.js
App({
  onLaunch() {
  },
  globalData: {
    pageList: ['/pages/index/index']
  }
})

2.封装wx.navigateTo
首先是 navigateTo的跳转逻辑,根据当前小程序的Page是否超过最大数目限制。调用不同的API跳转到新的页面。
在这里插入图片描述
下面是代码实现

const MAX_PAGE_SIZE = 10

function navigateTo(pageUrl) {
  // 如page列表已到达上限, 将页面push到app.pageList中, 当前页面redirectTo到新页面
  const pageSize = getCurrentPages().length
  console.log(pageSize)
  if (pageSize < MAX_PAGE_SIZE) {
    wx.navigateTo({url: pageUrl})
  } else {
    wx.redirectTo({url: pageUrl})
  }
  getApp().globalData.pageList.push(pageUrl)
  console.log(getApp().globalData.pageList)
}

3.封装wx.navigateBack
接下来实现 wx.navigateBack,同样先使用流程图厘清思路。当 getCurrentPage().lengtl小于自定义的 Page 栈长度时,说明小程序默认的页面数目已不够使用,因此需要跳转的上一页数据需要从自定义的 Page 中获取。
在这里插入图片描述
下面是代码实现

function navigateBack() {
  // 如果page stack中页面数小于app.pageList中数目 => 将app.pageList中页面pop出去, 当前页面redirect到pop出来的url
  console.log(getCurrentPages().length)
  console.log(getApp().globalData.pageList.length)
  if (getCurrentPages().length < getApp().globalData.pageList.length) {
    const pageList = getApp().globalData.pageList
    pageList.pop()
    const url = pageList[pageList.length - 1]
    wx.redirectTo({url: url})
  } else {
    // 如果两个数目一致, app.pageList pop, 当前页面navigateBack
    getApp().globalData.pageList.pop();
    wx.navigateBack()
  }
}

4.导出
最后将 navigateTo和navigateBack函数通过 module.exports 导出即可。
至此,实现了这两个工具函数。在使用这两个工具函数时,只需要将之前调用wx.navigateTo和wx.navigateBack 的地方改为调用这两个函数,便可实现页面无限跳转的效果。

4.存在的问题

1.wx.redirectTo还没有封装,如果小程序需要这种方式会打破原有页面栈的数据
2.页面超过十层的返回中,里面的页面之前的数据会被清除

以上的问题还需要后期在进行研究,研究结果会同步更新到此篇文档

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ECharts 微信小程序层级太高的问题,主要是因为 ECharts 组件默认的层级较高,导致弹窗覆盖不住的现象。解决该问题的方法如下: 1. 调整弹窗的层级:可以通过设置弹窗的 CSS 属性来调整其层级。通过在弹窗的样式文件(通常是一个 wxss 文件)中设置`z-index`属性,将其层级值设为比 ECharts 组件的层级值更高即可。例如,可以将弹窗的`z-index`设为一个较大的正整数值,如1000,以确保弹窗覆盖在 ECharts 组件之上。 2. 调整 ECharts 组件的层级:如果弹窗的层级设置较高仍然无法覆盖 ECharts 组件,可以尝试调整 ECharts 组件的层级。通常,ECharts 组件的层级是通过设置组件的 `zlevel` 属性来控制的。可以将 ECharts 组件的 `zlevel` 属性设为一个较小的值,以使其层级较低,从而被弹窗覆盖。具体的做法是,在创建 ECharts 实例时,设置 `option` 对象中的 `zlevel` 属性为一个较小的负整数值,如-1。 3. 调整 ECharts 组件和弹窗的容器结构:如果上述方法无效,可以尝试调整 ECharts 组件和弹窗的容器结构。将它们分别放置在不同的容器中,并设置容器的层级关系,确保弹窗容器的层级高于 ECharts 组件容器的层级。这样可以通过调整不同容器的层级来控制它们之间的覆盖关系,从而解决覆盖问题。 总之,通过调整弹窗和 ECharts 组件的层级关系,可以解决 ECharts 微信小程序层级太高导致弹窗覆盖不住的问题。可以通过设置弹窗的层级或调整 ECharts 组件的层级,以及调整容器结构来解决此问题
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值