首页
技术小册
AIGC
面试刷题
技术文章
MAGENTO
云计算
视频课程
源码下载
PDF书籍
「涨薪秘籍」
登录
注册
01 | 初步介绍微信小程序
02 | 还有哪些其它公司的小程序产品
03 | 小程序的特点及开发能力
04 | 新的一年,微信小程序开放了哪些新功能?
05 | 小程序运行机制简介:从零构建一个Web App需要做哪些事情?
06 | 开发环境配置:创建你的第一个小程序项目
07 | icon组件:关于图标的4个实现方案
08 | progress组件:如何自定义实现一个环形进度条?
09 | rich-text组件:如何单击预览rich-text中的图片并保存?
10 | view容器组件及Flex布局(一):学习容器组件view及其重要属性
11 | view容器组件及Flex布局(二):介绍flex布局中常用的样式及样式值
12 | 可移动容器及可移动区域(一):学习使用movable-view与movable-area组件
13 | 可移动容器及可移动区域(二):如何实现侧滑删除功能
14 | scroll-view介绍:在小程序中如何实现滚动锚定?
15 | scroll-view介绍:如果渲染一个滚动的长列表?
16 | 滚动选择器(一):学习使用选择器组件
17 | 滚动选择器(二):使用两种方式自定义实现省、市、区三级联动的选择器
18 | 滑动选择器表单组件:如何基于wxs自定义一个竖向的slider?
19 | 页面链接组件:如何自定义一个导航栏?
20 | image媒体组件(上):如何实现图片的懒加载?
21 | image媒体组件(下):开发中经常遇到的问题?
22 | 如何实现直播间功能?(一):了解live-pusher、live-player组件的主要属性及使用限制
23 | 如何实现直播间功能?(二):如何开启、使用腾讯云的云直播功能
24 | 如何实现直播间功能?(三):安装与使用ffmepg,及使用ffmpeg进行推拉流验证
25 | 如何实现直播间功能?(四):使用live-pusher、live-player组件在小程序中实现直播功能
26 | 如何实现直播间功能?(五):同层渲染
27 | 如何实现直播间功能?(六):live-pusher、live-player组件在开发中的常见问题
28 | web-view(一):了解session、cookie等相关基本概念
29 | web-view(二):了解常见的四种鉴权方式
30 | web-view(三):如何使用koa框架,及如何进行热加载?
31 | web-view(四):如何在服务器端实现cookie与sesson的生成?
32 | web-view(五):如何将session存储到服务器端,及如何实现token验证?
33 | web-view(六):基于koa中间件,实现微信一键登录的后端接口
34 | web-view(七):实现微信用户一键登录
35 | web-view(八):了解正确的微信登录姿势
36 | web-view(九):web-view组件在开发的常见问题讲解
37 | WebGL介绍(一):了解WebGL相关的基础概念
38 | WebGL介绍(二):如何在小程序中取到WebGL上下文环境对象
39 | WebGL介绍(三):了解WebGL的世界坐标系
40 | WebGL介绍(四):重新认识右手坐标系及如何编写顶点着色器代码
41 | WebGL介绍(五):学习片断着色器编写,了解变量修饰变型uniform与attribute
42 | WebGL介绍(六):了解在WebGL中裁剪空间是如何裁剪出来的
43 | WebGL介绍(七):了解着色器变量值的绑定及三种三角形绘制模式之间的差异
44 | WebGL介绍(八):在着色器中使用共享变量,绘制一个颜色渐变的正方形
45 | WebGL介绍(九):完成动画
46 | WebGL介绍(十):绘制一个旋转的立方体
47 | WebGL介绍(十一):在3D绘制中使用纹理材质
48 | WebGL介绍(十二):如何创建相机、场景及光源
49 | WebGL介绍(十三):创建加载器、渲染器与控制器,完成3D模型文件的加载与展示
50 | 网络接口简介(一):如何使用wx.request接口
51 | 网络接口简介(二):将登录代码模块化封装
52 | 网络接口简介(三):Promise介绍及 6 个常用方法
53 | 网络接口简介(四):Promise三个方法any、all与race的使用介绍
54 | 网络接口简介(五):基于Promise+await、async关键字改写登录模块
55 | 网络接口简介(六):关于Page页面隐藏代码执行及Promise对象的catch处理的补充
56 | 网络接口简介(七):学习EventChannel对象
57 | 网络接口简介(八):观察者模式介绍及Event模块实现
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
59 | tabBar组件(一):系统默认的tabBar组件如何开启及使用
60 | tabBar组件(二):基于系统提供的自定义方式,实现一个tabBar组件
61 | tabBar组件(三):通过自定义组件扩展的方式,给任意组件添加通用方法
62 | 开放接口(一):如何对Page进行全局扩展
63 | 开放接口(二):优化前后端登录代码,解决后端解密错误
当前位置:
首页>>
技术小册>>
微信小程序全栈开发实战(上)
小册名称:微信小程序全栈开发实战(上)
### 57 | 网络接口简介(八):观察者模式介绍及Event模块实现 在微信小程序的全栈开发过程中,网络通信扮演着至关重要的角色,它连接了前端与后端,实现了数据的实时交换与同步。然而,仅仅了解如何进行网络请求还远远不够,如何在复杂的应用场景中高效地管理这些网络请求及其响应,是提升应用性能和用户体验的关键。本章节将跳出纯粹的网络接口技术范畴,引入设计模式中的“观察者模式”,并通过实现一个自定义的`Event`模块,来优化我们的小程序在网络数据处理上的能力。 #### 一、观察者模式简介 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。这种模式广泛应用于软件开发中,特别是在需要事件驱动编程的场景下,如用户界面组件的交互、异步编程中的回调管理等。 ##### 1.1 观察者模式的核心角色 - **Subject(主题)**:抽象主题角色,把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任何数量的观察者。一般它提供一个接口,用于增加和删除观察者对象,同时它一般还拥有一个通知所有观察者的方法。 - **Observer(观察者)**:抽象观察者角色,为所有的具体观察者定义一个接口,在得到主题的通知时更新自己。 - **ConcreteSubject(具体主题)**:将有关状态存入具体观察者对象;在具体主题的内部状态改变时,给所有登记过的观察者发出通知。 - **ConcreteObserver(具体观察者)**:实现抽象观察者角色所要求的更新接口,以便使本身的状态与主题的状态相协调。如果需要,具体观察者角色可以保存一个指向具体主题对象的引用。 ##### 1.2 观察者模式的优点 - **松耦合**:观察者和被观察的对象之间是抽象耦合的,使得它们可以独立地改变和复用。 - **广播通信**:被观察者会向所有的注册过的观察者发出通知,而不是单一对象。 - **易于扩展**:增加新的观察者对象很方便,无需修改被观察者的代码。 #### 二、在微信小程序中实现Event模块 在微信小程序中,虽然框架已经提供了一套基于回调的异步处理机制,但在某些场景下,直接使用这些机制可能会导致代码难以维护,特别是当涉及到多个组件或页面共享同一数据源时。此时,实现一个基于观察者模式的`Event`模块,可以有效提升代码的可读性和可维护性。 ##### 2.1 设计思路 - **主题(Subject)**:在微信小程序中,可以视为一个全局的事件中心,负责管理所有事件的注册、注销和分发。 - **观察者(Observer)**:即小程序的页面、组件或其他逻辑处理单元,它们注册到事件中心以监听特定事件,并在事件发生时执行相应的处理逻辑。 ##### 2.2 实现步骤 ###### 2.2.1 创建Event模块 首先,在小程序的某个公共目录下(如`utils`目录)创建一个`eventCenter.js`文件,用于实现事件中心。 ```javascript // eventCenter.js class EventCenter { constructor() { this.handlers = {}; } // 注册事件 on(eventName, handler) { if (!this.handlers[eventName]) { this.handlers[eventName] = []; } this.handlers[eventName].push(handler); } // 注销事件 off(eventName, handler) { if (this.handlers[eventName]) { const index = this.handlers[eventName].indexOf(handler); if (index > -1) { this.handlers[eventName].splice(index, 1); } } } // 触发事件 emit(eventName, ...args) { if (this.handlers[eventName]) { this.handlers[eventName].forEach(handler => { handler(...args); }); } } } // 导出事件中心实例 const eventCenter = new EventCenter(); export default eventCenter; ``` ###### 2.2.2 使用Event模块 在小程序的页面或组件中,可以通过引入`eventCenter.js`来使用事件中心。 ```javascript // 在某个页面的js文件中 import eventCenter from '../../utils/eventCenter'; // 注册事件监听 Page({ onLoad: function() { eventCenter.on('networkDataUpdate', this.handleDataUpdate); }, // 处理函数 handleDataUpdate: function(data) { console.log('接收到新数据:', data); // 更新页面数据等操作 }, // 注销事件监听(可选,通常在页面卸载时执行) onUnload: function() { eventCenter.off('networkDataUpdate', this.handleDataUpdate); } }); // 在网络请求成功后触发事件 // 假设这是从某个服务中请求数据后调用的函数 function handleNetworkResponse(data) { eventCenter.emit('networkDataUpdate', data); } ``` ##### 2.3 注意事项 - **内存管理**:确保在不需要监听事件时及时注销,避免内存泄漏。 - **异步处理**:在微信小程序中,页面或组件的`onLoad`、`onUnload`等生命周期函数与事件处理函数之间的调用可能是异步的,需要注意数据的一致性和状态的更新。 - **性能考虑**:如果事件监听器非常多,或者触发频率很高,可能会影响应用的性能。考虑使用防抖(debounce)或节流(throttle)等技术来优化。 #### 三、总结 通过引入观察者模式并实现一个自定义的`Event`模块,我们为微信小程序的网络数据处理提供了一种更加灵活和高效的方式。这种方式不仅提高了代码的可读性和可维护性,还使得跨页面、跨组件的数据共享和事件通信变得更加简单直接。在未来的小程序开发中,可以进一步探索如何结合微信小程序的框架特性,将观察者模式应用到更多场景中,以提升整体的应用质量和用户体验。
上一篇:
56 | 网络接口简介(七):学习EventChannel对象
下一篇:
58 | 网络接口简介(九):扩展wxp模块的request3方法,实现用户登录的自动融合
该分类下的相关小册推荐:
微信小程序与云开发(下)
微信小程序底层框架实现原理
微信小程序全栈开发实战(中)
微信小程序全栈开发实战(下)
微信小程序与云开发(上)
微信小程序与云开发(中)