@hlw-uni/mp-vue 2.1.71 → 2.1.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/README.md +230 -386
  2. package/dist/app.d.ts +1 -1
  3. package/dist/core/index.d.ts +3 -0
  4. package/dist/core/{theme.d.ts → theme/index.d.ts} +6 -1
  5. package/dist/hlw.d.ts +1 -10
  6. package/dist/index.d.ts +2 -2
  7. package/dist/index.js +834 -804
  8. package/dist/index.mjs +836 -806
  9. package/dist/utils/ad/index.d.ts +61 -0
  10. package/dist/{composables/utils → utils/common}/index.d.ts +1 -24
  11. package/dist/{composables → utils}/device/index.d.ts +7 -8
  12. package/dist/utils/index.d.ts +5 -0
  13. package/dist/{composables → utils}/navigator/index.d.ts +14 -30
  14. package/dist/{composables → utils}/request/client.d.ts +2 -8
  15. package/dist/{composables → utils}/request/index.d.ts +1 -1
  16. package/dist/{composables → utils}/request/service.d.ts +2 -2
  17. package/package.json +1 -1
  18. package/src/app.ts +2 -2
  19. package/src/components/hlw-add-mini/README.md +56 -9
  20. package/src/components/hlw-add-mini/index.vue +12 -9
  21. package/src/components/hlw-avatar-upload/index.vue +103 -0
  22. package/src/components/hlw-back-top/index.vue +1 -1
  23. package/src/components/hlw-button/index.vue +5 -16
  24. package/src/components/hlw-canvas/index.vue +7 -7
  25. package/src/components/hlw-cell/index.vue +1 -1
  26. package/src/components/{hlw-custom/hlw-custom.vue → hlw-custom-service/hlw-custom-service.vue} +27 -15
  27. package/src/components/hlw-empty/index.vue +14 -0
  28. package/src/components/hlw-header/index.vue +1 -1
  29. package/src/components/hlw-menu/index.vue +40 -37
  30. package/src/components/hlw-nav-bar/index.vue +23 -8
  31. package/src/components/hlw-nickname/index.vue +185 -0
  32. package/src/components/hlw-notice-bar/index.vue +23 -0
  33. package/src/components/hlw-page/index.vue +27 -8
  34. package/src/components/hlw-paging/index.vue +36 -0
  35. package/src/components/hlw-popup/index.vue +23 -0
  36. package/src/components/hlw-reward-ad/index.vue +133 -0
  37. package/src/components/hlw-search/index.vue +25 -0
  38. package/src/components/hlw-sheet/index.vue +1 -1
  39. package/src/components/hlw-status-bar/index.vue +113 -0
  40. package/src/components/hlw-tag/index.vue +22 -0
  41. package/src/core/index.ts +3 -0
  42. package/src/{composables → core}/msg/index.ts +0 -1
  43. package/src/{composables → core}/refs/index.ts +0 -1
  44. package/src/core/theme/index.ts +115 -0
  45. package/src/hlw.ts +1 -21
  46. package/src/index.ts +3 -11
  47. package/src/utils/ad/README.md +114 -0
  48. package/src/utils/ad/index.ts +234 -0
  49. package/src/{composables/utils → utils/common}/index.ts +1 -27
  50. package/src/{composables → utils}/device/index.ts +13 -21
  51. package/src/utils/index.ts +5 -0
  52. package/src/{composables → utils}/navigator/index.ts +30 -31
  53. package/src/{composables → utils}/request/client.ts +3 -11
  54. package/src/{composables → utils}/request/index.ts +1 -1
  55. package/src/{composables → utils}/request/service.ts +5 -6
  56. package/src/{composables → utils}/request/types.ts +0 -1
  57. package/dist/composables/ad/index.d.ts +0 -42
  58. package/dist/composables/index.d.ts +0 -11
  59. package/src/composables/ad/README.md +0 -58
  60. package/src/composables/ad/index.ts +0 -227
  61. package/src/composables/device/README.md +0 -50
  62. package/src/composables/index.ts +0 -38
  63. package/src/composables/msg/README.md +0 -79
  64. package/src/composables/navigator/README.md +0 -71
  65. package/src/composables/refs/README.md +0 -40
  66. package/src/composables/request/README.md +0 -124
  67. package/src/composables/share/README.md +0 -53
  68. package/src/composables/utils/README.md +0 -81
  69. package/src/core/theme.ts +0 -62
  70. /package/dist/{composables → core}/msg/index.d.ts +0 -0
  71. /package/dist/{composables → core}/refs/index.d.ts +0 -0
  72. /package/dist/{composables → core}/share/index.d.ts +0 -0
  73. /package/dist/{composables → utils}/request/adapters/alist.d.ts +0 -0
  74. /package/dist/{composables → utils}/request/adapters/base.d.ts +0 -0
  75. /package/dist/{composables → utils}/request/adapters/cos.d.ts +0 -0
  76. /package/dist/{composables → utils}/request/adapters/index.d.ts +0 -0
  77. /package/dist/{composables → utils}/request/adapters/oss.d.ts +0 -0
  78. /package/dist/{composables → utils}/request/adapters/qiniu.d.ts +0 -0
  79. /package/dist/{composables → utils}/request/types.d.ts +0 -0
  80. /package/src/{composables → core}/share/index.ts +0 -0
  81. /package/src/{composables → utils}/request/adapters/alist.ts +0 -0
  82. /package/src/{composables → utils}/request/adapters/base.ts +0 -0
  83. /package/src/{composables → utils}/request/adapters/cos.ts +0 -0
  84. /package/src/{composables → utils}/request/adapters/index.ts +0 -0
  85. /package/src/{composables → utils}/request/adapters/oss.ts +0 -0
  86. /package/src/{composables → utils}/request/adapters/qiniu.ts +0 -0
package/README.md CHANGED
@@ -1,25 +1,24 @@
1
1
  # @hlw-uni/mp-vue
2
2
 
3
3
  <p align="center">
