本节概述

经过前面小节的学习,我们已经搭建起了小程序的编译构建环境,能够将我们开发的小程序项目编译成为对应的逻辑代码文件 logic.js,页面渲染文件 view.js,样式文件 style.css 和配置文件 config.json

在编译小程序的过程中,我们是将小程序的 WXML 文件中的组件节点编译为了 ui-xxx 格式的自定义组件,并将一些属性和事件处理进行了转化,这节开始我们就来针对性的完善我们的组件库.

搭建环境

这里我们的小程序页面渲染使用vue2来进行,首先我们使用vite来搭建一个开发环境,使用 @vitejs/plugin-vue2 来编译组件内容,并将输出为 iife 格式的文件: iife 格式的文件会将逻辑放在一个自执行的函数中进行,能够有效的避免全局的变量的冲突等问题;

为了加载方便,我们还可以把组件的样式也一起注入的输出的JS文件中,这样就可以少加载一个文件了。

import { defineConfig } from 'vite';
import path from 'path';
import vue from '@vitejs/plugin-vue2';
import cssInjectedByJsPlugin from 'vite-plugin-css-injected-by-js'export default defineConfig({plugins: [vue(),cssInjectedByJsPlugin(), // 将css样式注入到JS中],build: {lib: {entry: path.resolve(__dirname, './src/index.ts'),formats: ['iife'],name: 'components',},outDir: path.resolve(__dirname, 'dist'),rollupOptions: {external: ['vue']},},resolve: {extensions: ['.js', '.ts'],alias: {'@': path.resolve(__dirname, './src')}},
});

统一处理组件事件绑定

在上一节我们的编译过程中,我们是将小程序的事件绑定如 bindtap="tapHandler(1, $event, true)" 编译为了下面格式:

attrs {bindtap: { methodName: "tapHandler", params: [1, "$event", true] }
}

那么最终就得有组件库来对这种 bind 开头的属性进行特殊处理,转化为vue的事件处理逻辑,并调用bridge进行事件传递;

当然在处理过程中,我们还需要对事件对象进行包装,小程序的事件对象里面主要有两块内容:

  • detail 节点的数据, 如input输入框的value等
  • currentTarget.dataset 当前节点上携带的 data-* 数据

这部分逻辑是在每个组件都需要用到的,这里我们将其封装为一个vue mixin

// 用于将属性名称转化为驼峰命名格式: 如 `test-handler` => testHandler
function toCamelCase(attr: string) {return attr.toLowerCase().replace(/-(.)/g, function (_, group) {return group.toUpperCase();});
}// 获取节点属性上的 `data-*` 数据
function makeAttrParams(attrs: Record<string, any>) {const result = {};for (const attr in attrs) {if (!/^data-/.test(attr)) {continue;}const theAfter = attr.replace(/^data-/, '');const transAttr = toCamelCase(theAfter);result[transAttr] = attrs[attr];}return result;
}export const miniAppMixin = {created() {for (let attr in (this as any).$attrs) {if (!/^bind/.test(attr)) {continue;}if (!(this as any).$attrs[attr]) {continue;}// 获取事件名称,如 "tap" const eventName = attr.replace(/^bind/, '');const { methodName, params } = (this as any).$attrs[attr];// 这个会由 ui 线程创建Vue渲染实例的时候进行注入,用户获取到对应 bridge id,用于进行事件传递const { id } = (this as any).$vnode.context._bridgeInfo;(this as any).$on(eventName, (sysParams) => {// 构造小程序事件参数对象const _event = {detail: {...sysParams,},currentTarget: {dataset: makeAttrParams((this as any).$attrs)}};// 组装事件参数const paramsList = params.map(param => {if (param === '$event') {return _event;}return param;});if (!paramsList.length) {paramsList.push(_event);}window.JSBridge.onReceiveUIMessage({type: 'triggerEvent',body: {methodName,id,paramsList}});});}}
}

编写组件

这里我们以 view 组件为例,其他组件类似我们就不全部实现,大家可前往文末点击本节代码前往查看

<template><div class="ui-view" @click="clicked"><slot></slot></div>
</template><script>
import { miniAppMixin } from '@/mixins';export default {name: 'ui-view',mixins: [miniAppMixin],methods: {clicked() {this.$emit('tap');}}
}
</script><style lang="less" scoped>
.ui-view {display: block;
}
</style>

编写完组件后我们需要在入口文件进行统一注册:

import View from './components/view/index.vue';const components = {'ui-view': View,
};
Object.keys(components).forEach(name => {// vue会通过全局进行引入window.Vue.component(name, components[name]);
});

小程序页面交互API

在小程序中,除了页面上的组件以外,还有一部分API也是能够控制页面内容显示的,如 showToast 能够控制页面弹出一个提示框,这部分作用于页面渲染的api我们也实现在组件库中。

interface ToastInfo {dom: HTMLElement | null;timer: number | null;
}
const toastInfo: ToastInfo = {dom: null,timer: null,
}export function showToast(opts) {const title = opts.title;const duration = opts.duration || 1500;const icon = opts.icon || 'success';if (!title) return;// 移除旧的toastif (toastInfo.dom) {document.body.removeChild(toastInfo.dom);toastInfo.dom = null;clearTimeout(toastInfo.timer!);}// 创建toast组件的容器,并按照icon添加不同的状态类名toastInfo.dom = document.createElement('div');toastInfo.dom.classList.add('ui-toast', `ui-toast--${icon}`);toastInfo.dom.innerHTML = `<p>${title}</p>`;document.body.appendChild(toastInfo.dom);document.body.appendChild(toastInfo.dom);toastInfo.timer = setTimeout(() => {document.body.removeChild(toastInfo.dom!);}, duration) as unknown as number;
}

将API挂载到全局对象上:

import { showToast } from './showToast';window.wxComponentsApi = {showToast,
}

这样我们的组件包就开发好啦,文章中组件只以 view 组件为例进行了实现,其他组件可前往本节代码仓库。

本节代码已上传至 Github: mini-wx-app

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/90442.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/90442.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/90442.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

250708-Debian系统安装Edge浏览器并配置最小中文输入法

在 Debian 系统上安装 Microsoft Edge 浏览器可以通过以下几种方式进行。Microsoft 官方提供了 .deb 安装包&#xff0c;适用于 Debian、Ubuntu 及其衍生系统。 A. 如何安装&#xff1f; ✅ 方法一&#xff1a;使用 .deb 安装包&#xff08;推荐&#xff09; 步骤 1&#xff…

docker所占硬盘内存指令

使用下面命令可以查看docker所占的硬盘大小&#xff0c;如&#xff1a;docker system dfdocker system df -v

A1126LLHLX-T Allegro霍尔效应锁存器,5kHz+推挽输出,汽车级转速检测专家!

A1126LLHLX-T&#xff08;Allegro&#xff09;产品解析一、产品定位A1126LLHLX-T是Allegro MicroSystems推出的全极性霍尔效应锁存器&#xff0c;采用超薄SOT-23W封装&#xff08;1mm厚度&#xff09;&#xff0c;专为高可靠性位置检测与转速测量设计&#xff0c;具有低功耗、高…

【C#】File从后往前读取文件指定行数

/// <summary>/// 从后往前读取文件最后行数据/// </summary>/// <param name"filePath"></param>/// <param name"count"></param>/// <returns></returns>public static List<string> ReadFileRe…

暑假算法日记第五天

目标​&#xff1a;刷完灵神专题训练算法题单 阶段目标&#x1f4cc;&#xff1a;【算法题单】滑动窗口与双指针 LeetCode题目:683. K 个关闭的灯泡2067. 等计数子串的数量2524. 子数组的最大频率分数2269. 找到一个数字的 K 美丽值1984. 学生分数的最小差值1461. 检查一个字符…

【05】MFC入门到精通——MFC 为对话框中的控件添加变量 和 数据交换和检验

文章目录四、 为对话框中的控件添加变量五、对话框类的5.1 为编辑框添加变量面步骤中 为对话框添加了几个控件&#xff0c;包括三个静态文本框&#xff0c;三个编辑框&#xff0c;一个按钮控件。 四、 为对话框中的控件添加变量 编辑框中的数据可能会经常变化&#xff0c;有必…

4-Kafka-partition(分区)概念

Kafka Topic 分区详解 &#x1f4cc; 一、分区核心概念 1. 什么是分区&#xff1f; 物理分片&#xff1a;Topic 被划分为多个分区&#xff08;Partition&#xff09;&#xff0c;每个分区是一个有序、不可变的消息序列存储单位&#xff1a;每个分区对应一个物理日志文件&…

论文略读:UniPELT: A Unified Framework for Parameter-Efficient Language Model Tuning

ACL 2021 LoRAPrefix TuningAdapter门控蓝色参数是可训练的参数

【论文阅读】CogView: Mastering Text-to-Image Generation via Transformers

CogView&#xff1a;通过Transformers实现文本到图像的生成简介目标&#xff1a;通用领域中的文本到图像生成一直是一个开放的问题&#xff0c;它既需要强大的生成模型&#xff0c;也需要跨模态的理解。为了解决这个问题&#xff0c;我们提出了CogView&#xff0c;一个具有VQ -…

Typecho与WordPress技术架构深度对比:从LAMP到轻量级设计

文章目录 Typecho vs WordPress:深入比较两大博客系统的优劣与选型指南引言1. 系统概述与技术架构1.1 WordPress架构分析1.2 Typecho架构特点2. 核心功能对比2.1 内容管理能力2.2 主题与模板系统3. 性能与扩展性对比3.1 系统性能基准测试3.2 扩展生态系统4. 安全性与维护成本4…

CSS揭秘:8.连续的图像边框

前置知识&#xff1a;CSS 渐变&#xff0c;5. 条纹背景&#xff0c;border-image&#xff0c;基本的 CSS 动画前言 本文旨在实现图片边框效果&#xff0c;即在特定场景下让图片显示在边框而非背景区域。 一、传统实现方案 正常我们面对这样一个需求时&#xff0c;下意识会想到的…

Linux驱动学习day20(pinctrl子系统驱动大全)

一、Pinctrl作用Pinctrl(Pin Controller)&#xff1a;控制引脚引脚的枚举与命名、引脚复用、引脚配置。Pinctrl驱动一般由芯片原厂的BSP工程师来写&#xff0c;一般驱动工程师只需要在设备树中指明使用哪个引脚&#xff0c;复用为哪个功能、配置为哪些状态。二、Pin Controller…

Debiased All-in-one Image Restoration with Task Uncertainty Regularization

Abstract 一体化图像恢复是一项基础的底层视觉任务&#xff0c;在现实世界中有重要应用。主要挑战在于在单个模型中处理多种退化情况。虽然当前方法主要利用任务先验信息来指导恢复模型&#xff0c;但它们通常采用统一的多任务学习&#xff0c;忽略了不同退化任务在模型优化中的…

逆向 qq 音乐 sign,data, 解密 response 返回的 arraybuffer

解密 arraybuffer python requests 请求得到 arraybuffer&#xff0c;转为 hex 传递给 js res_data sign ctx.call("decrypt", response.content.hex())function decrypt(hex) {const bytes new Uint8Array(hex.length / 2);for (let i 0; i < hex.length; i …

PPT处理控件Aspose.Slides教程:在 C# 中将 ODP 转换为 PPTX

您是否正在寻找可靠的 PowerPoint SDK 来以编程方式开发ODP到PPTX转换器&#xff1f;本篇博文演示了如何使用 C# 将 ODP 转换为 PPTX。ODP是一种基于 XML 的演示文稿文件&#xff0c;可能包含图像、视频、文本等。但是&#xff0c;将打开的文档演示文稿转换为 PowerPoint 格式可…

[746] 使用最小花费爬楼梯

可以从下标0或者1作为起始位置————dp[0] dp[1] 0。一次性可以选择移动1次或者2次&#xff0c;故当下标>2的时候&#xff0c;到达2有可能是从下标0开始或者下标1开始&#xff0c;cost[0] or cost[1]&#xff1b;到达n&#xff0c;有可能是花费cost[n-1]到达&#xff0c…

树莓派vsftpd文件传输服务器的配置方法

在树莓派上安装和配置 vsftpd&#xff08;Very Secure FTP Daemon&#xff09;服务器的步骤如下&#xff1a; 1. 安装 vsftpd 打开终端&#xff0c;执行以下命令安装 vsftpd&#xff1a; sudo apt update sudo apt install vsftpd安装完成后&#xff0c;vsftpd 会自动启动。可以…

4.服务注册发现:微服务的神经系统

在微服务架构中,服务之间不再是固定连接,而是高度动态、短暂存在的。如何让每个服务准确找到彼此,是分布式系统治理的核心问题之一。服务注册发现机制,正如神经系统之于人体,承担着连接、协调、感知变化的关键角色。 本文将围绕 Netflix 开源的服务注册发现组件 Eureka 展…

基于Docker Compose部署Traccar容器与主机MySQL的完整指南

Traccar Docker镜像内嵌了H2数据库&#xff0c;该数据库容量有限&#xff0c;当达到一定容量时&#xff0c;定位数据无法写入会导致无法定位显示。为此有必要为Traccar 配置外部数据库。根据官网文档和自身经验我选择了MySQL。 参考的官方文档 软件环境为ubuntu server 24.04版…

paddlehub环境搭建和测试

目录1.环境搭建1.1 创建conda环境1.2 安装paddlepaddle和paddlehub1.3 安装依赖2. 移动端模型部署2.1 安装移动端模型2.2 测试3. 服务部署3.1 启动PaddleHub Serving3.2 发送预测请求1.环境搭建 1.1 创建conda环境 conda create --name paddlehub python3.8 conda activate p…