Skip to content

页面路由与生命周期

路由跳转

wx.navigateTo - 保留当前页面,跳转到新页面

将新页面压入页面栈,当前页面被保留。

特点:

  • 新页面进入动画从右到左
  • 当前页面不会卸载,可以通过 wx.navigateBack 返回
  • 左上角有返回按钮

限制:不能用于跳转到 tabBar 页面

URL 参数:可以通过 URL 传递参数

javascript
// 跳转到新页面,并传递参数
wx.navigateTo({
  url: '/pages/detail/detail?id=123&name=abc'
})

// 在目标页面的 onLoad 中接收参数
// detail.js
Page({
  onLoad: function(options) {
    console.log(options.id)    // "123"
    console.log(options.name)  // "abc"
  }
})

wx.redirectTo - 关闭当前页面,跳转到新页面

关闭当前页面,将新页面压入页面栈。

特点:

  • 新页面替换当前页面
  • 当前页面会被卸载
  • 左上角没有返回按钮

限制:不能用于跳转到 tabBar 页面

使用场景:登录页跳转到首页、不需要返回的场景

javascript
// 关闭当前页面,跳转到新页面
wx.redirectTo({
  url: '/pages/home/home'
})

wx.switchTab - 跳转到 tabBar 页面

跳转到 tabBar 页面,并关闭所有非 tabBar 页面。

特点:

  • 会清空页面栈中所有非 tabBar 页面
  • 只能跳转到在 app.json 中 tabBar 配置的页面

限制:只能跳转到 tabBar 页面,不能传递 URL 参数

javascript
// 跳转到 tabBar 页面
wx.switchTab({
  url: '/pages/index/index'
})

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

关闭所有页面,打开到应用内的某个页面。

特点:

  • 清空整个页面栈,然后打开新页面
  • 可以跳转到任意页面(包括 tabBar 页面)

使用场景:应用重启、回到首页等需要清空历史记录的场景

javascript
// 关闭所有页面,打开到首页
wx.reLaunch({
  url: '/pages/index/index'
})

wx.navigateBack - 返回上一页面或多级页面

关闭当前页面,返回上一页面或多级页面。

参数:

  • delta: 返回的页面数,默认值为 1
javascript
// 返回上一页面
wx.navigateBack()

// 返回前两页面
wx.navigateBack({
  delta: 2
})

// 返回到首页(假设首页在栈底)
wx.reLaunch({
  url: '/pages/index/index'
})

应用生命周期(app.js)

应用生命周期函数定义在 app.js 中,监控整个小程序的启动、显示、隐藏等状态。

javascript
// app.js
App({
  // 1. 小程序初始化完成时触发(全局只触发一次)
  onLaunch: function(options) {
    console.log('小程序启动了')
    
    // 获取启动参数
    console.log('启动场景:', options.scene)
    console.log('启动路径:', options.path)
    console.log('启动参数:', options.query)
    
    // 常见的初始化操作:
    // - 获取用户信息
    // - 检查登录状态
    // - 初始化云开发
    // - 获取系统信息
    // - 设置全局数据
    
    // 示例:检查登录状态
    const token = wx.getStorageSync('token')
    if (token) {
      this.checkSession()
    }
  },
  
  // 2. 小程序启动,或从后台进入前台显示时触发
  onShow: function(options) {
    console.log('小程序显示了')
    
    // 常见的操作:
    // - 统计页面访问
    // - 恢复游戏、音乐播放等
    // - 检查更新
  },
  
  // 3. 小程序从前台进入后台时触发
  onHide: function() {
    console.log('小程序隐藏了')
    
    // 常见的操作:
    // - 暂停游戏、音乐播放等
    // - 清除定时器
    // - 保存临时数据
  },
  
  // 4. 小程序发生脚本错误,或者 api 调用失败时触发
  onError: function(error) {
    console.error('小程序出错了:', error)
    
    // 错误上报到监控系统
    wx.request({
      url: 'https://your-error-api.com/report',
      data: { error: error.toString() }
    })
  },
  
  // 自定义全局方法
  checkSession: function() {
    wx.checkSession({
      success: () => {
        console.log('session 有效')
      },
      fail: () => {
        console.log('session 失效,需要重新登录')
        this.globalData.needLogin = true
      }
    })
  },
  
  // 全局数据
  globalData: {
    userInfo: null,
    needLogin: false,
    systemInfo: null
  }
})

应用生命周期触发场景:

  • onLaunch:小程序初始化完成时(冷启动)
  • onShow
    • 小程序启动时
    • 从后台切回前台时
    • 从其他小程序返回时
  • onHide
    • 切到后台时
    • 导航到其他小程序时

页面生命周期(page.js)

页面生命周期函数定义在每个页面的 .js 文件中,监控单个页面的加载、显示、就绪等状态。

