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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/src/reactive.ts +44 -25
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cdui-js",
3
- "version": "1.0.8",
3
+ "version": "1.0.9",
4
4
  "type": "module",
5
5
  "main": "src/index.ts",
6
6
  "bin": {
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 arrayMutationMethods = (() => {
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 array = target.slice(0);
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
- set(proxy);
120
- return proxy;
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
- this.fn(new Proxy(target, this));
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
- this.fn(new Proxy(target, this));
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
- return (signals[property] || initSignal(signals, property, target[property]))[0]();
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 | symbol]: any }>(object: T): T => {
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) ? createArraySignal(object)[0]() : reactiveObject(object));
236
+ return proxyMap.get(object) || (!isArray(object) && reactiveObject(object)) || throwReactiveError();
218
237
  }
219
238
 
220
- return object;
239
+ throw new Error(`${object} can not create reactive object`);
221
240
  };
222
241
 
223
242
  /**