4
- <img src="https://img.shields.io/badge/version-2.1.59-blue.svg" alt="Version">
5
4
  <img src="https://img.shields.io/badge/vue-3.x-emerald.svg" alt="Vue 3">
6
5
  <img src="https://img.shields.io/badge/typescript-supported-blue.svg" alt="TypeScript">
7
6
  <img src="https://img.shields.io/badge/platform-uni--app-red.svg" alt="uni-app">
8
7
  </p>
9
8
 
10
9
  > **hlw-uni 小程序运行时核心组件与工具包**
11
- > 聚合了 Vue 3 UI 组件库、高精简主题控制、网络请求封装、常用 Composables 工具集。从 `2.0` 起,已全面合并原 `@hlw-uni/mp-core` 的全部能力,实现业务方一处 import,全场景覆盖。
10
+ > 整合了核心 UI 组件库、全局个性化主题控制、高可用网络请求封装、Vue 核心 Hooks 以及常用无状态工具函数。
12
11
 
13
12
  ---
14
13
 
15
- ## 🚀 特性
14
+ ## 特性
16
15
 
17
- - 💪 **现代化架构**基于 Vue 3 Composition API + `<script setup>` 构建。
18
- - 📐 **完整类型系统** — 100% 采用 TypeScript 编写,提供极佳的类型推导与开发体验。
19
- - 📱 **多端小程序适配**面向 uni-app 多端场景(微信、抖音、支付宝等),完美兼容宿主原生组件。
20
- - 🎨 **弹性主题能力**极简而强大的 CSS 变量主题方案,支持页面级和应用级自由注入与重叠扩展。
21
- - 🧩 **按需引入 & 零体积负担** 支持 uni-app `easycom` 自动按需引入,配合 Tree-shaking,业务产物小而美。
22
- - 🛠️ **一键式开发基建**封装了消息、路由、分享、系统设备、请求、高级上传及 BaseService 服务基类,开箱即用。
16
+ - 🚀 **响应式 & 声明式** 全面拥抱 Vue 3 Composition API `<script setup>`。
17
+ - 📐 **完全类型安全** — 100% 采用 TypeScript 编写,提供精确的类型推导与卓越的 IDE 自动补全。
18
+ - 🎨 **动态主题机制**基于 CSS 变量的极简主题管理,支持应用级与页面级动态刷新,自动更新系统导航栏配色。
19
+ - 🔗 **统一导出机制**统一通过 `@hlw-uni/mp-vue` 单一出口导出,无需零散引入,支持高效的 Tree-shaking。
20
+ - 🧩 **easycom 自动按需引入**完美融入 uni-app `easycom` 生态,UI 组件即写即用,零体积负担。
21
+ - 🛠️ **清晰的架构分离**严格划分 `core/`(有状态生命周期 Hooks)与 `utils/`(纯无状态静态工具函数),杜绝代码逻辑耦合。
23
22
 
24
23
  ---
25
24
 
@@ -29,18 +28,16 @@
29
28
 
30
29
  ```bash
31
30
  pnpm add @hlw-uni/mp-vue
32
- # 或者使用 npm / yarn
33
- npm install @hlw-uni/mp-vue
34
31
  ```
35
32
 
36
33
  > [!NOTE]
37
- > **Peer Dependencies**
34
+ > **依赖项要求**
38
35
  > - `vue >= 3.4.0`
39
- > - `pinia >= 2.0.0` (如需使用全局 App 上下文及状态)
36
+ > - `pinia >= 2.0.0` (主题管理状态存储)
40
37
 
41
- ### 2. easycom 组件自动注册
38
+ ### 2. pages.json 自动注册配置
42
39
 
43
- 在业务项目的 `pages.json` 中配置 `easycom`,即可在页面中直接使用 `hlw-` 开头的全部 UI 组件,**无需手动 `import` 和注册**:
40
+ 在业务项目的 `pages.json` 中配置 `easycom`,即可在页面中直接使用 `hlw-` 开头的 UI 组件,**无需手动 import 注册**:
44
41
 
