@@ -22,6 +22,8 @@ ui-utils-kit 是一个高效的偏业务前端工具函数库。
2222- ** 海报制作**
2323 将 DOM 元素转换为图片(canvas),支持自动下载或返回 Blob 格式数据。
2424 > 针对跨域图片问题,内置 ` html2canvas ` proxy 解决方案。
25+ - ** 业务工具类函数**
26+ 提供一些常用的业务工具函数,如 JSON 安全解析、敏感信息脱敏等。
2527
2628---
2729
@@ -45,12 +47,14 @@ ui-utils-kit 的工具函数分为三大类:`tree`、`business`、`common`,
4547** 方式一:**
4648``` javascript
4749import { tree } from " ui-utils-kit" ;
50+
4851const result = tree .buildTree (nodes);
4952```
5053
5154** 方式二:**
5255``` javascript
5356import { buildTree } from " ui-utils-kit" ;
57+
5458const result = buildTree (nodes);
5559```
5660
@@ -83,6 +87,9 @@ const result = buildTree(nodes);
8387
8488** ` tree.treeToArr ` ** 将树形数据转换为扁平化数组,便于遍历与处理。
8589
90+ - ** 参数:**
91+ - ` tree ` (` TreeNode ` ):包含 ` id ` 与 ` name ` 、` children ` 的树形结构数据。
92+ - ` node ` (` TreeNode ` ):包含 ` id ` 与 ` pid ` 的节点数据。
8693- ** 示例:**
8794 ``` typescript
8895 import { treeToArr } from ' ui-utils-kit' ;
@@ -96,6 +103,8 @@ const result = buildTree(nodes);
96103
97104** ` tree.updateTreeCheckStatus ` ** 更新树中节点的选中状态(含子节点与父节点联动)。
98105
106+ - ** 参数:**
107+ - ` tree ` (` TreeNode ` ):包含 ` id ` 与 ` name ` 、` children ` 的树形结构数据。
99108- ** 示例:**
100109 ``` typescript
101110 import { updateTreeCheckStatus } from ' ui-utils-kit' ;
@@ -172,7 +181,97 @@ const result = buildTree(nodes);
172181
173182## 🎨 公共通用函数 (common)
174183
175- > 当前暂无公共通用函数,后续版本将持续更新。
184+ ### 1. safeJsonParse< T > (jsonString: string, defaultValue: T ): [Error \| null , T ]
185+
186+ ** 功能描述:** 安全地解析 JSON 字符串,如果解析出错则返回默认值和错误对象。
187+
188+ ** 参数**
189+ - ` jsonString: string` — 要解析的 JSON 格式字符串。
190+
191+ - ` defaultValue: T` — 当解析失败时返回的默认值,类型与期待的解析结果相同。
192+
193+ ** 返回值**
194+ ` [Error | null, T]` — 一个元组:
195+
196+ - 示例
197+ ` ` ` typescript
198+ import { safeJsonParse } from 'ui-utils-kit';
199+
200+ const [err, data] = safeJsonParse('{"foo": 42}', { foo: 0 });
201+ if (err) {
202+ // 处理解析错误
203+ } else {
204+ console.log(data.foo); // 42
205+ }
206+ ` ` `
207+ ### 2. desensitize (value: string, type: " mobile" | " idcard" ): string
208+ ** 功能描述** :对敏感信息(手机号或身份证号)进行脱敏处理,隐藏中间部分。
209+
210+ ** 参数**
211+ - ` value: string` — 原始字符串,如手机号或身份证号。
212+ - ` type: "mobile" \| "idcard"` — 数据类型," mobile" 脱敏手机号," idcard" 脱敏身份证号。
213+
214+ ** 返回值**
215+ string — 脱敏后字符串,如果输入非字符串则返回空字符串。
216+
217+ - 示例
218+ ` ` ` typescript
219+ import { desensitize } from 'ui-utils-kit';
220+
221+ console.log(desensitize('13812345678', 'mobile')); // 输出:138****5678
222+ console.log(desensitize('110105199001011234', 'idcard')); // 输出:110105********1234
223+ ` ` `
224+
225+ ### 3. Mutex 类
226+ 功能描述:模拟互斥锁机制,用于控制异步操作对共享资源的访问,确保同一时刻只有一个操作进入临界区。
227+ > ##### 以下是一些应用场景
228+ > - 防止按钮重复点击:避免用户多次点击同一按钮导致重复网络请求或状态混乱
229+ > - 强制 API 调用顺序:确保一组异步接口按预期顺序依次执行,防止乱序带来的逻辑错误
230+ > - 多标签页 localStorage 访问:在多个浏览器标签或窗口同时操作同一 localStorage 时,避免数据竞争和丢失
231+ > - 分片上传(Chunked Upload):在大文件上传时,按顺序上传每个分片,确保断点续传或失败重试时不会错乱
232+ > - Web Worker 任务同步:在主线程与 Worker 线程之间同步访问共享内存(如 SharedArrayBuffer )时,保证原子性
233+
234+
235+ - 示例
236+
237+ ` ` ` typescript
238+ <template>
239+ <view>
240+ <button @click="onSubmit" :disabled="isSubmitting">
241+ {{ isSubmitting ? '提交中...' : '提交' }}
242+ </button>
243+ </view>
244+ </template>
245+
246+ <script setup lang="ts">
247+ import { ref } from 'vue'
248+ import Mutex from '@/utils/Mutex' // 假设 Mutex 存放在 utils 目录
249+
250+ // 状态变量,无需在 setup 中 return,自动暴露给模板使用
251+ const isSubmitting = ref(false)
252+ // 创建一个互斥锁实例
253+ const submitMutex = new Mutex()
254+
255+ // 点击处理函数
256+ const onSubmit = async () => {
257+ // 获取锁:若已有操作在进行,则挂起后续调用
258+ await submitMutex.lock()
259+ try {
260+ isSubmitting.value = true
261+ // 模拟网络请求
262+ await new Promise<void>(resolve => setTimeout(resolve, 1500))
263+ uni.showToast({ title: '提交成功' })
264+ } catch (err: any) {
265+ uni.showModal({ title: '错误', content: err.message })
266+ } finally {
267+ isSubmitting.value = false
268+ // 释放锁,允许下一次点击
269+ submitMutex.unlock()
270+ }
271+ }
272+ </script>
273+
274+ ` ` `
176275
177276-- -
178277
0 commit comments