likes
comments
collection
share

Weapp影视评分项目开发(13):扩展 Page 函数为所有页面增加公共方法

作者站长头像
站长
· 阅读数 48

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第13天,点击查看活动详情

前言

上一篇文章介绍了使用 behavior 实现代码的复用,但 behavior 是组件级的,不能复用 Page 中的一些方法,所以本篇我们将扩展 Page 函数,进一步简化下拉刷新与上拉加载的代码。

知识点

Page 函数扩展

一、Page 介绍

Page 方法实际是一个全局方法,我们在全局任意地方都能获取该方法,所有的页面也是使用这个方法来实现页面逻辑的处理,它接收一个 object 类型的参数,参数中可以根据页面需求传入 data、生命周期、页面方法等属性。

二、Page 扩展

因为下拉刷新、上拉加载、页面分享会在很多页面中使用,以及希望在 onLoad 方法里面能实现一些相同的业务处理,所以我们需要把这些方法添加到 Page 函数中。

三、扩展的实现

我们在项目根目录中新增 /extend/page.js 文件,结构如下:

├── extend
│   └── page.js  // page 扩展函数文件

1. page.js 的实现

export default () => {
  const originalPage = Page; // 将 Page 原函数赋值给其它变量存储

  /**
   * @desc Page 扩展,增加一些方法
   * @param { object } config Page 页面配置项
   * @return { function } 扩展后的 Page 函数
   */
  Page = function (config) {
    // config 是页面默认的方法,我们从中取出需要扩展的方法命名
    const {
      onLoad,
      onReachBottom,
      onPullDownRefresh
    } = config;
    
    // onLoad 生命周期
    config.onLoad = function (options) {
      // 扩展代码请看 2. onLoad 生命周期扩展
    })
    
    // 下拉刷新事件扩展
    config.onPullDownRefresh = function () {
      // 扩展代码请看 3. onPullDownRefresh 扩展
    })
    
    // 上拉加载事件扩展
    config.onPullDownRefresh = function () {
      // 扩展代码请看 4. onPullDownRefresh 扩展
    })
  
    // 将扩展后的方法返回,我们将在 app.js 中进行调用将其设置到全局中
    return originalPage(config)
  }
}

2. onLoad 生命周期扩展

上一篇中我们在 getInfiniteData.jsdata 中设置了一个默认字段 id,这个字段在资源详情页我们将其作为资源 ID ,所以我们需要获取到这个 id,页面中我们会在的 onLoad 生命周期中做如下操作:

Page({
  onLoad(options) {
    this.setData({
      id: options.id  // 将路由中的 id 赋值给 data
    })
  }
})

因为这部分代码在每个资源详情页是重复的,我们可以将这部分代码在上面的 page.js 中对 Page 方法进行扩展,这样详情页面就可以省略这部分重复代码,扩展如下:

// onLoad 生命周期
config.onLoad = function (options) {
  // 如果路由url传值中存在 id,则将其 setData 到 data 上
  // 如果页面中也有此判断条件,将会被覆盖
  if (options.id) {
    this.setData({
      id: options.id
    })
  }

  // 如果页面中存在 onLoad 方法,则将路由的参数指向改为 onLoad 对象
  if (typeof onLoad === 'function') {
    onLoad.call(this, options);
  }
}

3. onPullDownRefresh 扩展

上一篇的“正在热映”示例中,我们在页面的下拉刷新方法中调用了数据重置方法:

onPullDownRefresh() {
  this.resetData();  // 重置 data 数据并调用 loadMore 方法
}

同样,我们可以将这部分代码添加在 page.js 的扩展函数中,代码如下:

// 下拉刷新事件扩展
config.onPullDownRefresh = function () {
  // 如果页面中存在 onPullDownRefresh 方法
  // 则使用页面中的,也就是页面中的方法会覆盖此处定义的扩展
  if (typeof onPullDownRefresh === 'function') {
    onPullDownRefresh.call(this);
  } else {
    // 如果页面中存在 resetData 与 loadMore 方法
    // 则调用 resetData 方法,将 data 数据重置
    if (typeof this.resetData === 'function' && typeof this.loadMore === 'function') {
      this.resetData();
    }
  }
}

3. onPullDownRefresh 扩展

同样在上一篇的“正在热映”示例中,我们在页面的上拉加载更多的事件中调用了加载方法:

onReachBottom() {
  this.loadMore(); // 加载更多分页数据
}

同样,我们可以将这部分代码添加在 page.js 的扩展函数中,代码如下:

// 上拉加载事件扩展
config.onReachBottom = function () {
  // 如果页面中存在 onReachBottom 方法
  // 则使用页面中的,也就是页面中的方法会覆盖此处定义的扩展
  if (typeof onReachBottom === 'function') {
    onReachBottom.call(this);
  } else {
    // 如果页面中存在 loadMore 方法
    // 则调用该方法加载列表数据
    if (typeof this.loadMore === 'function') {
      this.loadMore(); // 加载更多分页数据
    }
  }
}

4. 方法实例化

以上即为对 Page 方法的扩展,我们需要将该方法在小程序的入口中实例化,代码如下:

// app.js
import extendPage from "./extend/page.js"; // 导入 page 扩展方法

extendPage(); // 执行该方法

至此,我们已实现将 onLoadonPullDownRefreshonReachBottom 事件扩展到页面 Page 的默认方法中,所以上期的 “正在热映” 的 js 文件,如下实现即可:

// pages/movies/theater/index.js
import { getMovieTheater } from "../../../api/api"; // 导入热映影视接口

Page({
  behaviors: [wx.getInfiniteData],  // 注入混入

  loadMore() {
    this.getData(getMovieTheater);  // 调用正在热映方法
  }
})

只需要几行代码,就可以实现原有需要几十上百行代码才能实现的功能,是不是非常简洁。

四、更多

以上的扩展,已满足当前的项目需求,日常业务中,我们可能需要做一些埋点统计,页面分享等功能,同样可以在 Page 的扩展函数中实现。

总结

本篇是对上一篇混入实现的扩展,将原有需要在每个页面 Page 方法中实现的功能,扩展到了 Page 默认方法中,减少业务代码量与复杂度。

转载自:https://juejin.cn/post/7175179024602234936
评论
请登录