45
42
  ```json
46
43
  {
@@ -58,500 +55,347 @@ npm install @hlw-uni/mp-vue
58
55
 
59
56
  ---
60
57
 
61
- ## 🛠️ 全局应用入口 & `hlw` 命名空间
58
+ ## 🧱 核心设计架构
62
59
 
63
- ### 1. 引导初始化 `useApp()`
60
+ 类库严格区分为 **`core/`**(有状态,依赖 Vue 响应式与生命周期 API)与 **`utils/`**(纯无状态,提供命令式调用及内联支持)两大模块,并在包根目录统一导出:
64
61
 
65
- 在小程序的 `main.ts` 或 `main.js` 中收敛并初始化 Vue 实例:
66
-
67
- ```ts
68
- import { useApp } from '@hlw-uni/mp-vue';
69
- import { createPinia } from 'pinia';
70
- import App from './App.vue';
71
-
72
- const app = useApp();
73
-
74
- // 注册插件
75
- app.use(createPinia());
76
-
77
- // 生成符合 uni-app 约定的 createApp 入口
78
- export const createApp = app.install(App);
79
62
  ```
80
-
81
- ### 2. 全局命名空间单例 `hlw`
82
-
83
- `hlw` 命名空间聚合了框架最核心的工具服务,您可以通过全局或导入的形式方便地访问它们:
84
-
85
- ```ts
86
- import { hlw } from '@hlw-uni/mp-vue';
87
-
88
- // 1. $msg 消息通知
89
- hlw.$msg.toast("操作成功");
90
-
91
- // 2. $device 系统设备信息
92
- console.log(hlw.$device.brand, hlw.$device.platform);
93
-
94
- // 3. $request HTTP 客户端
95
- const res = await hlw.$request.get("/config");
96
-
97
- // 4. $utils 公共工具箱
98
- hlw.$utils.copy("复制的文本");
63
+ mp-vue/src/
64
+ ├── core/ # Vue 核心(有状态,依赖 Vue 响应式与生命周期 API)
65
+ │ ├── theme/ # 个性化主题与外观控制 (useTheme, initTheme)
66
+ │ ├── msg/ # 交互反馈 (useMsg, hlw.$msg)
67
+ │ ├── refs/ # 动态模板 Ref 集合收集 (useRefs)
68
+ │ └── share/ # 小程序页面分享控制 (useShare)
69
+ ├── utils/ # 纯无状态工具集(无生命周期依赖,支持直接/内联调用)
70
+ │ ├── ad/ # 广告控制器 (setAdPopup, showAdPopup, setAdReward, showAdReward)
71
+ │ ├── common/ # 公共工具函数 (copy, paste, saveImageUrl, saveVideoUrl, download 等)
72
+ │ ├── navigator/ # 路由跳转 (navigate, navigateTo, redirectTo, switchTab, reLaunch, navigateBack, navigateToMiniProgram)
73
+ │ ├── device/ # 设备信息获取 (getDevice, getDeviceQuery, clearDeviceCache)
74
+ │ └── request/ # 全局网络请求 (request 单例, useUpload, BaseService 服务基类)
75
+ ├── directives/ # 自定义指令 (vCopy 自动复制指令)
76
+ └── app.ts # 应用根上下文入口 (useApp)
99
77
  ```
100
78
 
101
79
  ---
102
80
 
103
- ## 🎨 样式与主题能力
81
+ ## 🎨 核心模块 (`core/`)
104
82
 
105
- `mp-vue` 内置了基础主题驱动。推荐使用 `useThemePageStyle()` 组合式 API,它会返回一组挂载在页面根节点上的标准化 CSS 变量样式。
83
+ ### 1. 主题与外观管理 — `useTheme()` / `initTheme()`
106
84
 
107
- ### 1. 基础用法
85
+ 提供小程序应用及页面层级的主题、字号、字体风格动态刷新能力,并可自动根据主题深浅调整系统导航栏/状态栏前景色(如 `mono-theme` 与 `color-theme` 自动设为白色前景色):
108
86
 
109
87
  ```vue
110
88
  <script setup lang="ts">
111
- import { useThemePageStyle } from "@hlw-uni/mp-vue";
112
-
113
- const { themePageStyle } = useThemePageStyle();
89
+ import { useTheme } from "@hlw-uni/mp-vue";
90
+
91
+ // 获取当前主题、字号类名、字体类名,以及设置函数
92
+ const {
93
+ theme,
94
+ fontSizeClass,
95
+ fontFamilyClass,
96
+ setFontSize,
97
+ setFontFamily
98
+ } = useTheme();
114
99
  </script>
115
100
 
116
101
  <template>
117
- <!-- 将主题变量样式挂载在最外层容器 -->
118
- <hlw-page :style="themePageStyle" title="主题演示">
119
- <view class="demo-card">体验主题色</view>
102
+ <!-- 将主题相关 CSS Class 应用于页面最外层容器 -->
103
+ <hlw-page :class="[theme, fontSizeClass, fontFamilyClass]" title="主题设置">
104
+ <view class="content">
105
+ <text class="text-demo">当前正使用个性化外观配置</text>
106
+ <button @tap="setFontSize('large')">放大字体</button>
107
+ </view>
120
108
  </hlw-page>
121
109
  </template>
122
-
123
- <style scoped lang="scss">
124
- .demo-card {
125
- color: var(--primary-color);
126
- background: var(--primary-light);
127
- font-size: var(--font-base);
128
- border-radius: var(--radius-md);
129
- }
130
- </style>
131
110
  ```
132
111
 
133
- ### 2. 自由追加 / 覆盖自定义主题变量
112
+ `App.vue` 初始化阶段,可以使用 `initTheme()` 设定初始主题:
134
113
 
135
- 不推荐直接修改组件库源码,您可以在返回的变量基础上动态拼接项目或页面级别的专属主题参数:
114
+ ```ts
115
+ import { initTheme } from "@hlw-uni/mp-vue";
136
116
 
137
- ```vue
138
- <script setup lang="ts">
139
- import { computed } from "vue";
140
- import { useThemePageStyle } from "@hlw-uni/mp-vue";
141
- import { useThemeStore } from "@/store";
142
-
143
- const { themePageStyle } = useThemePageStyle();
144
- const themeStore = useThemeStore();
145
-
146
- const pageStyle = computed(() => {
147
- return [
148
- themePageStyle.value,
149
- `--page-bg: ${themeStore.primaryColor}10`,
150
- `--card-shadow: 0 12rpx 40rpx ${themeStore.primaryColor}22`,
151
- `--brand-text-color: #0f172a`,
152
- ].join(";");
117
+ onLaunch(() => {
118
+ initTheme("mono-theme");
153
119
  });
154
- </script>
155
-
156
- <template>
157
- <hlw-page :style="pageStyle" title="自定义主题">
158
- <view class="custom-card">高度扩展</view>
159
- </hlw-page>
160
- </template>
161
120
  ```
162
121
 
163
- ---
122
+ ### 2. 交互式反馈 — `useMsg()` / 全局 `hlw.$msg`
164
123
 
165
- ## 核心 Composables (工具与服务封装)
166
-
167
- ### 💬 消息提示 — `useMsg()`
168
-
169
- 统一且高度简化的 Toast、Loading 与原生模态弹窗。
124
+ 封装并规整了小程序原生的 Toast、Loading Promise 化的 Modal 确认弹窗。支持在 setup 内部使用 `useMsg()`,亦支持在非 setup 环境中通过全局 `hlw.$msg` 直接调用:
170
125
 
171
126
  ```ts
172
- import { useMsg } from '@hlw-uni/mp-vue';
127
+ import { useMsg, hlw } from "@hlw-uni/mp-vue";
173
128
 
174
129
  const msg = useMsg();
175
130
 
176
131
  // 1. Toast 轻提示