javascript
// pages/detail/detail.js
Page({
  data: {
    product: null,
    loading: true
  },
  
  // 1. 页面加载时触发,一个页面只调用一次
  onLoad: function(options) {
    console.log('页面加载,参数:', options)
    
    // 获取路由参数
    const productId = options.id
    
    // 常见的操作:
    // - 根据参数请求数据
    // - 初始化页面数据
    this.fetchProductDetail(productId)
  },
  
  // 2. 页面显示/切入前台时触发
  onShow: function() {
    console.log('页面显示了')
    
    // 常见的操作:
    // - 更新数据(如购物车数量)
    // - 开始动画
    // - 订阅消息
  },
  
  // 3. 页面初次渲染完成时触发,一个页面只调用一次
  onReady: function() {
    console.log('页面渲染完成了')
    
    // 常见的操作:
    // - 操作页面DOM(通过wx.createSelectorQuery)
    // - 开始复杂的动画
  },
  
  // 4. 页面隐藏/切入后台时触发
  onHide: function() {
    console.log('页面隐藏了')
    
    // 常见的操作:
    // - 暂停动画、视频播放
    // - 取消订阅
    // - 保存表单草稿
  },
  
  // 5. 页面卸载时触发,一个页面只调用一次
  onUnload: function() {
    console.log('页面卸载了')
    
    // 常见的操作:
    // - 清除定时器
    // - 取消网络请求
    // - 清理全局事件监听
  },
  
  // 6. 下拉刷新时触发(需要在页面配置中开启enablePullDownRefresh)
  onPullDownRefresh: function() {
    console.log('用户下拉刷新了')
    
    // 重新加载数据
    this.refreshData().then(() => {
      // 停止下拉刷新动画
      wx.stopPullDownRefresh()
    })
  },
  
  // 7. 页面上拉触底时触发
  onReachBottom: function() {
    console.log('用户上拉触底了')
    
    // 加载更多数据
    this.loadMoreData()
  },
  
  // 8. 用户点击右上角分享时触发
  onShareAppMessage: function() {
    return {
      title: '分享标题',
      path: '/pages/detail/detail?id=123',
      imageUrl: '/images/share.jpg'
    }
  },
  
  // 自定义方法
  fetchProductDetail: function(id) {
    this.setData({ loading: true })
    
    wx.request({
      url: `https://api.example.com/products/${id}`,
      success: (res) => {
        this.setData({
          product: res.data,
          loading: false
        })
      }
    })
  }
})

页面生命周期执行顺序:

打开新页面:
onLoad → onShow → onReady

从A页面navigateTo到B页面:
A.onHide → B.onLoad → B.onShow → B.onReady

从B页面navigateBack到A页面:
B.onUnload → A.onShow

切到后台:
onHide

从后台切回:
onShow

实际应用场景:

javascript
// 一个完整的数据加载页面示例
Page({
  data: {
    list: [],
    page: 1,
    hasMore: true,
    loading: false
  },
  
  onLoad: function(options) {
    this.loadData(1)
  },
  
  onShow: function() {
    // 每次显示时检查是否需要刷新(比如从编辑页返回)
    if (this.data.needRefresh) {
      this.loadData(1)
      this.setData({ needRefresh: false })
    }
  },
  
  onUnload: function() {
    // 清理工作
    if (this.requestTask) {
      this.requestTask.abort()
    }
  },
  
  onPullDownRefresh: function() {
    this.loadData(1).then(() => {
      wx.stopPullDownRefresh()
    })
  },
  
  onReachBottom: function() {
    if (this.data.hasMore && !this.data.loading) {
      this.loadData(this.data.page + 1)
    }
  },
  
  loadData: function(page) {
    if (this.data.loading) return Promise.resolve()
    
    this.setData({ loading: true })
    
    return new Promise((resolve) => {
      this.requestTask = wx.request({
        url: 'https://api.example.com/list',
        data: { page },
        success: (res) => {
          const newList = page === 1 ? res.data.list : this.data.list.concat(res.data.list)
          
          this.setData({
            list: newList,
            page: page,
            hasMore: res.data.hasMore,
            loading: false
          })
          
          resolve()
        }
      })
    })
  }
})
编程洪同学服务平台是一个广泛收集编程相关内容和资源,旨在满足编程爱好者和专业开发人员的需求的网站。无论您是初学者还是经验丰富的开发者,都可以在这里找到有用的信息和资料,我们将助您提升编程技能和知识。
专业开发
高端定制
售后无忧
站内资源均为本站制作或收集于互联网等平台,如有侵权,请第一时间联系本站,敬请谅解!本站资源仅限于学习与参考,严禁用于各种非法活动,否则后果自行负责,本站概不承担!