lyb-js 1.4.2 → 1.5.0

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.
@@ -0,0 +1,51 @@
1
+ /** @description 类属性监听器
2
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsClassObservable-类属性监听器
3
+ */
4
+ export declare class LibJsClassObservable<T extends Record<string, any>> {
5
+ /** 可监听的对象 */
6
+ private data;
7
+ /** 监听器 */
8
+ private listeners;
9
+ /** 监听函数索引ID */
10
+ private index;
11
+ /**
12
+ * @param initialData 监听的数据
13
+ */
14
+ constructor(initialData: T);
15
+ /** @description 获取值、
16
+ * @param key 要获取的键
17
+ * @returns 对应的值
18
+ */
19
+ getValue<K extends keyof T>(key: K): T[K];
20
+ /** @description 设置值
21
+ * @param key 要设置的键
22
+ * @param value 要设置的值
23
+ * @param immediately 是否立即通知监听器
24
+ * @returns 设置后的值
25
+ */
26
+ setValue<K extends keyof T, V extends T[K]>(key: K, value: V, immediately?: boolean): V;
27
+ /** @description 监听值
28
+ * @param key 要监听的键
29
+ * @param callback 回调函数
30
+ * @param immediately 是否立即触发一次回调函数
31
+ * @returns 取消监听的函数
32
+ */
33
+ onValue<K extends keyof T>(key: K, callback: (newValue: T[K], oldValue: T[K]) => void, immediately?: boolean): () => void;
34
+ /** @description 触发某个键名的所有回调函数,适用于同时监听了多个值的场景,用于切换要显示的值,或者延迟在特定时机通知监听器
35
+ * @param key 要触发的键名
36
+ * @returns 触发的键值
37
+ */
38
+ updateFake<K extends keyof T>(key: K): T[K];
39
+ /** @description 数字类型的键值累加或累减
40
+ * @param key 要累加或累减的键
41
+ * @param type 要累加还是要累减
42
+ * @param value 要累加或累减的值
43
+ * @param immediately 是否立即通知监听器
44
+ */
45
+ setNumberValue<K extends keyof T>(key: K, type: "add" | "sub", value?: number, immediately?: boolean): number;
46
+ /** @description 针对布尔类型的键值取反
47
+ * @param key 要取反的键
48
+ * @param immediately 是否立即通知监听器
49
+ */
50
+ setBooleanValue<K extends keyof T>(key: K, immediately?: boolean): boolean;
51
+ }
@@ -0,0 +1,93 @@
1
+ import { libJsDecimal } from "../Math/LibJsDecimal";
2
+ /** @description 类属性监听器
3
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsClassObservable-类属性监听器
4
+ */
5
+ export class LibJsClassObservable {
6
+ /**
7
+ * @param initialData 监听的数据
8
+ */
9
+ constructor(initialData) {
10
+ /** 监听器 */
11
+ this.listeners = new Map();
12
+ /** 监听函数索引ID */
13
+ this.index = 0;
14
+ this.data = Object.assign({}, initialData);
15
+ }
16
+ /** @description 获取值、
17
+ * @param key 要获取的键
18
+ * @returns 对应的值
19
+ */
20
+ getValue(key) {
21
+ return this.data[key];
22
+ }
23
+ /** @description 设置值
24
+ * @param key 要设置的键
25
+ * @param value 要设置的值
26
+ * @param immediately 是否立即通知监听器
27
+ * @returns 设置后的值
28
+ */
29
+ setValue(key, value, immediately = true) {
30
+ var _a;
31
+ const oldValue = this.data[key];
32
+ if (oldValue === value)
33
+ return value;
34
+ this.data[key] = value;
35
+ immediately &&
36
+ ((_a = this.listeners.get(key)) === null || _a === void 0 ? void 0 : _a.forEach((fn) => fn(value, oldValue)));
37
+ return value;
38
+ }
39
+ /** @description 监听值
40
+ * @param key 要监听的键
41
+ * @param callback 回调函数
42
+ * @param immediately 是否立即触发一次回调函数
43
+ * @returns 取消监听的函数
44
+ */
45
+ onValue(key, callback, immediately = true) {
46
+ const id = this.index++;
47
+ if (!this.listeners.has(key)) {
48
+ this.listeners.set(key, new Map());
49
+ }
50
+ this.listeners.get(key).set(id, callback);
51
+ immediately && callback(this.data[key], this.data[key]);
52
+ return () => {
53
+ this.listeners.get(key).delete(id);
54
+ };
55
+ }
56
+ /** @description 触发某个键名的所有回调函数,适用于同时监听了多个值的场景,用于切换要显示的值,或者延迟在特定时机通知监听器
57
+ * @param key 要触发的键名
58
+ * @returns 触发的键值
59
+ */
60
+ updateFake(key) {
61
+ var _a;
62
+ const value = this.data[key];
63
+ (_a = this.listeners.get(key)) === null || _a === void 0 ? void 0 : _a.forEach((fn) => fn(value, value));
64
+ return value;
65
+ }
66
+ /** @description 数字类型的键值累加或累减
67
+ * @param key 要累加或累减的键
68
+ * @param type 要累加还是要累减
69
+ * @param value 要累加或累减的值
70
+ * @param immediately 是否立即通知监听器
71
+ */
72
+ setNumberValue(key, type, value = 1, immediately = true) {
73
+ let v;
74
+ if (type === "add") {
75
+ v = libJsDecimal(this.data[key], value, "+");
76
+ this.setValue(key, v, immediately);
77
+ }
78
+ else {
79
+ v = libJsDecimal(this.data[key], value, "-");
80
+ this.setValue(key, v, immediately);
81
+ }
82
+ return v;
83
+ }
84
+ /** @description 针对布尔类型的键值取反
85
+ * @param key 要取反的键
86
+ * @param immediately 是否立即通知监听器
87
+ */
88
+ setBooleanValue(key, immediately = true) {
89
+ const v = !this.data[key];
90
+ this.setValue(key, v, immediately);
91
+ return v;
92
+ }
93
+ }
@@ -1,5 +1,5 @@
1
- /** @description 事件管理器
2
- * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件管理器
1
+ /** @description 事件发射器
2
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件发射器
3
3
  */
