千家信息网

小程序开发中如何扩展Page页面对象

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,这篇文章主要介绍"小程序开发中如何扩展Page页面对象 "的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"小程序开发中如何扩展Page页面对象 "文章能帮助大家解
千家信息网最后更新 2024年12月13日小程序开发中如何扩展Page页面对象

这篇文章主要介绍"小程序开发中如何扩展Page页面对象 "的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"小程序开发中如何扩展Page页面对象 "文章能帮助大家解决问题。

小程序是通过调用 Page 函数来注册一个页面的:

//index.jsPage({  data: {    text: "This is page data."  },  onLoad: function(options) {    // Do some initialize when page load.  },  // Event handler.  viewTap: function() {    this.setData({      text: 'Set some data for updating view.'    }, function() {      // this is setData callback    })  }})复制代码

这里 Page 的作用相当于构造函数, Page 会初始化页面对象(实例),然后将配置参数中的属性 merge 到页面对象上。

假设你封装了个 http 模块负责发出请求,你想在页面对象中直接通过 this.http 引用这个模块,就需要扩展页面对象。要扩展一个对象,在 JavaScript 中的常见做法是扩展构造函数的 prototype 属性,这是 Vue 很多插件的实现:

import axios from 'axios'Vue.prototype.axios = axios// 在 vue 组件中this.axios.get(api).then(callback)复制代码

很不幸,在小程序中这个办法无效。 Page 并不是普通的构造函数,底层还做了很多其他事情,没办法直接通过 Page.prototype 扩展页面对象。

我们可以转变思路,扩展传进 Page 的配置对象。既然始终要通过调用 Page 注册页面,可以定义一个函数,这个函数会将收到的配置对象参数进行处理,然后再传给 Page 。

// wxPage.jsimport http from '../utils/http'const wxPage = function(config) {  config.http = http  return Page(config)}export default wxPage复制代码

注册页面的时候改用这个 wxPage :

import Page from './wxPage'Page({  data: {    text: "This is page data."  },  onLoad: function(options) {    console.log(this.http) // 打印 http 模块变量    this.http.get(api).then(callback) // 直接调用 http 的方法  },})复制代码

直接修改 Page 函数

为了增强页面对象,每个需要的页面都得引入 wxPage 是一件不太省心的事;更多时候我们是在维护一个老项目,需要扩展每个原有的页面对象,这时可以直接修改 Page :

const originalPage = Page //保存原来的PagePage = function(config) { // 覆盖Page变量  config.http = http  return originalPage(config)}复制代码

一般来说,修改 Page 的时机是在 App onLoad 的时候。这样原有的页面不用修改,直接就能通过 this.http 拿到 http 。

通过扩展 Page 页面对象实现常见需求

1. 给生命周期方法增加通用逻辑

有时我们希望在页面注册的 onLoad 阶段执行一些通用的逻辑,例如埋点,打 log 等,这时可以改写配置对象中的 onLoad 方法:

const originalPage = PagePage = function(config) {  const { onLoad } = config  config.onLoad = function(onLoadOptions) {    // 打 log、埋点……    console.log('每个页面都会打出这个log')    if (typeof onLoad === 'function') {      onLoad.call(this, onLoadOptions)    }  }  return originalPage(config)}复制代码

2. 获取上一页页面对象

小程序中的页面跳转会形成一个页面栈,栈中存放着每个页面对象,可以通过getCurrentPages 方法获得这个页面栈。可以在页面 onLoad 的时候获取这个页面栈,然后取出倒数第二个对象,就是当前页上一页的页面对象:

// 接上...  const { onLoad } = config  config.onLoad = function(onLoadOptions) {    const pages = getCurrentPages()    this.__previousPage = pages[pages.length - 2] // 将上一页的页面对象赋为this.__previousPage    if (typeof onLoad === 'function') {      onLoad.call(this, onLoadOptions)    }  }  return originalPage(config)复制代码

这样在页面对象中可通过引用 this.__previousPage 获取上一页页面对象的data及所有方法,这样在一些只需要两个页面互动的情景下,当前页直接调用上一个页面对象的方法(相当于回调)后再返回,比通过全局状态管理上一页的数据要方便。

3. 跳转页面并传递数据到下一页

这个不多说了,直接看代码吧:

// 接上config.navigateTo = function(url, params) { // 实现一个navigateTo方法,参数包括跳转url和要传递的参数  this.__params = params  wx.navigateTo({ url })}config.onLoad = function(onLoadOptions) {  const pages = getCurrentPages()  this.__previousPage = pages[pages.length - 2] // 将上一页的页面对象赋为this.__previousPage  if (this.__previousPage) {    onLoadOptions.params = this.__previousPage.__params // 获取上一页面的__params赋给onLoad函数的options    delete this.__previousPage.__params  }  if (typeof onLoad === 'function') {    onLoad.call(this, onLoadOptions)  }}// A 页面跳转 B 页面this.navigateTo('urlToB', { foo: 'bar' })// B 页面的 onLoadPage({  onLoad(options) {    console.log(options.params) // { foo: 'bar' }  }})复制代码

关于"小程序开发中如何扩展Page页面对象 "的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

页面 对象 代码 函数 方法 上一 参数 时候 配置 小程 开发 模块 知识 程序 办法 变量 属性 常见 数据 是在 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 本地数据库连接和远程服务器速度 施肥机软件开发公司 慈溪直销软件开发设计 深圳经纬软件开发有限公司 对网络安全与生活认识 用服务器解析的域名能用吗 数据库聚集文件是什么 《网络安全法》第41条 r 中的数据库如何导出 pubg如何建立服务器 服务器主板灯一只闪 小白学网络安全工程师 疫情防控不放松网络安全 万方和超星数据库 辽宁费用管理软件开发 软件开发工程师等级划分6级 东港软件开发技术在线咨询 网络安全里面有没有啥好公司 软件开发合同 示范文本 中国知网是不是全数据库 软件开发公司怎么去精准获客 服务器怎么使用root解除限制 网络安全需要提高的方面 局域网 数据库 选择 MariaDB数据库管理叫什么 软件开发项目的服务承诺 服务器数据库备份文件自动删除 数据库创建表代码2012 党网络安全监督总结报告 中山通讯软件开发报价表
0