177
- msg.toast("普通消息提示");
132
+ msg.toast("操作成功");
133
+ hlw.$msg.toast("非 setup 阶段直接调用");
134
+
178
135
  msg.success("保存成功");
179
136
  msg.error("提交失败");
180
137
 
181
- // 2. Loading 等待框 (带透明防穿透遮罩)
182
- msg.showLoading("数据加载中...");
183
- // 异步操作结束后关闭
138
+ // 2. Loading 等待框(带遮罩防穿透点击)
139
+ msg.showLoading("数据同步中...");
184
140
  msg.hideLoading();
185
141
 
186
- // 3. Promise 风格确认对话框
187
- const confirmDelete = async () => {
188
- const isOk = await msg.confirm({
189
- title: "高危操作",
190
- content: "确定要彻底删除该项目吗?",
142
+ // 3. Promise 风格确认弹窗
143
+ const handleDelete = async () => {
144
+ const confirm = await msg.confirm({
145
+ title: "安全警告",
146
+ content: "此操作将永久删除该资源,是否继续?",
191
147
  confirmColor: "#ef4444"
192
148
  });
193
- if (isOk) {
194
- // 执行删除...
149
+ if (confirm) {
150
+ // 执行删除操作
195
151
  }
196
152
  };
197
153
  ```
198
154
 
199
- ### 🗺️ 路由跳转 — `useNavigate()`
155
+ ### 3. 小程序页面分享 — `useShare()`
200
156
 
201
- 封装了小程序的各类页面跳转,自带安全的异常捕获和提示,支持打开外部小程序。
202
-
203
- ```ts
204
- import { useNavigate } from '@hlw-uni/mp-vue';
205
-
206
- const router = useNavigate();
207
-
208
- // 基础路由跳转 (保留当前页)
209
- router.to("/pages/detail/index?id=100");
210
-
211
- // 页面重定向 (关闭当前页)
212
- router.redirect("/pages/login/index");
213
-
214
- // 切换 TabBar 页面
215
- router.tab("/pages/mine/index");
216
-
217
- // 干净重启 (关闭所有页面)
218
- router.reLaunch("/pages/index/index");
219
-
220
- // 返回上一页
221
- router.back();
222
- // 返回指定层级
223
- router.back(2);
224
-
225
- // 跳转到其他小程序
226
- router.miniProgram("wx_appid_xxxxx", {
227
- path: "pages/home/index",
228
- envVersion: "release"
229
- });
230
- ```
231
-
232
- ### 📤 微信分享 — `useShare()`
233
-
234
- 优雅地在 `<script setup>` 中配置小程序卡片和朋友圈分享:
157
+ 在 setup 中以声明式极简控制当前页面的微信转发卡片及朋友圈分享配置:
235
158
 
236
159
  ```vue
237
160
  <script setup lang="ts">
238
161
  import { useShare } from "@hlw-uni/mp-vue";
239
162
 
240
- // 直接在 setup 阶段声明,将自动接管页面分享按钮及右上角菜单
163
+ // 声明分享配置,自动劫持当前页面的分享与朋友圈按钮事件
241
164
  useShare({
242
165
  title: "推荐你体验这个超棒的小程序!",
243
- path: "/pages/index/index?from=share",
166
+ path: "/pages/index/index?from=share_button",
244
167
  imageUrl: "https://example.com/share-cover.png"
245
168
  });
246
169
  </script>
247
170
  ```
248
171
 
249
- ### 🌐 网络请求 — `useRequest()` & `BaseService`
172
+ ### 4. 动态模板 Ref 集合 — `useRefs()`
250
173
 
251
- 强大的请求库,完美适配拦截器模式与面向服务的 `BaseService` 设计模式。
174
+ 用于在 `v-for` 循环渲染中动态收集 DOM 节点或组件实例的 Ref 引用:
252
175
 
253
- ```ts
254
- import { useRequest, BaseService, ServicePrefix, ServiceNamespace } from "@hlw-uni/mp-vue";
255
-
256
- const request = useRequest();
257
-
258
- // 1. 配置全局参数
259
- request.setBaseURL("https://api.example.com");
176
+ ```vue
177
+ <script setup lang="ts">
178
+ import { useRefs } from "@hlw-uni/mp-vue";
260
179
 
261
- // 2. 注册拦截器
262
- const cancelReq = request.onRequest((config) => {
263
- config.headers = {
264
- ...config.headers,
265
- "Authorization": `Bearer ${uni.getStorageSync("token")}`,
266
- };
267
- return config;
268
- });
180
+ const { refs, setRef } = useRefs<any>();
269
181
 
270
- // 3. 请求接口示例
271
- interface UserProfile {
272
- nickname: string;
273
- avatar: string;
274
- }
275
- const profile = await request.get<UserProfile>("/user/profile");
276
-
277
- // 4. 面向服务封装 (BaseService)
278
- @ServicePrefix("api")
279
- @ServiceNamespace("member")
280
- class MemberService extends BaseService {
281
- getProfile() {
282
- return this.get<UserProfile>("/profile"); // 自动拼接成 /api/member/profile
182
+ const handleScroll = (index: number) => {
183
+ const targetComponent = refs.value[index];
184
+ if (targetComponent) {
185
+ // 调用组件实例上的方法
186
+ targetComponent.scrollIntoView();
283
187
  }
284
- }
188
+ };
189
+ </script>
285
190
 
286
- export const memberService = new MemberService();
191
+ <template>
192
+ <view v-for="(item, index) in list" :key="item.id">
193
+ <custom-item :ref="el => setRef(el, index)" />
194
+ </view>
195
+ </template>
287
196
  ```
288
197
 
289
198
  ---
290
199
 
291
- ## 🧩 核心 UI 组件库说明
292
-
293
- `@hlw-uni/mp-vue` 内置了多达 27 个高频易用组件。以下重点介绍核心高频组件的 API 与用法。
200
+ ## 🛠️ 纯无状态工具集 (`utils/`)
294
201
 
295
- ### 🏢 1. 页面容器组件 — `hlw-page`
202
+ ### 1. 路由与导航跳转 — `navigator`
296
203
 
297
- 所有页面的根容器,支持自定义页头、自定义页脚、完美控制滚动区域,并通过 `provide` 驱动子组件(如 `hlw-back-top`)。
204
+ 全面接管 uni-app 原生路由 API,内置路由降级、安全异常捕获与失败自动提示。
298
205
 
299
- #### Props
206
+ ```ts
207
+ import {
208
+ navigateTo,
209
+ redirectTo,
210
+ switchTab,
211
+ reLaunch,
212
+ navigateBack,
213
+ navigateToMiniProgram
214
+ } from "@hlw-uni/mp-vue";
215
+
216
+ // 保留当前页,跳转至指定路径
217
+ navigateTo("/pages/detail/index?id=123");
218
+
219
+ // 关闭当前页,重定向跳转
220
+ redirectTo("/pages/auth/login");
221
+
222
+ // 切换至 TabBAR 导航页
223
+ switchTab("/pages/home/index");
224
+
225
+ // 关闭所有页面,重启并打开指定页
226
+ reLaunch("/pages/index/index");
227
+
228
+ // 返回上级页面(默认 1 层)
229
+ navigateBack();
230
+ navigateBack(2); // 返回上两级页面
231
+
232
+ // 打开外部小程序
233
+ navigateToMiniProgram("wxxxxxxxxx", {
234
+ path: "pages/main/index",
235
+ envVersion: "release"
236
+ });
237
+ ```
300
238
 
301
- | 属性名 | 类型 | 默认值 | 说明 |
302
- | :--- | :--- | :--- | :--- |
303
- | `title` | `string` | `""` | 页面标题,设置后渲染默认页头 `hlw-header` |
304
- | `isBack` | `boolean` | `false` | 是否显示返回按钮 |
305
- | `bgClass` | `string` | `""` | 传递给 `hlw-header` 的背景 class |
306
- | `bodyClass` | `string \| object \| array` | `""` | 内层 body 的 class,常用于设置 flex 或 gap 间距 |
307
- | `bodyStyle` | `string \| object` | `""` | 内层 body 的自定义样式 |
239
+ ### 2. 网络请求封装 `request` & `BaseService`
308
240
 
309
- #### 示例
241
+ 高性能的 HTTP 请求客户端,支持多拦截器链、自动携带设备头信息、对象服务化组织等。
310
242
 
311
- ```vue
312
- <template>
313
- <hlw-page title="用户设置" :is-back="true" body-class="p-4 gap-4">
314
- <!-- 自定义页头 (可选) -->
315
- <template #header>
316
- <view class="custom-header">自定义头部</view>
317
- </template>
318
-
319
- <!-- 页面内容 -->
320
- <view class="setting-list">
321
- <view>选项一</view>
322
- </view>
323
-
324
- <!-- 底部悬浮/固定栏 (不随页面滚动) -->
325
- <template #footer>
326
- <view class="footer-bar">
327
- <hlw-button block>保存修改</hlw-button>
328
- </view>
329
- </template>
330
- </hlw-page>
331
- </template>
332
- ```
243
+ ```ts
244
+ import { request, BaseService, ServicePrefix, ServiceNamespace } from "@hlw-uni/mp-vue";
333
245
 
334
- ---
246
+ // 1. 全局基础 URL 配置
247
+ request.setBaseURL("https://api.hlw.com");
335
248
 
336
- ### 🔘 2. 语义化按钮 — `hlw-button`
249
+ // 2. 配置请求/响应拦截器
250
+ request.onRequest((config) => {
251
+ config.headers = {
252
+ ...config.headers,
253
+ "Authorization": `Bearer ${uni.getStorageSync("token")}`
254
+ };
255
+ return config;
256
+ });
337
257
 
338
- 在原生按钮的基础上进行了大幅功能扩展,支持语义化配色、一键路由跳转、以及极简适配小程序的原生开放能力。
258
+ // 3. 直接调用 API
259
+ const data = await request.get("/user/info");
339
260
 
340
- #### Props
261
+ // 4. 面向服务组织封装(基类配合装饰器)
262
+ @ServicePrefix("v1")
263
+ @ServiceNamespace("order")
264
+ class OrderService extends BaseService {
265
+ getList(page: number) {
266
+ // 自动拼接为: /v1/order/list
267
+ return this.get("/list", { page });
268
+ }
269
+ }
270
+ export const orderService = new OrderService();
271
+ ```
341
272
 
342
- | 属性名 | 类型 | 默认值 | 说明 |
343
- | :--- | :--- | :--- | :--- |
344
- | `type` | `ButtonType` | `"primary"` | 按钮类型,可选 `primary \| success \| warning \| danger \| error \| info \| outline \| text \| ghost` |
345
- | `size` | `"small" \| "medium" \| "large"` | `"medium"` | 按钮尺寸 |
346
- | `loading` | `boolean` | `false` | 是否开启加载状态,开启后按钮禁用并展示 Spinner |
347
- | `disabled` | `boolean` | `false` | 是否禁用按钮 |
348
- | `block` | `boolean` | `false` | 是否独占整行(宽度 100%) |
349
- | `round` | `boolean` | `false` | 是否为高圆角胶囊形态 |
350
- | `icon` | `string` | `""` | 按钮图标类名 |
351
- | `bgColor` | `string` | `""` | 自定义背景颜色(覆盖 type) |
352
- | `textColor` | `string` | `""` | 自定义文字颜色 |
353
- | `url` | `string` | `""` | 快捷页面跳转目标地址 |
354
- | `navigateType` | `NavigateType` | `"navigateTo"` | 路由方式,可选 `navigateTo \| redirectTo \| switchTab \| reLaunch \| navigateBack` |
355
- | `openType` | `string` | `""` | 小程序原生的开放动作类型,如 `share`, `contact`, `getPhoneNumber` 等 |
273
+ ### 3. 微信广告控制助手 `ad`
356
274
 
357
- #### 示例
275
+ 高度优化的插屏与激励视频广告助手,支持提前静默异步预加载、防止回调重叠、自动管理加载状态。
358
276
 
359
- ```vue
360
- <!-- 1. 基础语义按钮 -->
361
- <hlw-button type="success" round>成功按钮</hlw-button>
277
+ ```ts
278
+ import { setAdPopup, showAdPopup, setAdReward, showAdReward } from "@hlw-uni/mp-vue";
362
279
 
363
- <!-- 2. 加载态 -->
364
- <hlw-button type="danger" :loading="true">提交中</hlw-button>
280
+ // 1. 插屏广告配置与延迟展示
281
+ setAdPopup("adunit-popup-xxxx");
282
+ await showAdPopup(2000); // 延迟 2000ms 自动展示已加载的插屏广告
365
283
 
366
- <!-- 3. 路由快捷跳转 -->
367
- <hlw-button type="outline" url="/pages/mine/index" navigate-type="switchTab">去我的主页</hlw-button>
284
+ // 2. 激励视频广告配置(完美支持 Promise 化播放状态响应)
285
+ setAdReward("adunit-reward-xxxx", (res) => {
286
+ if (res.ok && res.isEnded) {
287
+ // 成功播放完毕,在此分发业务奖励
288
+ }
289
+ });
368
290
 
369
- <!-- 4. 原生分享触发 -->
370
- <hlw-button type="primary" open-type="share" icon="i-fa6-solid-share">分享给好友</hlw-button>
291
+ // 立即唤起激励视频广告播放
292
+ const res = await showAdReward(() => {
293
+ // 广告拉起成功回调,可用于关闭页面的 Loading 等待框
294
+ });
371
295
  ```
372
296
 
373
- ---
374
-
375
- ### 📋 3. 高级菜单组件 — `hlw-menu`
376
-
377
- 高度可定制的数据驱动菜单组件,支持列表模式和宫格网格模式。高度适配微信小程序的客服、获取手机号等 `openType` 功能。
297
+ ### 4. 设备与系统元数据 — `device`
378
298
 
379
- #### Props
299
+ 标准化、可缓存的高效设备元数据获取。消除了不同端、不同版本小程序获取系统属性的 API 碎片化问题。
380
300
 
381
- | 属性名 | 类型 | 默认值 | 说明 |
382
- | :--- | :--- | :--- | :--- |
383
- | `items` | `HlwMenuItem[]` | `[]` | 菜单数据列表 |
384
- | `title` | `string` | `""` | 卡片标题,有值时在菜单上方展示标题及分割线 |
385
- | `mode` | `"list" \| "grid"` | `"list"` | 布局模式,可选列表或宫格模式 |
386
- | `columns` | `number` | `4` | 宫格列数,仅在 `mode="grid"` 时有效 |
387
- | `border` | `boolean` | `true` | 是否展示卡片容器外边框 |
301
+ ```ts
302
+ import { getDevice, getDeviceQuery } from "@hlw-uni/mp-vue";
388
303
 
389
- #### `HlwMenuItem` 参数定义
304
+ // 获取标准化设备数据结构
305
+ const device = getDevice();
306
+ console.log(device.platform, device.device_brand, device.system);
390
307
 
391
- ```ts
392
- interface HlwMenuItem {
393
- icon: string; // 图标 class
394
- iconTheme?: string; // 图标色彩主题:orange, purple, wechat, blue, slate 等
395
- label: string; // 菜单标签文案
396
- url?: string; // 跳转链接,配置后点击自动跳转,无需绑定 click 事件
397
- value?: string; // 右侧纯文本(仅列表模式)
398
- tag?: string; // 右侧彩色标签/右上角徽标
399
- tagTheme?: string; // 标签颜色:rose, orange, blue, wechat, red
400
- tagPulse?: boolean; // 标签是否具有呼吸呼吸灯闪烁动画
401
- loading?: boolean; // 是否展示加载状态
402
- visible?: boolean; // 是否渲染该子项,控制动态显隐
403
- openType?: string; // 小程序原生 open-type 动作
404
- }
308
+ // 获取已转化为 URL-encoded 参数的设备数据,常用于拼接到请求 Query 头中
309
+ const queryStr = getDeviceQuery();
405
310
  ```
406
311
 
407
- #### 示例
312
+ ### 5. 公共工具库 — `common`
408
313
 
409
- ```vue
410
- <script setup lang="ts">
411
- import type { HlwMenuItem } from "@hlw-uni/mp-vue";
412
-
413
- const serviceMenus: HlwMenuItem[] = [
414
- { icon: "i-fa6-solid-user", label: "个人资料", url: "/pages/profile/index", iconTheme: "blue" },
415
- { icon: "i-fa6-solid-bell", label: "系统通知", value: "未读 3 条", iconTheme: "orange", tag: "HOT", tagPulse: true },
416
- { icon: "i-fa6-solid-headset", label: "在线客服", openType: "contact", iconTheme: "wechat" },
417
- { icon: "i-fa6-solid-gear", label: "设置中心", url: "/pages/setting/index", iconTheme: "slate" },
418
- ];
419
- </script>
314
+ 包含系统剪贴板交互、支持权限预检测的多媒体资源(图片、视频)一键下载并保存到系统相册等实用工具。
420
315
 
421
- <template>
422
- <!-- 列表模式 -->
423
- <hlw-menu title="我的服务" :items="serviceMenus" />
424
-
425
- <!-- 宫格模式 (4列) -->
426
- <hlw-menu mode="grid" :columns="4" :items="serviceMenus" class="mt-4" />
427
- </template>
316
+ ```ts
317
+ import {
318
+ copy,
319
+ paste,
320
+ saveImageUrl,
321
+ saveVideoUrl,
322
+ toQuery,
323
+ withQuery
324
+ } from "@hlw-uni/mp-vue";
325
+
326
+ // 1. 剪贴板读取与写入
327
+ await copy("复制的内容", true); // 第二参数决定是否弹出“复制成功”提示
328
+ const text = await paste();
329
+
330
+ // 2. 保存网络多媒体资源至手机相册(自动拦截未授权状态,弹出引导设置提示)
331
+ const successImg = await saveImageUrl("https://img.hlw.com/logo.jpg");
332
+ const successVideo = await saveVideoUrl("https://img.hlw.com/video.mp4");
333
+
334
+ // 3. 安全 URL 参数拼接
335
+ const newUrl = withQuery("/pages/index", "id=1&name=hlw");
336
+ const query = toQuery({ id: 1, name: "hlw", temp: null }); // "id=1&name=hlw"
428
337
  ```
429
338
 
430
339
  ---
431
340
 
432
- ### 📄 4. 分页滚动包装容器 `hlw-paging`
341
+ ## 自定义 Vue 指令 (`directives`)
433
342
 
434
- 基于优秀的 `z-paging` 深度封装,极简整合了主题加载态(`hlw-loading`)和空状态(`hlw-empty`),提供更加一体化和顺滑的无缝滚动加载体验。
343
+ ### `v-copy` 点击复制指令
435
344
 
436
- #### Props
437
-
438
- | 属性名 | 类型 | 默认值 | 说明 |
439
- | :--- | :--- | :--- | :--- |
440
- | `loadingText` | `string` | `"加载中..."` | 加载提示文案 |
441
- | `emptyText` | `string` | `"暂无数据"` | 空状态提示文案 |
442
- | `emptyImage` | `string` | `""` | 自定义空状态图片地址 |
443
- | `useDefaultLoading` | `boolean` | `true` | 是否使用内置的 `hlw-loading` 插槽 |
444
- | `useDefaultEmpty` | `boolean` | `true` | 是否使用内置的 `hlw-empty` 插槽 |
445
-
446
- #### 示例
345
+ 在模板标签上声明此指令,点击元素即可自动将绑定值复制到手机系统剪贴板,并触发微提示,无需绑定多余事件:
447
346
 
448
347
  ```vue
449
- <script setup lang="ts">
450
- import { ref } from "vue";
451
- import type { HlwPagingRef } from "@hlw-uni/mp-vue";
452
-
453
- interface Article {
454
- id: number;
455
- title: string;
456
- }
457
-
458
- const paging = ref<HlwPagingRef<Article> | null>(null);
459
- const dataList = ref<Article[]>([]);
460
-
461
- const onQuery = async (pageNo: number, pageSize: number) => {
462
- try {
463
- const res = await fetchArticleList({ page: pageNo, limit: pageSize });
464
- // 渲染并控制页数判定
465
- paging.value?.completeByNoMore(res.list, res.list.length < pageSize);
466
- } catch (err) {
467
- paging.value?.completeByError(err);
468
- }
469
- };
470
- </script>
471
-
472
348
  <template>
473
- <hlw-paging
474
- ref="paging"
475
- v-model="dataList"
476
- loading-text="同步文章列表中"
477
- empty-text="还没有发表任何文章"
478
- @query="onQuery"
479
- >
480
- <view v-for="item in dataList" :key="item.id" class="article-item p-4 border-b">
481
- {{ item.title }}
482
- </view>
483
- </hlw-paging>
349
+ <view class="user-info">
350
+ <!-- 点击直接复制 ID 文本 -->
351
+ <text v-copy="userId" class="uid-text">用户ID: {{ userId }}</text>
352
+ </view>
484
353
  </template>
485
354
  ```
486
355
 
487
356
  ---
488
357
 
489
- ## 📂 27个 UI 组件完整索引
358
+ ## 📦 easycom UI 组件全景索引 (27个内置组件)
490
359
 
491
- 为了使开发者了解所有可用的 UI 资产,以下是 `@hlw-uni/mp-vue` 内置的 27 个组件的完整全景列表:
360
+ 以下为 `@hlw-uni/mp-vue` 内置的部分核心 UI 组件简表:
492
361
 
493
- | 组件目录 | 组件名称 | 适用场景及简要说明 |
362
+ | 组件名称 | 目录定位 | 说明 |
494
363
  | :--- | :--- | :--- |
495
- | 🎬 `hlw-ad` | 广告展示 | 对小程序原生 `<ad>` 的封装,支持信息流/Banner广告等 |
496
- | 📲 `hlw-add-mini` | 添加提示 | 引导用户点击小程序右上角“添加到我的小程序”的气泡提示 |
497
- | 👤 `hlw-avatar` | 用户头像 | 支持图片头像,加载失败时自动降级渲染文字首字母占位 |
498
- | 🔝 `hlw-back-top` | 返回顶部 | 自动监听页面滚动并展示悬浮按钮,支持平滑的一键回顶 |
499
- | 🔘 `hlw-button` | 语义化按钮 | 支持多种语义色彩、尺寸档位、路由快捷跳转与原生开放动作 |
500
- | 🎨 `hlw-canvas` | 海报绘制 | 用于快捷生成小程序分享海报的 Canvas 画布包装工具 |
501
- | 📦 `hlw-card` | 卡片容器 | 带有微阴影与圆角的高质感布局容器,常用于聚合业务块 |
502
- | 🏷️ `hlw-card-header` | 卡片头部 | 专门为卡片组件设计的标题栏,支持小装饰线条和动作插槽 |
503
- | 🗂️ `hlw-cell` | 单元格 | 规范的列表项组件,支持图标、标题、副标题与右侧各种扩展插槽 |
504
- | 🧩 `hlw-custom` | 自定义容器 | 统一规范的多用途自定义包装外框 |
505
- | `hlw-divider` | 分割线 | 带文字或纯线条的排版分割线 |
506
- | 🏜️ `hlw-empty` | 空状态 | 精美质感的空态图标及提示文案,支持挂载自定义引导动作按钮 |
507
- | 🧭 `hlw-header` | 自定义导航栏 | 对小程序原生导航栏的完美替代,支持沉浸式状态栏与返回动作 |
508
- | 🖼️ `hlw-image` | 增强图片 | 支持平滑过渡加载效果、支持懒加载及骨架图占位的 Image 增强版 |
509
- | 🔄 `hlw-loading` | 加载指示器 | 统一风格的加载转圈动效及文案提示 |
510
- | 🍔 `hlw-menu` | 多功能菜单 | 数据驱动,列表模式/宫格模式自由切换,高度适配 `openType` |
511
- | 💬 `hlw-modal` | 模态弹窗 | 轻量的确认与提示弹窗组件 |
512
- | 📢 `hlw-notice-bar` | 滚动通告栏 | 经典的横向滚动滚动条,用于突发通告、重要广播等 |
513
- | 🎁 `hlw-notice-popup` | 通告弹窗 | 页面初始化时弹出的卡片式全局公告、优惠券或活动图 |
514
- | 🏢 `hlw-page` | 页面核心骨架 | 收敛顶部导航栏、底部固定栏与中间高度自适应页面的核心基础件 |
515
- | 📜 `hlw-paging` | 分页滚动组件 | 基于 `z-paging` 深度打通,无缝管理下拉刷新与上拉加载 |
516
- | 🎪 `hlw-popup` | 基础弹窗 | 支持上、下、中等各种方位的轻量级弹窗蒙层容器 |
517
- | 🔍 `hlw-search` | 搜索栏 | 高颜值的小程序搜索输入框,支持一键清空、聚焦回调等 |
518
- | 🗃️ `hlw-sheet` | 动作面板 | 从页面底部升起的动作面板或选项操作菜单 (Action Sheet) |
519
- | 💀 `hlw-skeleton` | 骨架屏 | 高质感微光渐变波纹效果的占位加载骨架屏 |
520
- | 📑 `hlw-tabs` | 横向选项卡 | 自动计算高亮的切换栏,支持文字或含数字徽标的选项 |
521
- | 🔖 `hlw-tag` | 标签 | 多种色彩、填充模式(实心、镂空)的小标签 |
364
+ | **`hlw-page`** | `components/hlw-page` | **核心页面骨架组件**。统一承载页面导航、滚动视图区与底部固定栏。 |
365
+ | **`hlw-button`** | `components/hlw-button` | **语义化增强按钮**。支持路由快捷绑定、状态机 loading 及小程序开放能力。 |
366
+ | **`hlw-paging`** | `components/hlw-paging` | **高性能分页滚动容器**。基于 z-paging 整合内置 loading 和空状态。 |
367
+ | **`hlw-header`** | `components/hlw-header` | **自定义沉浸式导航栏**。支持各类自定义动作、按钮与插槽。 |
368
+ | **`hlw-avatar`** | `components/hlw-avatar` | **增强用户头像**。图片加载失败时自动平滑降级显示文字首字母。 |
369
+ | **`hlw-skeleton`** | `components/hlw-skeleton` | **渐变骨架占位屏**。带优雅扫光动画效果的 UI 占位图。 |
370
+ | **`hlw-loading`** | `components/hlw-loading` | **组件级加载指示器**。统一的高品质微动效 loading。 |
371
+ | **`hlw-empty`** | `components/hlw-empty` | **通用空状态面板**。内置优雅插图,支持各种状态文案定制。 |
372
+ | **`hlw-popup`** | `components/hlw-popup` | **弹窗基类容器**。支持上、下、中等各种动画过渡的全局蒙层容器。 |
373
+ | **`hlw-tabs`** | `components/hlw-tabs` | **滚动标签页选项卡**。自动平滑计算高亮下滑线位置。 |
374
+ | **`hlw-tag`** | `components/hlw-tag` | **语义标签组件**。内置多种主题颜色、胶囊型及镂空风格。 |
522
375
 
523
376
  ---
524
377
 
525
- ## 💻 本地开发与贡献说明
378
+ ## 💻 团队本地开发说明
526
379
 
527
- 若您需要对 `@hlw-uni/mp-vue` 库进行二次开发、修补或提交贡献,可按如下流程进行:
380
+ 若您需要参与本组件库的修改、维护与新特性迭代,请遵循以下工程流程:
528
381
 
529
- ### 1. 启动监听式构建 (开发模式)
382
+ ### 1. 启动热编译 (Watch Mode)
530
383
 
531
384
  ```bash
532
385
  pnpm dev
533
- # 此时 vite 会监听 src 下所有文件的变动,并自动热重构同步到 dist 目录
534
386
  ```
387
+ 此时 Vite 将启动监听构建,自动将 `src/` 的变更即时打包同步至 `dist/` 临时构建目录,使本地消费链路保持实时更新。
535
388
 
536
- ### 2. 生成生产包
389
+ ### 2. 生成生产级分发包
390
+
391
+ 在合并主分支或发版前,须执行生产级打包编译,产出经高度优化、体积极致压缩且带全量类型定义的包产物:
537
392
 
538
393
  ```bash
539
394
  pnpm build
540
- # 将生成高度优化、体积极致精简的 CommonJS、ESModule 以及 .d.ts 类型声明产物
541
- ```
542
-
543
- ### 3. 构建产物结构
544
-
545
- ```
546
- mp-vue/
547
- ├── dist/
548
- │ ├── index.js # CommonJS 格式产物
549
- │ ├── index.mjs # ESModule 格式产物 (供现代打包器 Tree-shaking 使用)
550
- │ └── index.d.ts # 自动生成的 TS 全量类型声明文件
551
395
  ```
552
396
 
553
397
  ---
554
398
 
555
- ## 📄 开源协议
399
+ ## 📄 许可声明
556
400
 
557
- **内部私有组件库**,仅供 `hlw-uni` 项目组内部及关联方协作使用,未经授权请勿分发或公开上传至公共 NPM 镜像。
401
+ 本仓库为**内部私有组件库**。仅授权应用于 `hlw-uni` 关联小程序的协作与业务研发。未经许可,严禁分发或公开上传至公共 NPM 仓库或共享平台。