cdui-js 1.0.8 → 1.0.9
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/package.json +1 -1
- package/src/reactive.ts +44 -25
package/package.json
CHANGED
package/src/reactive.ts
CHANGED
|
@@ -64,10 +64,10 @@ export interface SSRRenderPage {
|
|
|
64
64
|
abort?: boolean;
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
+
const signalOptions: any = { equals: false, internal: true };
|
|
67
68
|
const proxyMap = new WeakMap();
|
|
68
69
|
|
|
69
|
-
const
|
|
70
|
-
let names = ['push', 'pop', 'shift', 'unshift', 'splice', 'sort', 'reverse', 'fill', 'copyWithin'];
|
|
70
|
+
const arrayToKeys = (names: string[]) => {
|
|
71
71
|
let result = Object.create(null);
|
|
72
72
|
|
|
73
73
|
for (let i = 0, l = names.length; i < l; i++) {
|
|
@@ -75,7 +75,19 @@ const arrayMutationMethods = (() => {
|
|
|
75
75
|
}
|
|
76
76
|
|
|
77
77
|
return result;
|
|
78
|
-
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const arrayMutationMethods = arrayToKeys([
|
|
81
|
+
'push',
|
|
82
|
+
'pop',
|
|
83
|
+
'shift',
|
|
84
|
+
'unshift',
|
|
85
|
+
'splice',
|
|
86
|
+
'sort',
|
|
87
|
+
'reverse',
|
|
88
|
+
'fill',
|
|
89
|
+
'copyWithin',
|
|
90
|
+
]);
|
|
79
91
|
|
|
80
92
|
function arrayProxyGetHandler(target: any, property: any, receiver) {
|
|
81
93
|
let index = typeof property === 'string' && +property;
|
|
@@ -105,19 +117,11 @@ function arrayProxyGetHandler(target: any, property: any, receiver) {
|
|
|
105
117
|
let set = handler.fn;
|
|
106
118
|
|
|
107
119
|
return function () {
|
|
108
|
-
let
|
|
109
|
-
let result = value.apply(array, arguments);
|
|
110
|
-
|
|
111
|
-
// 返回的不是对象
|
|
112
|
-
if (result !== array) {
|
|
113
|
-
set(new Proxy(array, handler));
|
|
114
|
-
return result;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
let proxy = new Proxy(array, handler);
|
|
120
|
+
let result = value.apply(target, arguments);
|
|
118
121
|
|
|
119
|
-
|
|
120
|
-
|
|
122
|
+
// 触发更新
|
|
123
|
+
set(receiver);
|
|
124
|
+
return result !== target ? result : receiver;
|
|
121
125
|
};
|
|
122
126
|
}
|
|
123
127
|
|
|
@@ -133,20 +137,20 @@ function arrayProxySetHandler(target: any, property: any, value, receiver) {
|
|
|
133
137
|
|
|
134
138
|
// 如果是通过索引设置值
|
|
135
139
|
if (property >= 0) {
|
|
136
|
-
target = target.slice(0);
|
|
137
140
|
target[index] = value;
|
|
138
141
|
|
|
139
|
-
|
|
142
|
+
// 触发更新
|
|
143
|
+
this.fn(receiver);
|
|
140
144
|
return true;
|
|
141
145
|
}
|
|
142
146
|
|
|
143
147
|
// 如果设置的是length属性
|
|
144
148
|
if (property === 'length') {
|
|
145
149
|
if (target.length !== value) {
|
|
146
|
-
target = target.slice(0);
|
|
147
150
|
target.length = value;
|
|
148
151
|
|
|
149
|
-
|
|
152
|
+
// 触发更新
|
|
153
|
+
this.fn(receiver);
|
|
150
154
|
return true;
|
|
151
155
|
}
|
|
152
156
|
|
|
@@ -159,7 +163,7 @@ function arrayProxySetHandler(target: any, property: any, value, receiver) {
|
|
|
159
163
|
const createArraySignal = (value: any[]) => {
|
|
160
164
|
let handler = { get: arrayProxyGetHandler, set: arrayProxySetHandler, fn: null };
|
|
161
165
|
let proxy = new Proxy(value, handler);
|
|
162
|
-
let signal = createSignal(proxy);
|
|
166
|
+
let signal = createSignal(proxy, signalOptions);
|
|
163
167
|
|
|
164
168
|
handler.fn = signal[1];
|
|
165
169
|
|
|
@@ -177,7 +181,18 @@ const reactiveObject = (object) => {
|
|
|
177
181
|
const proxy = new Proxy(object, {
|
|
178
182
|
get(target, property, receiver) {
|
|
179
183
|
if (property !== '__raw__') {
|
|
180
|
-
|
|
184
|
+
let value = (signals[property] || initSignal(signals, property, target[property]))[0]();
|
|
185
|
+
|
|
186
|
+
if (typeof value !== 'object' || !value) {
|
|
187
|
+
return value;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// 已经是代理对象
|
|
191
|
+
if (value.__raw__) {
|
|
192
|
+
return value;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
return proxyMap.get(value) || (isArray(value) ? createArraySignal(value)[0]() : reactiveObject(value));
|
|
181
196
|
}
|
|
182
197
|
|
|
183
198
|
return target;
|
|
@@ -188,7 +203,7 @@ const reactiveObject = (object) => {
|
|
|
188
203
|
value = value.__raw__ || value;
|
|
189
204
|
}
|
|
190
205
|
|
|
191
|
-
(signals[property] || initSignal(signals, property, target[property]))[1](value);
|
|
206
|
+
(signals[property] || initSignal(signals, property, target[property]))[1]((target[property] = value));
|
|
192
207
|
return true;
|
|
193
208
|
},
|
|
194
209
|
|
|
@@ -202,22 +217,26 @@ const reactiveObject = (object) => {
|
|
|
202
217
|
return proxy;
|
|
203
218
|
};
|
|
204
219
|
|
|
220
|
+
const throwReactiveError = () => {
|
|
221
|
+
throw new Error(`Array cannot directly create reactive object,Please use like: reactive({ items: [] })`);
|
|
222
|
+
};
|
|
223
|
+
|
|
205
224
|
/**
|
|
206
225
|
* 创建响应式对象
|
|
207
226
|
*
|
|
208
227
|
* @param object 要封装为响应的对象
|
|
209
228
|
*/
|
|
210
|
-
export const reactive = <T extends { [key: string
|
|
229
|
+
export const reactive = <T extends { [key: string]: any }>(object: T extends any[] ? never : T): T => {
|
|
211
230
|
if (object && typeof object === 'object') {
|
|
212
231
|
// 已经是代理对象
|
|
213
232
|
if (object.__raw__) {
|
|
214
233
|
return object;
|
|
215
234
|
}
|
|
216
235
|
|
|
217
|
-
return proxyMap.get(object) || (isArray(object)
|
|
236
|
+
return proxyMap.get(object) || (!isArray(object) && reactiveObject(object)) || throwReactiveError();
|
|
218
237
|
}
|
|
219
238
|
|
|
220
|
-
|
|
239
|
+
throw new Error(`${object} can not create reactive object`);
|
|
221
240
|
};
|
|
222
241
|
|
|
223
242
|
/**
|