4
4
  export declare const LibJsEmitter: <T extends Record<string, any>>() => {
5
5
  on: <K extends keyof T>(event: K, listener: T[K] extends any[] ? (...args: T[K]) => void : (arg: T[K]) => void) => void;
@@ -1,5 +1,5 @@
1
- /** @description 事件管理器
2
- * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件管理器
1
+ /** @description 事件发射器
2
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件发射器
3
3
  */
4
4
  export const LibJsEmitter = () => {
5
5
  const _eventMap = new Map();
package/README.md CHANGED
@@ -145,7 +145,9 @@ console.log(t); //"string"
145
145
 
146
146
  \- [LibJsNumberStepper-数字步进器](#LibJsNumberStepper-数字步进器)
147
147
 
148
- \- [LibJsEmitter-事件管理器](#LibJsEmitter-事件管理器)
148
+ \- [LibJsEmitter-事件发射器](#LibJsEmitter-事件发射器)
149
+
150
+ \- [LibJsClassObservable-类属性监听器](#LibJsClassObservable-类属性监听器)
149
151
 
150
152
 
151
153
  ### Random-随机
@@ -565,7 +567,7 @@ stepper.updateIndex(5); // 更新索引为5
565
567
  stepper.down("sub"); // 索引减1
566
568
  ```
567
569
 
568
- ### LibJsEmitter-事件管理器
570
+ ### LibJsEmitter-事件发射器
569
571
 
570
572
  > 发布-订阅模式
571
573
 
@@ -592,6 +594,56 @@ $bus.off("play");
592
594
  $bus.off("stop");
593
595
  ```
594
596
 
597
+ ### LibJsClassObservable-类属性监听器
598
+
599
+ > 监听`class`的属性值更改
600
+
601
+ ```ts
602
+ import { LibJsClassObservable } from "@/utils/LibJsClassObservable";
603
+
604
+ export type WinTextType = "luck" | "win" | "reset";
605
+
606
+ interface Static {
607
+ /** 用户ID */
608
+ userID: number;
609
+ /** 是否为学生 */
610
+ sdutent: boolean;
611
+ /** 年龄 */
612
+ age: number;
613
+ }
614
+
615
+ /** @description 静态数据 */
616
+ export class DataStore extends LibJsClassObservable<Static> {
617
+ constructor() {
618
+ super({
619
+ userID: 0,
620
+ sdutent: true,
621
+ age: 18,
622
+ });
623
+ }
624
+ }
625
+
626
+ const dataStore = new DataStore()
627
+
628
+ //获取
629
+ const userID = dataStore.getValue("userID"); //0
630
+
631
+ //更改
632
+ const userID = dataStore.setValue("userID", 1); //1
633
+
634
+ //Boolean 类型取反
635
+ const stdutent = dataStore.setBooleanValue("sdutent"); //false
636
+
637
+ //数字类型累加
638
+ const stdutent = dataStore.setNumberValue("age"); //19
639
+
640
+ //手动触发指定属性监听的所有回调,配合 setValue 第三参数为false,即不自动触发监听的时候,可手动触发
641
+ dataStore.setValue("userID", 3, false);
642
+ setTimeout(()=>{
643
+ dataStore.updateFake("userID");
644
+ }, 1000)
645
+ ```
646
+
595
647
  ## Random-随机
596
648
 
597
649
  ### LibJsProbabilityResult-概率触发
package/libJs.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { LibJsNumberStepper } from "./Misc/LibJsNumberStepper";
2
+ import { LibJsClassObservable } from "./Misc/LibJsClassObservable";
2
3
  /** @description 基础方法 */
3
4
  export declare const Base: {
4
5
  /**
@@ -243,14 +244,6 @@ export declare const Misc: {
243
244
  * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNumberStepper-数字步进器
244
245
  */
245
246
  LibJsNumberStepper: typeof LibJsNumberStepper;
246
- /** @description 事件管理器
247
- * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件管理器
248
- */
249
- LibJsEmitter: <T extends Record<string, any>>() => {
250
- on: <K extends keyof T>(event: K, listener: T[K] extends any[] ? (...args: T[K]) => void : (arg: T[K]) => void) => void;
251
- emit: <K extends keyof T>(event: K, ...args: T[K] extends any[] ? T[K] : [T[K]]) => void;
252
- off: <K extends keyof T>(event: K, listener?: T[K] extends any[] ? (...args: T[K]) => void : (arg: T[K]) => void) => void;
253
- };
254
247
  /** @description 线性插值
255
248
  * @param start 当 value = 0 时,返回 start
256
249
  * @param end 当 value = 1 时,返回 end
@@ -265,6 +258,18 @@ export declare const Misc: {
265
258
  * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNormalizeInRange-范围归一化
266
259
  */
267
260
  LibJsNormalizeInRange: (start: number, end: number, value: number) => number;
261
+ /** @description 事件发射器
262
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件发射器
263
+ */
264
+ LibJsEmitter: <T extends Record<string, any>>() => {
265
+ on: <K extends keyof T>(event: K, listener: T[K] extends any[] ? (...args: T[K]) => void : (arg: T[K]) => void) => void;
266
+ emit: <K extends keyof T>(event: K, ...args: T[K] extends any[] ? T[K] : [T[K]]) => void;
267
+ off: <K extends keyof T>(event: K, listener?: T[K] extends any[] ? (...args: T[K]) => void : (arg: T[K]) => void) => void;
268
+ };
269
+ /** @description 类属性监听器
270
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsClassObservable-类属性监听器
271
+ */
272
+ LibJsClassObservable: typeof LibJsClassObservable;
268
273
  };
269
274
  /** @description 随机相关方法 */
270
275
  export declare const Random: {
package/libJs.js CHANGED
@@ -39,7 +39,8 @@ import { libJsSecondsFormatterChinese } from "./Formatter/LibJsSecondsFormatterC
39
39
  import { libJsCalculateExpression } from "./Math/LibJsCalculateExpression";
40
40
  import { LibJsEmitter } from "./Misc/LibJsEmitter";
41
41
  import { LibJsLerp } from "./Math/LibJsLerp";
42
- import { LibJsNormalizeInRange } from './Math/LibJsNormalizeInRange';
42
+ import { LibJsNormalizeInRange } from "./Math/LibJsNormalizeInRange";
43
+ import { LibJsClassObservable } from "./Misc/LibJsClassObservable";
43
44
  /** @description 基础方法 */
44
45
  export const Base = {
45
46
  /**
@@ -258,10 +259,6 @@ export const Misc = {
258
259
  * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNumberStepper-数字步进器
259
260
  */
260
261
  LibJsNumberStepper,
261
- /** @description 事件管理器
262
- * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件管理器
263
- */
264
- LibJsEmitter,
265
262
  /** @description 线性插值
266
263
  * @param start 当 value = 0 时,返回 start
267
264
  * @param end 当 value = 1 时,返回 end
@@ -276,6 +273,14 @@ export const Misc = {
276
273
  * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNormalizeInRange-范围归一化
277
274
  */
278
275
  LibJsNormalizeInRange,
276
+ /** @description 事件发射器
277
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件发射器
278
+ */
279
+ LibJsEmitter,
280
+ /** @description 类属性监听器
281
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsClassObservable-类属性监听器
282
+ */
283
+ LibJsClassObservable,
279
284
  };
280
285
  /** @description 随机相关方法 */
281
286
  export const Random = {
package/lyb.js CHANGED
@@ -3405,6 +3405,91 @@ ${log3.label}:`, log3.value];
3405
3405
  const LibJsNormalizeInRange = (start, end, value) => {
3406
3406
  return Math.max(0, Math.min((start - value) / (start - end), 1));
3407
3407
  };
3408
+ class LibJsClassObservable {
3409
+ /**
3410
+ * @param initialData 监听的数据
3411
+ */
3412
+ constructor(initialData) {
3413
+ this.listeners = /* @__PURE__ */ new Map();
3414
+ this.index = 0;
3415
+ this.data = { ...initialData };
3416
+ }
3417
+ /** @description 获取值、
3418
+ * @param key 要获取的键
3419
+ * @returns 对应的值
3420
+ */
3421
+ getValue(key) {
3422
+ return this.data[key];
3423
+ }
3424
+ /** @description 设置值
3425
+ * @param key 要设置的键
3426
+ * @param value 要设置的值
3427
+ * @param immediately 是否立即通知监听器
3428
+ * @returns 设置后的值
3429
+ */
3430
+ setValue(key, value, immediately = true) {
3431
+ var _a;
3432
+ const oldValue = this.data[key];
3433
+ if (oldValue === value)
3434
+ return value;
3435
+ this.data[key] = value;
3436
+ immediately && ((_a = this.listeners.get(key)) == null ? void 0 : _a.forEach((fn) => fn(value, oldValue)));
3437
+ return value;
3438
+ }
3439
+ /** @description 监听值
3440
+ * @param key 要监听的键
3441
+ * @param callback 回调函数
3442
+ * @param immediately 是否立即触发一次回调函数
3443
+ * @returns 取消监听的函数
3444
+ */
3445
+ onValue(key, callback, immediately = true) {
3446
+ const id = this.index++;
3447
+ if (!this.listeners.has(key)) {
3448
+ this.listeners.set(key, /* @__PURE__ */ new Map());
3449
+ }
3450
+ this.listeners.get(key).set(id, callback);
3451
+ immediately && callback(this.data[key], this.data[key]);
3452
+ return () => {
3453
+ this.listeners.get(key).delete(id);
3454
+ };
3455
+ }
3456
+ /** @description 触发某个键名的所有回调函数,适用于同时监听了多个值的场景,用于切换要显示的值,或者延迟在特定时机通知监听器
3457
+ * @param key 要触发的键名
3458
+ * @returns 触发的键值
3459
+ */
3460
+ updateFake(key) {
3461
+ var _a;
3462
+ const value = this.data[key];
3463
+ (_a = this.listeners.get(key)) == null ? void 0 : _a.forEach((fn) => fn(value, value));
3464
+ return value;
3465
+ }
3466
+ /** @description 数字类型的键值累加或累减
3467
+ * @param key 要累加或累减的键
3468
+ * @param type 要累加还是要累减
3469
+ * @param value 要累加或累减的值
3470
+ * @param immediately 是否立即通知监听器
3471
+ */
3472
+ setNumberValue(key, type, value = 1, immediately = true) {
3473
+ let v;
3474
+ if (type === "add") {
3475
+ v = libJsDecimal(this.data[key], value, "+");
3476
+ this.setValue(key, v, immediately);
3477
+ } else {
3478
+ v = libJsDecimal(this.data[key], value, "-");
3479
+ this.setValue(key, v, immediately);
3480
+ }
3481
+ return v;
3482
+ }
3483
+ /** @description 针对布尔类型的键值取反
3484
+ * @param key 要取反的键
3485
+ * @param immediately 是否立即通知监听器
3486
+ */
3487
+ setBooleanValue(key, immediately = true) {
3488
+ const v = !this.data[key];
3489
+ this.setValue(key, v, immediately);
3490
+ return v;
3491
+ }
3492
+ }
3408
3493
  const Base = {
3409
3494
  /**
3410
3495
  * @description 返回数据类型
@@ -3616,10 +3701,6 @@ ${log3.label}:`, log3.value];
3616
3701
  * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNumberStepper-数字步进器
3617
3702
  */
3618
3703
  LibJsNumberStepper,
3619
- /** @description 事件管理器
3620
- * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件管理器
3621
- */
3622
- LibJsEmitter,
3623
3704
  /** @description 线性插值
3624
3705
  * @param start 当 value = 0 时,返回 start
3625
3706
  * @param end 当 value = 1 时,返回 end
@@ -3633,7 +3714,15 @@ ${log3.label}:`, log3.value];
3633
3714
  * @param value 动态值
3634
3715
  * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNormalizeInRange-范围归一化
3635
3716
  */
3636
- LibJsNormalizeInRange
3717
+ LibJsNormalizeInRange,
3718
+ /** @description 事件发射器
3719
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsEmitter-事件发射器
3720
+ */
3721
+ LibJsEmitter,
3722
+ /** @description 类属性监听器
3723
+ * @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsClassObservable-类属性监听器
3724
+ */
3725
+ LibJsClassObservable
3637
3726
  };
3638
3727
  const Random = {
3639
3728
  /** @description 百分比概率结果
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lyb-js",
3
- "version": "1.4.2",
3
+ "version": "1.5.0",
4
4
  "description": "自用JS方法库",
5
5
  "license": "ISC",
6
6
  "type": "module",