微信小程序页面栈超过10处理问题

5,625 阅读2分钟

微信小程序页面栈不能超过10层,所以使用wx.navigateTo()的时候需要注意是否会超过10个页面栈,给出对应的处理方法

处理方法一:使用wx.reLaunch() 代替 wx.navigateTo() 关闭所有页面跳转,一般用于自己做的tabbar组件跳转 直接把用到 wx.navigateTo替换为 wx.reLaunch

	 wx.navigateTo({
        url:src,
        success:function(res){
          console.log(res)
        },fail:function(err){
          console.log(err)
        }
      })
      

处理方法二:可以在页面加载的时候就调用getCurrentPages() 监听当前页面栈的个数内容,判断当前页面栈中是否存在即将要跳转的页面路径,如果有,直接用 wx.navigateBack() 返回到该页面

const app=getApp()
Component({
  properties: {
    // 这里定义了innerText属性,属性值可以在组件使用时指定
    innerText: {
      type: String,
      value: 'default value',
    },

  },
  data: {
    // 这里是一些组件内部数据
   someData: {},
    list:[
      {img:"../../img/tab1.png",img2:"../../img/tabchoose1.png",name:"接听记录",src:"../../pages/record/index"},
      {img:"../../img/tab2.png",img2:"../../img/tabchoose2.png",name:"设置",src:"../../pages/setting/index"},
      {img:"../../img/tab3.png",img2:"../../img/tabchoose3.png",name:"我的",src:"../../pages/my/my"}
    ],
    heightbom:false,
    pages:[],
    pagesLength:0
  },
  attached:function(params) {
    //监听当前页面栈的个数内容
    let pages=getCurrentPages()
    let pagesLength=pages.length //当前页面栈的个数
    this.setData({
      pages,
      pagesLength
    })
    },
    methods: {
    Pages(path){ //path即将要跳转的路径
      let _this=this
      let delta = -1
      for (let i = 0; i < _this.data.pagesLength; i++) {
        console.log(_this.data.pages[i])
        if (_this.data.pages[i].is === path) { //判断当前页面栈中是否存在即将要跳转的页面路径
          delta = i + 1	//delta代表当前要跳转的路径存在于页面栈的索引
        }
      }
      return delta
    },
    // 这里是一个自定义方法
    toPage: function(e){
      let _this=this
      let innerText=this.data.innerText
      let src=e.currentTarget.dataset.src
      let srcPage=src.split("../../")[1]
      let index=e.currentTarget.dataset.index  
      let delta=_this.Pages(srcPage)    
      if(index==innerText){
        return
      }else{  
        if (delta > -1 ) {
          console.log("有目标页已经是被访问过的"+delta)
          // 如果有目标页已经是被访问过的
          const backPage =_this.data.pages[_this.data.pagesLength - delta]
          console.log(backPage)
          // backPage.setData({data});
          wx.navigateBack({
            delta: _this.data.pagesLength - delta
          })
        } else {
          console.log("没目标:"+delta)
          wx.navigateTo({
            url:src,
            success:function(res){
              console.log(res)
            },fail:function(err){
              console.log(err)
            }
          })
        }
      }
    }
  }
})

处理方法三:这个方法类似于方法一,可以在页面加载的时候就调用getCurrentPages() 监听当前页面栈的个数内容,在页面要跳转的时候,判断当前页面栈的个数是否超过10,如果超过10个,就给wx.reLaunch() 关闭所有页面,重新进行页面栈个数统计

    let pages=getCurrentPages()
    let pagesLength=pages.length //当前页面栈的个数
    if(pagesLength>=10){
      wx.reLaunch({
        url:src,
        success:function(res){
          console.log(res)
        },fail:function(err){
          console.log(err)
        }
      })
	}else{
    	 wx.navigateTo({
            url:src,
            success:function(res){
              console.log(res)
            },fail:function(err){
              console.log(err)
            }
          })
    }