简介
本指南面向在 DouPHP 小程序中开发自定义组件的工程师,围绕“组件结构设计、属性定义、事件处理、生命周期管理”展开,结合仓库中的 navbar 组件与小程序工程配置,给出从模板编写、逻辑实现到样式定义的完整流程。同时提供测试方法、调试技巧、性能优化策略、发布与复用机制,以及代码规范与最佳实践,并附带一个可复用的示例项目路径说明。
项目结构
DouPHP 的小程序代码位于 miniprogram 目录下,包含两套主题包:default(默认版)与 company(公司版)。每套主题包均遵循标准小程序工程结构:
- app.json:应用级配置,声明页面路由、全局窗口样式、tabBar 以及 usingComponents 全局组件注册。
- pages:页面目录,每个业务模块对应一个子目录。
- components:组件目录,按功能拆分可复用组件。
- services/stores/utils/types:网络请求、状态管理、工具函数与类型定义。
- style/app.wxss:全局样式。
graph TB
A["小程序根目录<br/>miniprogram"] --> B["default默认版"]
A --> C["company公司版"]
B --> B1["app.json"]
B --> B2["pages/*"]
B --> B3["components/*"]
B --> B4["services/stores/utils/types"]
C --> C1["app.json"]
C --> C2["pages/*"]
C --> C3["components/*"]
C --> C4["services/stores/utils/types"]
图表来源
- app.json(默认版):1-178
- app.json(公司版):1-178
章节来源
- app.json(默认版):1-178
- app.json(公司版):1-178
核心组件
以导航栏组件 navbar 为例,它展示了完整的自定义组件形态:WXML 模板、TS 逻辑、WXSS 样式、JSON 声明,并通过 app.json 的 usingComponents 在全局注册,供各页面复用。
- 组件声明:navbar.json 中声明 component: true。
- 模板层:navbar.wxml 描述布局与交互节点。
- 逻辑层:navbar.ts 定义 properties、data、lifetimes、methods。
- 样式层:navbar.wxss 定义组件外观与定位。
- 全局注册:app.json 的 usingComponents 将 navbar 暴露为全局组件。
章节来源
- navbar.json(公司版):1-3
- navbar.wxml(公司版):1-26
- navbar.ts(公司版):1-82
- navbar.wxss(公司版):1-64
- app.json(公司版):143-145
架构总览
下图展示小程序应用、页面与组件之间的调用关系,以及后端服务对小程序包的启用与同步能力。
graph TB
subgraph "小程序前端"
APP["app.json<br/>全局配置"]
NAV["组件 navbar<br/>wxml/ts/wxss/json"]
PAGES["pages/*<br/>业务页面"]
end
subgraph "后端服务"
SVC["MiniprogramService<br/>启用/删除/同步配置"]
end
APP --> NAV
PAGES --> NAV
SVC --> |"启用/删除/同步"| APP
图表来源
- app.json(默认版):143-145
- app.json(公司版):143-145
- MiniprogramService.php:139-165
章节来源
- MiniprogramService.php:97-165
- app.json(默认版):143-145
- app.json(公司版):143-145
详细组件分析
组件结构与属性设计
- 组件入口:navbar.json 声明组件标识。
- 属性(properties):
- title:标题文本,支持任意类型,内部会转换为字符串。
- backgroundColor:背景色,用于导航栏容器。
- titleColor:标题颜色。
- url:返回目标地址,为空时回退到 navigateBack。
- showMenu:是否显示菜单按钮区域。
- scrollOpacity(默认版):滚动透明度控制,配合多插槽使用。
- 数据(data):
- statusBarHeight、navigationBarHeight、menuButtonHeight 等尺寸信息来自 app.globalData,确保在不同设备上正确适配。
- debugDot:根据环境与服务器调试开关决定是否渲染调试入口圆点。
章节来源
- navbar.ts(公司版):8-51
- navbar.ts(默认版):8-57
模板编写(WXML)
- 顶部固定导航栏容器,高度由状态栏与导航栏高度组合计算。
- 左侧菜单区:返回按钮与首页按钮,点击触发 goBack/goHome。
- 标题居中显示,支持单行省略。
- 调试入口:在非正式版且服务端调试开启时,渲染右侧圆点,点击进入调试页。
章节来源
- navbar.wxml(公司版):1-26
样式定义(WXSS)
- 使用 position: fixed 固定导航栏,z-index 保证层级。
- 菜单区域采用 flex 布局,边框与圆角提升视觉一致性。
- 标题绝对定位居中,限制宽度并支持溢出省略。
- 调试圆点通过外层 layer 包裹,避免 fixed 子元素命中范围问题。
章节来源
- navbar.wxss(公司版):1-64
事件处理与生命周期
- 生命周期 lifetimes.attached:
- 判断客户端环境是否为非正式版,并结合服务端调试开关决定是否显示调试入口。
- 事件方法:
- goBack:优先使用传入的 url 跳转,否则调用 navigateBack。
- goHome:切换到首页 tab。
- openDebug:跳转到调试信息页。
sequenceDiagram
participant Page as "页面"
participant Nav as "navbar 组件"
participant WX as "微信API"
Page->>Nav : 渲染组件并传递属性(title, url, showMenu...)
Nav->>Nav : attached() 初始化数据与调试门控
Page->>Nav : 用户点击返回
Nav->>Nav : goBack(e)
alt 存在url
Nav->>WX : douPageTo(url)
else 不存在url
Nav->>WX : wx.navigateBack()
end
Page->>Nav : 用户点击首页
Nav->>WX : wx.switchTab("/pages/index/index")
Page->>Nav : 用户点击调试圆点
Nav->>WX : wx.navigateTo("/pages/debug/debug")
图表来源
- navbar.ts(公司版):53-80
- navbar.ts(默认版):50-77
章节来源
- navbar.ts(公司版):53-80
- navbar.ts(默认版):50-77
复杂逻辑流程图(调试入口门控)
flowchart TD
Start(["组件挂载"]) --> CheckEnv["检查客户端环境<br/>isDebugEnv()"]
CheckEnv --> EnvOK{"是否非正式版?"}
EnvOK --> |否| HideDot["隐藏调试圆点"]
EnvOK --> |是| CheckServer["检查服务端调试开关<br/>isServerDebug()"]
CheckServer --> ServerOK{"是否开启?"}
ServerOK --> |否| HideDot
ServerOK --> |是| ShowDot["显示调试圆点"]
HideDot --> End(["结束"])
ShowDot --> End
图表来源
- navbar.ts(公司版):53-59
- navbar.ts(默认版):50-56
章节来源
- navbar.ts(公司版):53-59
- navbar.ts(默认版):50-56
组件发布与复用机制
- 全局注册:在 app.json 的 usingComponents 中声明组件路径,使所有页面可直接使用 <navbar />。
- 多主题包:default 与 company 两套主题各自维护独立组件与页面,便于品牌化定制。
- 后端启用/切换:MiniprogramService 提供启用、删除、同步配置等方法,支持后台管理小程序包。
flowchart TD
Dev["开发者编写组件"] --> Register["app.json usingComponents 注册"]
Register --> UseInPages["页面直接使用组件标签"]
UseInPages --> Admin["后台启用/切换小程序包"]
Admin --> Sync["MiniprogramService 同步配置/更新"]
图表来源
- app.json(默认版):143-145
- app.json(公司版):143-145
- MiniprogramService.php:139-165
章节来源
- MiniprogramService.php:139-165
- app.json(默认版):143-145
- app.json(公司版):143-145
依赖关系分析
- 组件依赖全局数据:navbar 通过 app.globalData 获取设备相关尺寸,确保跨设备一致。
- 组件依赖工具函数:goBack 使用 utils/ui.js 的 douPageTo 进行统一跳转;调试门控使用 utils/env.js 的环境判断。
- 应用配置依赖:app.json 的 usingComponents 决定组件可用性;tabBar 与 window 配置影响整体 UI。
- 后端服务依赖:MiniprogramService 负责小程序包的管理与配置同步,影响可用主题包与运行时行为。
graph LR
NAV_TS["navbar.ts"] --> GLOBAL["app.globalData"]
NAV_TS --> UTIL_UI["utils/ui.js"]
NAV_TS --> UTIL_ENV["utils/env.js"]
APP_JSON["app.json"] --> NAV_TS
SVC["MiniprogramService"] --> APP_JSON
图表来源
- navbar.ts(公司版):1-82
- app.json(公司版):143-145
- MiniprogramService.php:139-165
章节来源
- navbar.ts(公司版):1-82
- app.json(公司版):143-145
- MiniprogramService.php:139-165
性能考虑
- 减少重绘与回流:
- 使用固定高度的导航栏容器,避免频繁计算高度。
- 标题使用 text-overflow 与 white-space 控制,避免长文本导致布局抖动。
- 条件渲染:
- 调试圆点仅在满足双门控条件时渲染,降低不必要的 DOM 节点。
- 图片资源:
- 菜单图标使用 mode="heightFix" 保持比例,减少缩放开销。
- 全局尺寸缓存:
- 尺寸信息取自 app.globalData,避免重复查询系统信息。
故障排查指南
- 组件未生效:
- 检查 app.json 的 usingComponents 是否正确注册组件路径。
- 返回行为异常:
- 确认传入的 url 是否存在;若为空则回退到 navigateBack。
- 调试圆点不显示:
- 检查客户端环境是否为非正式版,以及服务端调试开关是否开启。
- 主题包切换后样式不一致:
- 确认 MiniprogramService 已执行启用或同步操作,确保 app.json 与资源路径正确。
章节来源
- app.json(默认版):143-145
- app.json(公司版):143-145
- navbar.ts(公司版):53-80
- MiniprogramService.php:139-165
结论
通过 navbar 组件的实践,可以清晰掌握 DouPHP 小程序自定义组件的开发范式:以 JSON 声明组件、以 WXML 组织模板、以 TS 实现属性与事件、以 WXSS 定义样式,并在 app.json 中全局注册以实现复用。结合后端 MiniprogramService 的包管理能力,可实现多主题包的灵活切换与发布。遵循本文的规范与优化建议,能够构建出高内聚、低耦合、易维护的小程序组件体系。
附录
- 完整示例项目路径
- 默认版组件示例:miniprogram/default/components/navbar
- 公司版组件示例:miniprogram/company/components/navbar
- 应用配置参考:miniprogram/default/app.json、miniprogram/company/app.json
- 后端包管理参考:admin/service/miniprogram/MiniprogramService.php