小程序入门14:小程序云开发之小程序页面堆栈

124 阅读2分钟

写在前面

本篇文章是微信小程序开发入门的第十四篇,介绍小程序云开发之小程序页面堆栈

什么是小程序页面堆栈

打开小程序官方文档-路由,我们可以看到小程序共提供了5种跳转方法:

wx.switchTab:跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面

wx.reLaunch:关闭所有页面,打开到应用内的某个页面

wx.redirectTo:关闭当前页面,跳转到应用内的某个页面

wx.navigateTo:保留当前页面,跳转到应用内的某个页面

wx.navigateBack:关闭当前页面,返回上一页面或多级页面。可通过 getCurrentPages 获取当前的页面栈,决定需要返回几层。

我们把页面堆栈看成一个数组,通过上面5种跳转方法的描述,我们可以知道,只有wx.navigateTo会往页面堆栈中插入页面而wx.navigateBack会将页面返回到页面堆栈中的某个页面,此时页面堆栈的长度没有变化如果后续再使用wx.navigateTo跳转就会替换掉页面堆栈中我们刚刚返回的页面后面的页面,这句话有点绕,我下面以我们的项目举例:

我们的项目的页面跳转:index页面 -> detail页面 -> edit页面

我们从index页面使用wx.navigateTo跳转detail页面再使用detail页面跳转到edit页面,页面堆栈=[“index页面的实例”, “detail页面的实例”, “edit页面的实例”]

再从edit页面wx.navigateBack,页面堆栈还是上面的页面堆栈,但是我们的页面现在在页面堆栈的第二个实例(detail页面的实例)中,此时我们再wx.navigateTo跳转到edit页面,此时的页面堆栈=[“index页面的实例”, “detail页面的实例”, “第二次跳转的edit页面的实例”]

解决上篇文章遗留问题

首先修改miniprogram\pages\fruit-edit\fruit-edit.js文件的代码,修改内容如下,先获取页面堆栈,然后获取上一页的实例,然后调用上一页获取详情的方法,再跳转到上一页:

...
      if (success) {
        // wx.redirectTo({
        //   url: `/pages/fruit-detail/fruit-detail?id=${this.data.id}`,
        // })
        let pages = getCurrentPages() // 获取页面堆栈
        let prevPage = pages[pages.length - 2] // 代表的就是上一页的实例,相当于上一页的this
        prevPage.getDetail(this.data.id) // 调用上一页获取详情的方法
        wx.navigateBack({ // 跳转到上一页
          delta: 1
        })
      }
...

miniprogram\pages\fruit-detail\fruit-detail.js文件也需要修改,修改成如下,单独拎出一个getDetail方法,传入记录id进行查询:

  onLoad(options) {
    this.getDetail(options.id)
  },
  getDetail(id) {
    wx.cloud.callFunction({
        // 云函数名称
        name: 'fruit',
        // 传给云函数的参数
        data: {
          type: 'detail',
          id: id,
        },
      })
      .then(res => {
        this.setData({
          fruitDetail: res.result.data.data
        })
      })
      .catch(err => {})
  },

如此,我们的编辑功能就基本完善了

写在最后

以上就是小程序云开发之小程序页面堆栈的全部内容