文档目录
组件开发指南

简介

本指南面向在 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 中声明组件路径,使所有页面可直接使用 &lt;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
添加日期:2026-10-05