lyb-js 1.3.0 → 1.4.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.
- package/Math/LibJsLerp.d.ts +7 -0
- package/Math/LibJsLerp.js +10 -0
- package/Math/LibJsNormalizeInRange.d.ts +7 -0
- package/Math/LibJsNormalizeInRange.js +9 -0
- package/Misc/LibJsObserver.d.ts +25 -0
- package/Misc/LibJsObserver.js +100 -0
- package/README.md +24 -0
- package/package.json +1 -1
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** @description 线性插值
|
|
2
|
+
* @param start 当 value = 0 时,返回 start
|
|
3
|
+
* @param end 当 value = 1 时,返回 end
|
|
4
|
+
* @param value 插值比例,取值范围 0~1
|
|
5
|
+
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsLerp-线性插值
|
|
6
|
+
*/
|
|
7
|
+
export declare const LibJsLerp: (start: number, end: number, value: number) => number;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/** @description 线性插值
|
|
2
|
+
* @param start 当 value = 0 时,返回 start
|
|
3
|
+
* @param end 当 value = 1 时,返回 end
|
|
4
|
+
* @param value 插值比例,取值范围 0~1
|
|
5
|
+
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsLerp-线性插值
|
|
6
|
+
*/
|
|
7
|
+
export const LibJsLerp = (start, end, value) => {
|
|
8
|
+
const t = Math.min(Math.max(value, 0), 1);
|
|
9
|
+
return start * (1 - t) + end * t;
|
|
10
|
+
};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** @description 值介于起点与终点之间时返回一个介于0与1之间的数
|
|
2
|
+
* @param start 起点
|
|
3
|
+
* @param end 终点
|
|
4
|
+
* @param value 动态值
|
|
5
|
+
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNormalizeInRange-范围归一化
|
|
6
|
+
*/
|
|
7
|
+
export declare const LibJsNormalizeInRange: (start: number, end: number, value: number) => number;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** @description 值介于起点与终点之间时返回一个介于0与1之间的数
|
|
2
|
+
* @param start 起点
|
|
3
|
+
* @param end 终点
|
|
4
|
+
* @param value 动态值
|
|
5
|
+
* @link 使用方法:https://www.npmjs.com/package/lyb-js#LibJsNormalizeInRange-范围归一化
|
|
6
|
+
*/
|
|
7
|
+
export const LibJsNormalizeInRange = (start, end, value) => {
|
|
8
|
+
return Math.max(0, Math.min((start - value) / (start - end), 1));
|
|
9
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
type Callback<T> = (newValue: T[keyof T], oldValue: T[keyof T]) => void;
|
|
2
|
+
export declare class LibJsObserver<Store> {
|
|
3
|
+
/** 递增索引 */
|
|
4
|
+
private _index;
|
|
5
|
+
private _store;
|
|
6
|
+
private _lastData;
|
|
7
|
+
private _listeners;
|
|
8
|
+
constructor(store: Store);
|
|
9
|
+
/** @description 监听
|
|
10
|
+
* @param key 要监听的键
|
|
11
|
+
* @param callback key值变化时执行的回调函数
|
|
12
|
+
* @param immediately 监听时是否立即执行回调函数
|
|
13
|
+
* @returns 返回一个函数用于注销监听器
|
|
14
|
+
*/
|
|
15
|
+
on(key: keyof Store, callback: Callback<Store>, immediately?: boolean): () => void;
|
|
16
|
+
/** @description 获取数据 */
|
|
17
|
+
getData(key: keyof Store): Store[keyof Store];
|
|
18
|
+
/** @description 手动更新数据 */
|
|
19
|
+
setData(newData: Partial<Store>): void;
|
|
20
|
+
/** @description 通知监听器更新 */
|
|
21
|
+
private _notifyListeners;
|
|
22
|
+
/** @description 判断数据变化并通知监听器 */
|
|
23
|
+
private _update;
|
|
24
|
+
}
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
export class LibJsObserver {
|
|
2
|
+
constructor(store) {
|
|
3
|
+
/** 递增索引 */
|
|
4
|
+
this._index = 0;
|
|
5
|
+
// 监听器映射,用于存储不同键的回调函数
|
|
6
|
+
this._listeners = new Map();
|
|
7
|
+
this._store = store;
|
|
8
|
+
this._lastData = Object.assign({}, store);
|
|
9
|
+
}
|
|
10
|
+
/** @description 监听
|
|
11
|
+
* @param key 要监听的键
|
|
12
|
+
* @param callback key值变化时执行的回调函数
|
|
13
|
+
* @param immediately 监听时是否立即执行回调函数
|
|
14
|
+
* @returns 返回一个函数用于注销监听器
|
|
15
|
+
*/
|
|
16
|
+
on(key, callback, immediately = true) {
|
|
17
|
+
this._index += 1;
|
|
18
|
+
const index = this._index;
|
|
19
|
+
// 如果该键没有对应的监听器集合,则初始化一个新的集合
|
|
20
|
+
if (!this._listeners.has(key)) {
|
|
21
|
+
this._listeners.set(key, new Map());
|
|
22
|
+
}
|
|
23
|
+
// 将回调函数添加到对应键的监听器集合中
|
|
24
|
+
this._listeners.get(key).set(index, callback);
|
|
25
|
+
immediately && callback(this._store[key], this._lastData[key]);
|
|
26
|
+
return () => {
|
|
27
|
+
// 从特定键的监听器集合中移除指定标识符的回调函数
|
|
28
|
+
const listenerMap = this._listeners.get(key);
|
|
29
|
+
if (listenerMap) {
|
|
30
|
+
listenerMap.delete(index);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
console.warn(`监听 Key "${key.toString()}" 重复注销事件`);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** @description 获取数据 */
|
|
38
|
+
getData(key) {
|
|
39
|
+
return this._store[key];
|
|
40
|
+
}
|
|
41
|
+
/** @description 手动更新数据 */
|
|
42
|
+
setData(newData) {
|
|
43
|
+
this._store = Object.assign(Object.assign({}, this._store), newData);
|
|
44
|
+
this._update();
|
|
45
|
+
}
|
|
46
|
+
/** @description 通知监听器更新 */
|
|
47
|
+
_notifyListeners(key, newValue, oldValue) {
|
|
48
|
+
// 获取特定键的所有监听器
|
|
49
|
+
const keyListeners = this._listeners.get(key);
|
|
50
|
+
if (keyListeners) {
|
|
51
|
+
// 遍历并执行每个监听器的回调函数
|
|
52
|
+
keyListeners.forEach((callback) => callback(newValue, oldValue));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** @description 判断数据变化并通知监听器 */
|
|
56
|
+
_update() {
|
|
57
|
+
// 遍历当前数据对象的每个键,检查是否有变化
|
|
58
|
+
for (const key in this._store) {
|
|
59
|
+
const typedKey = key;
|
|
60
|
+
const newValue = this._store[typedKey];
|
|
61
|
+
const oldValue = this._lastData[typedKey];
|
|
62
|
+
//如果旧值与新值不相等,则通知监听器
|
|
63
|
+
if (newValue !== oldValue) {
|
|
64
|
+
this._notifyListeners(typedKey, newValue, oldValue);
|
|
65
|
+
this._lastData[typedKey] = this._store[typedKey];
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
class LibJsStore extends LibJsObserver {
|
|
71
|
+
constructor() {
|
|
72
|
+
super({
|
|
73
|
+
name: "张三",
|
|
74
|
+
age: 20,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const store = new LibJsStore();
|
|
79
|
+
const offA = store.on("age", (newValue) => {
|
|
80
|
+
console.log(`A收到年龄更新:`, newValue);
|
|
81
|
+
});
|
|
82
|
+
store.on("age", (newValue) => {
|
|
83
|
+
console.log(`B收到年龄更新:`, newValue);
|
|
84
|
+
});
|
|
85
|
+
// 模拟更新数据
|
|
86
|
+
setTimeout(() => {
|
|
87
|
+
console.log("尝试更新年龄值为:25");
|
|
88
|
+
store.setData({ age: 25 });
|
|
89
|
+
setTimeout(() => {
|
|
90
|
+
console.warn("注销A监听器");
|
|
91
|
+
offA();
|
|
92
|
+
setTimeout(() => {
|
|
93
|
+
console.warn("尝试更新年龄值为:26");
|
|
94
|
+
store.setData({ age: 26 });
|
|
95
|
+
setTimeout(() => {
|
|
96
|
+
console.log("尝试获取年龄值:", store.getData("age"));
|
|
97
|
+
}, 1000);
|
|
98
|
+
}, 1000);
|
|
99
|
+
}, 1000);
|
|
100
|
+
}, 1000);
|
package/README.md
CHANGED
|
@@ -133,6 +133,10 @@ console.log(t); //"string"
|
|
|
133
133
|
|
|
134
134
|
\- [LibJsDecimal-高精度计算](#LibJsDecimal-高精度计算)
|
|
135
135
|
|
|
136
|
+
\- [LibJsLerp-线性插值](#LibJsLerp-线性插值)
|
|
137
|
+
|
|
138
|
+
\- [LibJsNormalizeInRange-范围归一化](#LibJsNormalizeInRange-范围归一化)
|
|
139
|
+
|
|
136
140
|
### Misc-杂项
|
|
137
141
|
|
|
138
142
|
\- [LibJsRegFormValidate-表单验证](#LibJsRegFormValidate-表单验证)
|
|
@@ -141,6 +145,8 @@ console.log(t); //"string"
|
|
|
141
145
|
|
|
142
146
|
\- [LibJsNumberStepper-数字步进器](#LibJsNumberStepper-数字步进器)
|
|
143
147
|
|
|
148
|
+
\- [LibJsEmitter-事件管理器](#LibJsEmitter-事件管理器)
|
|
149
|
+
|
|
144
150
|
|
|
145
151
|
### Random-随机
|
|
146
152
|
|
|
@@ -489,6 +495,24 @@ const result3 = libJsDecimal(10, 3, "/", 2);
|
|
|
489
495
|
console.log(result3); //3.33
|
|
490
496
|
```
|
|
491
497
|
|
|
498
|
+
### LibJsLerp-线性插值
|
|
499
|
+
|
|
500
|
+
> 线性插值
|
|
501
|
+
|
|
502
|
+
```ts
|
|
503
|
+
console.log(LibJsLerp(0, 100, 0.25)); //25
|
|
504
|
+
console.log(LibJsLerp(100, 0, 0.75)); //25
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
### LibJsNormalizeInRange-范围归一化
|
|
508
|
+
|
|
509
|
+
> 值介于起点与终点之间时返回一个介于0与1之间的数
|
|
510
|
+
|
|
511
|
+
```ts
|
|
512
|
+
console.log(LibJsNormalizeInRange(0, 100, 75)); //0.75
|
|
513
|
+
console.log(LibJsNormalizeInRange(100, 0, 75)); //0.25
|
|
514
|
+
```
|
|
515
|
+
|
|
492
516
|
## Misc-杂项
|
|
493
517
|
|
|
494
518
|
### LibJsRegFormValidate-表单验证
|