页面间关系

微信小程序的界面可以由多个页面组成。

页面之间可以相互跳转,如打开一个新页面,关闭一个已有页面等。这些页面切换的时机称为 页面路由 。

页面路径参数

最基本地,一个页面可以用 router.navigateTo 打开一个新页面。打开新页面时,可以携带路径参数。参数采用 URL 编码形式。

// page/index/index.js
Page({
  viewTap: function() {
    var id = 'PRODUCT#1'
    this.router.navigateTo({
      // 传入路径参数时,使用 encodeURIComponent 是个好习惯
      url: '../product/product?id=' + encodeURIComponent(id),
    })
  },
})

在新打开的页面中,通过 this.options 可以获取到页面的路径参数。

// page/product/product.js
Page({
  onLoad: function() {
    // this.options 中的路径参数需要 decodeURIComponent
    var id = decodeURIComponent(this.options.id) // id === 'PRODUCT#1'
  }
})

目前更推荐使用 Component 构造器 来构造页面。这样使用时,可以将路径参数定义在 properties 中。

// page/product/product.js
Component({
  properties: {
    id: String,
  },
  lifetimes: {
    attached() {
      // this.data.id === 'PRODUCT#1'
    },
  },
})

路径参数的本质是页面的启动状态。在实践中,如果页面内容是由某些数据决定的,那这些数据应当是一个路径参数。例如:

  • 对于一个商品的详情页,页面所展示的商品由商品 ID 来决定,那么商品 ID 就应当是一个页面路径参数;
  • 对于一个学生的个人信息页,页面所展示的是哪个学生由学号来决定,那么学号就应当是一个页面路径参数。

使用路径参数可以在新页面启动时,向新页面传递数据。但如果两个页面之间需要持续进行双向的数据通信,或者有些数据不适合写在路径参数中,那就需要用到 EventChannel 页面间通信。

页面间通信

基础库 2.7.3 开始支持,低版本需做兼容处理。

如果一个页面由另一个页面通过 navigateTo 打开,这两个页面间将建立一条数据通道:

  • 被打开的页面可以通过 this.getOpenerEventChannel() 方法来获得一个 EventChannel 对象;
  • navigateTosuccess 回调中也包含一个 EventChannel 对象。

这两个 EventChannel 对象间可以使用 emiton 方法相互发送、监听事件。

在开发者工具中预览效果

界面渲染架构

微信小程序的界面由多个页面组成。在渲染每个页面时,微信小程序基础库内部的两个模块起着关键作用。

  • 组件框架 提供了 PagesetData 等重要的 JavaScript 接口,并结合 WXML 来构建界面结构。
  • 渲染引擎 将界面结构最终绘制成用户界面。

组件框架

组件框架为微信小程序提供了页面相关的 JavaScript 接口。与它相关的主要特性包括(但不限于):

  • 页面注册
  • 自定义组件
  • 事件系统
  • WXML

微信小程序基础库提供了两个可选的组件框架。选择不同的组件框架时,Page 等接口的具体实现、WXML 的运行方式都会有所不同。(每个页面可以独立选择使用哪个组件框架。)

  • exparser 是传统的组件框架(默认启用)。
  • glass-easel 是新一代组件框架,是一个开源项目,提供了更多特性、具有更好的性能表现。

详情请参考组件框架章节。

渲染引擎

渲染引擎为微信小程序提供了最终的界面绘制支持。与它相关的主要特性包括(但不限于):

  • 基础组件
  • WXSS 中的具体样式规则

微信小程序基础库提供了两个可选的渲染引擎。选择不同的渲染引擎时,可用的基础组件和 WXSS 样式规则会有一定区别。(每个页面可以独立选择使用哪个渲染引擎。)

  • Webview 是传统的渲染引擎(默认启用)。
  • Skyline 是更高效的渲染引擎,提供了很多增强特性、具有更好的性能表现。

渲染引擎对组件框架有一定的依赖。目前,如果选用了 Skyline 渲染引擎,就必须选用 glass-easel 组件框架。详情请参考 Skyline 渲染引擎章节。