@viewfly/core 3.0.0-alpha.1 → 3.0.0-alpha.3

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/dist/index.esm.js CHANGED
@@ -209,7 +209,7 @@ var NullInjector = class {
209
209
  * @param provider
210
210
  */
211
211
  function normalizeProvider(provider) {
212
- if (provider.useValue) return normalizeValueProviderFactory(provider);
212
+ if (Object.prototype.hasOwnProperty.call(provider, "useValue")) return normalizeValueProviderFactory(provider);
213
213
  if (provider.useClass) return normalizeClassProviderFactory(provider);
214
214
  if (provider.useExisting) return normalizeExistingProviderFactory(provider);
215
215
  if (provider.useFactory) return normalizeFactoryProviderFactory(provider);
@@ -345,13 +345,14 @@ var provideScopeError = (token) => {
345
345
  * 反射注入器
346
346
  */
347
347
  var ReflectiveInjector = class {
348
- normalizedProviders;
348
+ normalizedProviders = /* @__PURE__ */ new Map();
349
349
  recordValues = /* @__PURE__ */ new Map();
350
350
  constructor(parentInjector, staticProviders, scope) {
351
351
  this.parentInjector = parentInjector;
352
352
  this.scope = scope;
353
- this.normalizedProviders = staticProviders.map((provide) => {
354
- return normalizeProvider(provide);
353
+ staticProviders.forEach((provide) => {
354
+ const normalizedProvider = normalizeProvider(provide);
355
+ this.normalizedProviders.set(normalizedProvider.provide, normalizedProvider);
355
356
  });
356
357
  }
357
358
  /**
@@ -368,22 +369,20 @@ var ReflectiveInjector = class {
368
369
  throw reflectiveInjectorErrorFn(token);
369
370
  }
370
371
  if (this.recordValues.has(token)) return this.recordValues.get(token);
371
- for (let i = 0; i < this.normalizedProviders.length; i++) {
372
- const normalizedProvider = this.normalizedProviders[i];
373
- if (normalizedProvider.provide === token) return this.getValue(token, normalizedProvider);
374
- }
372
+ const normalizedProvider = this.normalizedProviders.get(token);
373
+ if (normalizedProvider) return this.getValue(token, normalizedProvider);
375
374
  if (!(token instanceof InjectionToken)) {
376
375
  const scope = getAnnotations(token).getClassMetadata(Injectable)?.metadata.provideIn;
377
376
  if (scope) {
378
377
  const normalizedProvider = normalizeProvider(token);
379
378
  if (this.scope === scope) {
380
- this.normalizedProviders.push(normalizedProvider);
379
+ this.normalizedProviders.set(normalizedProvider.provide, normalizedProvider);
381
380
  return this.getValue(token, normalizedProvider);
382
381
  }
383
382
  const parentInjector = this.parentInjector;
384
383
  if (!parentInjector || parentInjector instanceof NullInjector) {
385
384
  if (normalizedProvider.scope === "root") {
386
- this.normalizedProviders.push(normalizedProvider);
385
+ this.normalizedProviders.set(normalizedProvider.provide, normalizedProvider);
387
386
  return this.getValue(token, normalizedProvider);
388
387
  }
389
388
  if (notFoundValue !== THROW_IF_NOT_FOUND) return notFoundValue;
@@ -402,9 +401,8 @@ var ReflectiveInjector = class {
402
401
  getValue(token, normalizedProvider) {
403
402
  const { generateFactory, deps } = normalizedProvider;
404
403
  const params = this.resolveDeps(deps);
405
- let value = this.recordValues.get(token);
406
- if (value) return value;
407
- value = generateFactory(this, (token, value) => {
404
+ if (this.recordValues.has(token)) return this.recordValues.get(token);
405
+ const value = generateFactory(this, (token, value) => {
408
406
  this.recordValues.set(token, value);
409
407
  })(...params);
410
408
  this.recordValues.set(token, value);
@@ -524,8 +522,9 @@ function hasOwn(target, key) {
524
522
  //#region src/base/dep.ts
525
523
  var Dep = class {
526
524
  destroyCallbacks = [];
527
- constructor(effect) {
525
+ constructor(effect, flushMode = "sync") {
528
526
  this.effect = effect;
527
+ this.flushMode = flushMode;
529
528
  }
530
529
  destroy() {
531
530
  this.destroyCallbacks.forEach((callback) => callback());
@@ -534,7 +533,7 @@ var Dep = class {
534
533
  };
535
534
  var deps = [];
536
535
  function getDepContext() {
537
- return deps.at(-1);
536
+ return deps[deps.length - 1];
538
537
  }
539
538
  function pushDepContext(dep) {
540
539
  deps.push(dep);
@@ -545,6 +544,47 @@ function popDepContext() {
545
544
  //#endregion
546
545
  //#region src/reactive/effect.ts
547
546
  var subscribers = /* @__PURE__ */ new WeakMap();
547
+ var pendingDeps = /* @__PURE__ */ new Set();
548
+ var isFlushScheduled = false;
549
+ var effectErrorFn = makeError("Effect");
550
+ function scheduleDep(dep) {
551
+ if (dep.flushMode === "sync") {
552
+ dep.effect();
553
+ return;
554
+ }
555
+ pendingDeps.add(dep);
556
+ if (!isFlushScheduled) {
557
+ isFlushScheduled = true;
558
+ queueMicrotask(flushPendingDeps);
559
+ }
560
+ }
561
+ function flushPendingDeps() {
562
+ try {
563
+ while (pendingDeps.size > 0) {
564
+ const deps = Array.from(pendingDeps);
565
+ pendingDeps.clear();
566
+ deps.forEach((dep) => {
567
+ dep.effect();
568
+ });
569
+ }
570
+ } finally {
571
+ isFlushScheduled = false;
572
+ if (pendingDeps.size > 0) {
573
+ isFlushScheduled = true;
574
+ queueMicrotask(flushPendingDeps);
575
+ }
576
+ }
577
+ }
578
+ function nextTick() {
579
+ return Promise.resolve();
580
+ }
581
+ /**
582
+ * 同步清空响应式调度队列。
583
+ * @internal 仅用于框架内部桥接与测试控制,不建议业务代码使用。
584
+ */
585
+ function flushReactiveEffectsSync() {
586
+ flushPendingDeps();
587
+ }
548
588
  function getSubscriber(target) {
549
589
  let subscriber = subscribers.get(target);
550
590
  if (!subscriber) {
@@ -564,9 +604,17 @@ var TriggerOpTypes = /* @__PURE__ */ function(TriggerOpTypes) {
564
604
  TriggerOpTypes["Add"] = "Add";
565
605
  TriggerOpTypes["Delete"] = "Delete";
566
606
  TriggerOpTypes["Clear"] = "Clear";
607
+ TriggerOpTypes["Iterate"] = "Iterate";
567
608
  return TriggerOpTypes;
568
609
  }({});
569
610
  var unKnownKey = Symbol("unKnownKey");
611
+ function cleanupEmptyEffects(target, type, key, effects, record, subscriber) {
612
+ if (effects.size > 0) return;
613
+ record.delete(key);
614
+ if (record.size > 0) return;
615
+ subscriber.delete(type);
616
+ if (subscriber.size === 0) subscribers.delete(target);
617
+ }
570
618
  function track(target, type, key = unKnownKey) {
571
619
  const dep = getDepContext();
572
620
  if (dep) {
@@ -582,10 +630,12 @@ function track(target, type, key = unKnownKey) {
582
630
  record.set(key, effects);
583
631
  dep.destroyCallbacks.push(() => {
584
632
  effects.delete(dep);
633
+ cleanupEmptyEffects(target, type, key, effects, record, subscriber);
585
634
  });
586
635
  } else if (!effects.has(dep)) {
587
636
  dep.destroyCallbacks.push(() => {
588
637
  effects.delete(dep);
638
+ cleanupEmptyEffects(target, type, key, effects, record, subscriber);
589
639
  });
590
640
  effects.add(dep);
591
641
  }
@@ -594,23 +644,105 @@ function track(target, type, key = unKnownKey) {
594
644
  function runEffect(key, record) {
595
645
  if (!record) return;
596
646
  const effects = record.get(key);
597
- if (effects) [...effects].forEach((i) => i.effect());
647
+ if (effects) [...effects].forEach((dep) => scheduleDep(dep));
648
+ }
649
+ function collectAllEffects(record, effectSet) {
650
+ if (!record) return;
651
+ record.forEach((effects) => {
652
+ effects.forEach((effect) => {
653
+ effectSet.add(effect);
654
+ });
655
+ });
598
656
  }
599
657
  function trigger(target, type, key = unKnownKey) {
600
- const subscriber = getSubscriber(target);
601
- if (subscriber) switch (type) {
602
- case TriggerOpTypes.Set:
603
- if (isArray(target)) runEffect(unKnownKey, subscriber.get(TrackOpTypes.Iterate));
658
+ const subscriber = subscribers.get(target);
659
+ if (!subscriber) return;
660
+ if (isArray(target)) {
661
+ switch (type) {
662
+ case TriggerOpTypes.Set:
663
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
664
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
665
+ break;
666
+ case TriggerOpTypes.Iterate:
667
+ runEffect(key, subscriber.get(TrackOpTypes.Iterate));
668
+ break;
669
+ case TriggerOpTypes.Delete:
670
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
671
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
672
+ break;
673
+ default: throw effectErrorFn(`trigger: type '${type}' is not supported`);
674
+ }
675
+ return;
676
+ }
677
+ if (target instanceof Map || target instanceof WeakMap) {
678
+ switch (type) {
679
+ case TriggerOpTypes.Set:
680
+ case TriggerOpTypes.Add:
681
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
682
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
683
+ break;
684
+ case TriggerOpTypes.Iterate:
685
+ runEffect(key, subscriber.get(TrackOpTypes.Iterate));
686
+ break;
687
+ case TriggerOpTypes.Delete:
688
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
689
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
690
+ runEffect(key, subscriber.get(TrackOpTypes.Iterate));
691
+ break;
692
+ case TriggerOpTypes.Clear: {
693
+ const effects = /* @__PURE__ */ new Set();
694
+ collectAllEffects(subscriber.get(TrackOpTypes.Get), effects);
695
+ collectAllEffects(subscriber.get(TrackOpTypes.Has), effects);
696
+ collectAllEffects(subscriber.get(TrackOpTypes.Iterate), effects);
697
+ effects.forEach((effect) => scheduleDep(effect));
698
+ break;
699
+ }
700
+ default: throw effectErrorFn(`trigger: type '${type}' is not supported`);
701
+ }
702
+ return;
703
+ }
704
+ if (target instanceof Set || target instanceof WeakSet) {
705
+ switch (type) {
706
+ case TriggerOpTypes.Add:
707
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
708
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
709
+ break;
710
+ case TriggerOpTypes.Iterate:
711
+ runEffect(key, subscriber.get(TrackOpTypes.Iterate));
712
+ break;
713
+ case TriggerOpTypes.Delete:
714
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
715
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
716
+ runEffect(key, subscriber.get(TrackOpTypes.Iterate));
717
+ break;
718
+ case TriggerOpTypes.Clear: {
719
+ const effects = /* @__PURE__ */ new Set();
720
+ collectAllEffects(subscriber.get(TrackOpTypes.Get), effects);
721
+ collectAllEffects(subscriber.get(TrackOpTypes.Has), effects);
722
+ collectAllEffects(subscriber.get(TrackOpTypes.Iterate), effects);
723
+ effects.forEach((effect) => scheduleDep(effect));
724
+ break;
725
+ }
726
+ default: throw effectErrorFn(`trigger: type '${type}' is not supported`);
727
+ }
728
+ return;
729
+ }
730
+ switch (type) {
731
+ case TriggerOpTypes.Add:
604
732
  runEffect(key, subscriber.get(TrackOpTypes.Get));
605
733
  runEffect(key, subscriber.get(TrackOpTypes.Has));
606
734
  break;
607
- case TriggerOpTypes.Add:
608
- case TriggerOpTypes.Clear:
735
+ case TriggerOpTypes.Set:
736
+ runEffect(key, subscriber.get(TrackOpTypes.Get));
737
+ break;
609
738
  case TriggerOpTypes.Delete:
610
- runEffect(unKnownKey, subscriber.get(TrackOpTypes.Iterate));
611
- runEffect(key, subscriber.get(TrackOpTypes.Has));
612
739
  runEffect(key, subscriber.get(TrackOpTypes.Get));
740
+ runEffect(key, subscriber.get(TrackOpTypes.Has));
741
+ break;
742
+ case TriggerOpTypes.Iterate:
743
+ runEffect(key, subscriber.get(TrackOpTypes.Iterate));
613
744
  break;
745
+ default: throw effectErrorFn(`trigger: type '${type}' is not supported`);
614
746
  }
615
747
  }
616
748
  //#endregion
@@ -639,8 +771,8 @@ function createIterableIterator(wrapper) {
639
771
  function applyPredicateMethod(self, methodName, predicate, wrapper, thisArg) {
640
772
  const target = toRaw(self);
641
773
  track(target, TrackOpTypes.Iterate);
642
- return target[methodName]((value, index, array) => {
643
- return predicate.call(target, wrapper(value), index, array);
774
+ return target[methodName]((value, index) => {
775
+ return predicate.call(thisArg, wrapper(value), index, self);
644
776
  }, thisArg);
645
777
  }
646
778
  function applySearchMethod(self, methodName, args) {
@@ -648,11 +780,14 @@ function applySearchMethod(self, methodName, args) {
648
780
  track(target, TrackOpTypes.Iterate);
649
781
  return target[methodName](...args.map(toRaw));
650
782
  }
783
+ function triggerArrayByRange(target, startIndex, endIndex) {
784
+ for (; startIndex < endIndex; startIndex++) trigger(target, TriggerOpTypes.Set, startIndex + "");
785
+ }
651
786
  function createArrayHandlers(wrapper) {
652
787
  return {
653
788
  concat(...items) {
654
789
  const target = toRaw(this);
655
- trigger(target, TriggerOpTypes.Add);
790
+ track(target, TrackOpTypes.Iterate);
656
791
  return target.concat(...items);
657
792
  },
658
793
  every(predicate, thisArg) {
@@ -695,13 +830,23 @@ function createArrayHandlers(wrapper) {
695
830
  },
696
831
  pop() {
697
832
  const target = toRaw(this);
698
- trigger(target, TriggerOpTypes.Delete);
699
- return target.pop();
833
+ const oldLength = target.length;
834
+ const value = target.pop();
835
+ const newLength = target.length;
836
+ if (newLength < oldLength) {
837
+ trigger(target, TriggerOpTypes.Set, newLength + "");
838
+ trigger(target, TriggerOpTypes.Set, "length");
839
+ trigger(target, TriggerOpTypes.Iterate);
840
+ }
841
+ return value;
700
842
  },
701
843
  push(...items) {
702
844
  const target = toRaw(this);
703
- trigger(target, TriggerOpTypes.Add);
704
- return target.push(...items);
845
+ const oldLength = target.length;
846
+ const length = target.push(...items);
847
+ triggerArrayByRange(target, oldLength, length);
848
+ trigger(target, TriggerOpTypes.Iterate);
849
+ return length;
705
850
  },
706
851
  reduce(callbackFn, ...args) {
707
852
  const target = toRaw(this);
@@ -721,18 +866,27 @@ function createArrayHandlers(wrapper) {
721
866
  },
722
867
  shift() {
723
868
  const target = toRaw(this);
724
- trigger(target, TriggerOpTypes.Delete);
725
- return target.shift();
869
+ const oldLength = target.length;
870
+ const value = target.shift();
871
+ if (target.length < oldLength) {
872
+ triggerArrayByRange(target, 0, oldLength);
873
+ trigger(target, TriggerOpTypes.Set, "length");
874
+ trigger(target, TriggerOpTypes.Iterate);
875
+ }
876
+ return value;
726
877
  },
727
878
  some(predicate, thisArg) {
728
879
  return applyPredicateMethod(this, "some", predicate, wrapper, thisArg);
729
880
  },
730
- splice(start, deleteCount) {
881
+ splice(start, ...items) {
731
882
  const target = toRaw(this);
732
- trigger(target, TriggerOpTypes.Set);
733
- trigger(target, TriggerOpTypes.Add);
734
- trigger(target, TriggerOpTypes.Delete);
735
- return target.splice(start, deleteCount).map((i) => wrapper(i));
883
+ const oldLength = target.length;
884
+ const deleted = target.splice(start, ...items).map((i) => wrapper(i));
885
+ const newLength = target.length;
886
+ triggerArrayByRange(target, start, Math.max(oldLength, newLength));
887
+ if (oldLength !== newLength) trigger(target, TriggerOpTypes.Set, "length");
888
+ trigger(target, TriggerOpTypes.Iterate);
889
+ return deleted;
736
890
  },
737
891
  toReversed() {
738
892
  const target = toRaw(this);
@@ -751,8 +905,11 @@ function createArrayHandlers(wrapper) {
751
905
  },
752
906
  unshift(...items) {
753
907
  const target = toRaw(this);
754
- trigger(target, TriggerOpTypes.Add);
755
- return target.unshift(...items);
908
+ const length = target.unshift(...items);
909
+ triggerArrayByRange(target, 0, length);
910
+ trigger(target, TriggerOpTypes.Set, "length");
911
+ trigger(target, TriggerOpTypes.Iterate);
912
+ return length;
756
913
  },
757
914
  [Symbol.iterator]() {
758
915
  return this.values();
@@ -765,6 +922,7 @@ function createArrayHandlers(wrapper) {
765
922
  function createMapHandlers(wrapper) {
766
923
  return {
767
924
  get(key) {
925
+ key = toRaw(key);
768
926
  const target = toRaw(this);
769
927
  track(target, TrackOpTypes.Get, key);
770
928
  return wrapper(target.get(key));
@@ -774,8 +932,11 @@ function createMapHandlers(wrapper) {
774
932
  key = toRaw(key);
775
933
  value = toRaw(value);
776
934
  const has = target.has(key);
935
+ const oldValue = has ? target.get(key) : void 0;
936
+ if (has && Object.is(oldValue, value)) return this;
777
937
  const r = target.set(key, value);
778
938
  trigger(target, has ? TriggerOpTypes.Set : TriggerOpTypes.Add, key);
939
+ if (!has) trigger(target, TriggerOpTypes.Iterate);
779
940
  return r;
780
941
  },
781
942
  has(key) {
@@ -789,19 +950,21 @@ function createMapHandlers(wrapper) {
789
950
  key = toRaw(key);
790
951
  const r = target.delete(key);
791
952
  trigger(target, TriggerOpTypes.Delete, key);
953
+ if (r) trigger(target, TriggerOpTypes.Iterate);
792
954
  return r;
793
955
  },
794
956
  forEach(callbackFn, thisArg) {
795
957
  const target = toRaw(this);
796
- track(target, TrackOpTypes.Iterate, void 0);
958
+ track(target, TrackOpTypes.Iterate);
797
959
  target.forEach((v, k, m) => {
798
- callbackFn.call(this, wrapper(v), wrapper(k), m);
960
+ callbackFn.call(thisArg, wrapper(v), wrapper(k), m);
799
961
  }, thisArg);
800
962
  },
801
963
  clear() {
802
964
  const target = toRaw(this);
965
+ if (target.size === 0) return;
803
966
  target.clear();
804
- trigger(target, TriggerOpTypes.Clear, void 0);
967
+ trigger(target, TriggerOpTypes.Clear);
805
968
  },
806
969
  [Symbol.iterator]() {
807
970
  return this.entries();
@@ -818,16 +981,19 @@ function createSetHandlers(wrapper) {
818
981
  value = toRaw(value);
819
982
  if (!target.has(value)) {
820
983
  target.add(value);
821
- trigger(target, TriggerOpTypes.Add, void 0);
984
+ trigger(target, TriggerOpTypes.Add, value);
985
+ trigger(target, TriggerOpTypes.Iterate);
822
986
  }
823
987
  return this;
824
988
  },
825
989
  delete(value) {
826
990
  const target = toRaw(this);
827
991
  value = toRaw(value);
828
- const has = target.has(value);
829
992
  const b = target.delete(value);
830
- if (!has) trigger(target, TriggerOpTypes.Delete, void 0);
993
+ if (b) {
994
+ trigger(target, TriggerOpTypes.Delete, value);
995
+ trigger(target, TriggerOpTypes.Iterate);
996
+ }
831
997
  return b;
832
998
  },
833
999
  has(key) {
@@ -838,16 +1004,16 @@ function createSetHandlers(wrapper) {
838
1004
  },
839
1005
  forEach(callbackFn, thisArg) {
840
1006
  const target = toRaw(this);
841
- track(target, TrackOpTypes.Iterate, void 0);
1007
+ track(target, TrackOpTypes.Iterate);
842
1008
  target.forEach((v, k, m) => {
843
- callbackFn.call(this, wrapper(v), wrapper(k), m);
1009
+ callbackFn.call(thisArg, wrapper(v), wrapper(k), m);
844
1010
  }, thisArg);
845
1011
  },
846
1012
  clear() {
847
1013
  const target = toRaw(this);
848
1014
  if (target.size !== 0) {
849
1015
  target.clear();
850
- trigger(target, TriggerOpTypes.Clear, void 0);
1016
+ trigger(target, TriggerOpTypes.Clear);
851
1017
  }
852
1018
  },
853
1019
  [Symbol.iterator]() {
@@ -861,6 +1027,8 @@ function createSetHandlers(wrapper) {
861
1027
  var reactiveErrorFn = makeError("reactive");
862
1028
  var rawToProxyCache = /* @__PURE__ */ new WeakMap();
863
1029
  var proxyToRawCache = /* @__PURE__ */ new WeakMap();
1030
+ var shallowRawToProxyCache = /* @__PURE__ */ new WeakMap();
1031
+ var shallowProxyToRawCache = /* @__PURE__ */ new WeakMap();
864
1032
  /**
865
1033
  * 将响应式对象转换为原始对象
866
1034
  * @param value 响应式对象
@@ -876,6 +1044,7 @@ var proxyToRawCache = /* @__PURE__ */ new WeakMap();
876
1044
  */
877
1045
  function toRaw(value) {
878
1046
  if (proxyToRawCache.has(value)) return proxyToRawCache.get(value);
1047
+ if (shallowProxyToRawCache.has(value)) return shallowProxyToRawCache.get(value);
879
1048
  return value;
880
1049
  }
881
1050
  /**
@@ -892,18 +1061,24 @@ function toRaw(value) {
892
1061
  * ```
893
1062
  */
894
1063
  function isReactive(value) {
895
- return proxyToRawCache.has(value);
1064
+ return proxyToRawCache.has(value) || shallowProxyToRawCache.has(value);
1065
+ }
1066
+ var internalWriteDepth = 0;
1067
+ function isInternalWriting() {
1068
+ return internalWriteDepth > 0;
896
1069
  }
897
- var fromInternalWrite = false;
898
1070
  /**
899
1071
  * 内部写入,用于避免类型为只读的响应式对象写入报错
900
1072
  * @param fn 要执行的函数
901
1073
  * @internal
902
1074
  */
903
1075
  function internalWrite(fn) {
904
- fromInternalWrite = true;
905
- fn();
906
- fromInternalWrite = false;
1076
+ internalWriteDepth++;
1077
+ try {
1078
+ fn();
1079
+ } finally {
1080
+ internalWriteDepth--;
1081
+ }
907
1082
  }
908
1083
  var ObjectReactiveHandler = class {
909
1084
  isShallow;
@@ -913,32 +1088,44 @@ var ObjectReactiveHandler = class {
913
1088
  this.isShallow = config.shallow;
914
1089
  }
915
1090
  set(target, p, newValue, receiver) {
916
- if (this.isReadonly && !fromInternalWrite) throw reactiveErrorFn("Object is readonly!");
1091
+ if (this.isReadonly && !isInternalWriting()) throw reactiveErrorFn("Object is readonly!");
917
1092
  const rawValue = toRaw(newValue);
918
1093
  const oldValue = target[p];
919
1094
  const v = this.isShallow ? newValue : rawValue;
920
- if (oldValue === rawValue) return Reflect.set(target, p, v, receiver);
1095
+ if (Object.is(oldValue, rawValue)) return Reflect.set(target, p, v, receiver);
1096
+ const has = hasOwn(target, p);
921
1097
  const b = Reflect.set(target, p, v, receiver);
922
- fromInternalWrite = false;
923
- if (hasOwn(target, p)) trigger(target, TriggerOpTypes.Set, p);
924
- else trigger(target, TriggerOpTypes.Add, p);
1098
+ if (has) trigger(target, TriggerOpTypes.Set, p);
1099
+ else {
1100
+ trigger(target, TriggerOpTypes.Add, p);
1101
+ trigger(target, TriggerOpTypes.Iterate);
1102
+ }
925
1103
  return b;
926
1104
  }
927
1105
  get(target, p, receiver) {
928
1106
  track(target, TrackOpTypes.Get, p);
929
1107
  const value = Reflect.get(target, p, receiver);
930
- if (this.isShallow) return value;
1108
+ if (this.isShallow || !value || typeof value !== "object") return value;
931
1109
  return reactive(value);
932
1110
  }
933
1111
  deleteProperty(target, p) {
1112
+ if (this.isReadonly && !isInternalWriting()) throw reactiveErrorFn("Object is readonly!");
1113
+ const has = hasOwn(target, p);
934
1114
  const b = Reflect.deleteProperty(target, p);
935
- trigger(target, TriggerOpTypes.Delete, p);
1115
+ if (b && has) {
1116
+ trigger(target, TriggerOpTypes.Delete, p);
1117
+ trigger(target, TriggerOpTypes.Iterate);
1118
+ }
936
1119
  return b;
937
1120
  }
938
1121
  ownKeys(target) {
939
1122
  track(target, TrackOpTypes.Iterate);
940
1123
  return Reflect.ownKeys(target);
941
1124
  }
1125
+ has(target, p) {
1126
+ track(target, TrackOpTypes.Has, p);
1127
+ return Reflect.has(target, p);
1128
+ }
942
1129
  };
943
1130
  function noReactive(v) {
944
1131
  return v;
@@ -950,8 +1137,41 @@ var ArrayReactiveHandler = class extends ObjectReactiveHandler {
950
1137
  }
951
1138
  get(target, p, receiver) {
952
1139
  if (Reflect.has(this.interceptors, p) && p in target) return this.interceptors[p];
1140
+ if (p === "length") {
1141
+ track(target, TrackOpTypes.Iterate);
1142
+ return Reflect.get(target, p, receiver);
1143
+ }
953
1144
  return super.get(target, p, receiver);
954
1145
  }
1146
+ set(target, p, newValue, receiver) {
1147
+ if (this.isReadonly && !isInternalWriting()) throw reactiveErrorFn("Object is readonly!");
1148
+ if (p === "length") {
1149
+ const oldLength = target.length;
1150
+ const b = super.set(target, p, newValue, receiver);
1151
+ const newLength = target.length;
1152
+ if (newLength < oldLength) triggerArrayByRange(target, newLength, oldLength);
1153
+ if (oldLength !== newLength) trigger(target, TriggerOpTypes.Iterate);
1154
+ return b;
1155
+ }
1156
+ const rawValue = toRaw(newValue);
1157
+ const oldValue = target[p];
1158
+ const v = this.isShallow ? newValue : rawValue;
1159
+ if (Object.is(oldValue, rawValue)) return Reflect.set(target, p, v, receiver);
1160
+ const oldLength = target.length;
1161
+ const b = Reflect.set(target, p, v, receiver);
1162
+ const newLength = target.length;
1163
+ trigger(target, TriggerOpTypes.Set, p);
1164
+ trigger(target, TriggerOpTypes.Iterate);
1165
+ if (newLength > oldLength) trigger(target, TriggerOpTypes.Set, "length");
1166
+ return b;
1167
+ }
1168
+ deleteProperty(target, p) {
1169
+ if (this.isReadonly && !isInternalWriting()) throw reactiveErrorFn("Object is readonly!");
1170
+ const has = hasOwn(target, p);
1171
+ const b = Reflect.deleteProperty(target, p);
1172
+ if (b && has) trigger(target, TriggerOpTypes.Delete, p);
1173
+ return b;
1174
+ }
955
1175
  };
956
1176
  var MapReactiveHandler = class extends ObjectReactiveHandler {
957
1177
  interceptors = createMapHandlers(this.isShallow ? noReactive : reactive);
@@ -961,7 +1181,7 @@ var MapReactiveHandler = class extends ObjectReactiveHandler {
961
1181
  get(target, p, receiver) {
962
1182
  if (Reflect.has(this.interceptors, p) && p in target) return this.interceptors[p];
963
1183
  if (p === "size") {
964
- track(target, TrackOpTypes.Iterate, p);
1184
+ track(target, TrackOpTypes.Iterate);
965
1185
  return Reflect.get(target, p);
966
1186
  }
967
1187
  return super.get(target, p, receiver);
@@ -975,7 +1195,7 @@ var SetReactiveHandler = class extends ObjectReactiveHandler {
975
1195
  get(target, p, receiver) {
976
1196
  if (Reflect.has(this.interceptors, p) && p in target) return this.interceptors[p];
977
1197
  if (p === "size") {
978
- track(target, TrackOpTypes.Iterate, p);
1198
+ track(target, TrackOpTypes.Iterate);
979
1199
  return Reflect.get(target, p);
980
1200
  }
981
1201
  return super.get(target, p, receiver);
@@ -1119,6 +1339,30 @@ var refErrorFn = makeError("Ref");
1119
1339
  * }
1120
1340
  * }
1121
1341
  * ```
1342
+ * @example
1343
+ * ```tsx
1344
+ * function Child() {
1345
+ * return {
1346
+ * show() {
1347
+ * console.log('show')
1348
+ * },
1349
+ * render() {
1350
+ * return <div>child</div>
1351
+ * }
1352
+ * }
1353
+ * }
1354
+ * function App() {
1355
+ * const ref = createDynamicRef<typeof Child>((child) => {
1356
+ * child.show()
1357
+ * return () => {
1358
+ * console.log('destroy')
1359
+ * }
1360
+ * })
1361
+ * return () => {
1362
+ * return <Child ref={ref}/>
1363
+ * }
1364
+ * }
1365
+ * ```
1122
1366
  */
1123
1367
  function createDynamicRef(effect) {
1124
1368
  return effect;
@@ -1139,6 +1383,28 @@ function createDynamicRef(effect) {
1139
1383
  * }
1140
1384
  * }
1141
1385
  * ```
1386
+ * @example
1387
+ * ```tsx
1388
+ * function Child() {
1389
+ * return {
1390
+ * show() {
1391
+ * console.log('show')
1392
+ * },
1393
+ * render() {
1394
+ * return <div>child</div>
1395
+ * }
1396
+ * }
1397
+ * }
1398
+ * function App() {
1399
+ * const ref = createRef<typeof Child>()
1400
+ * onMounted(() => {
1401
+ * ref.value?.show()
1402
+ * })
1403
+ * return () => {
1404
+ * return <Child ref={ref}/>
1405
+ * }
1406
+ * }
1407
+ * ```
1142
1408
  */
1143
1409
  function createRef() {
1144
1410
  return createShallowReadonlyProxy({ value: null });
@@ -1228,7 +1494,7 @@ var Component = class {
1228
1494
  this.refEffects = /* @__PURE__ */ new Map();
1229
1495
  this.listener = new Dep(() => {
1230
1496
  this.markAsDirtied();
1231
- });
1497
+ }, "async");
1232
1498
  }
1233
1499
  markAsDirtied() {
1234
1500
  this._dirty = true;
@@ -1244,7 +1510,7 @@ var Component = class {
1244
1510
  componentSetupStack.push(this);
1245
1511
  const render = this.type(this.props);
1246
1512
  const isRenderFn = typeof render === "function";
1247
- this.instance = isRenderFn ? { $render: render } : render;
1513
+ this.instance = isRenderFn ? { render } : render;
1248
1514
  onMounted(() => {
1249
1515
  applyRefs(this.props.ref, this.instance, this.refEffects);
1250
1516
  return () => {
@@ -1255,9 +1521,9 @@ var Component = class {
1255
1521
  });
1256
1522
  componentSetupStack.pop();
1257
1523
  pushDepContext(this.listener);
1258
- const template = this.instance.$render();
1524
+ const template = this.instance.render();
1259
1525
  popDepContext();
1260
- update(template, this.instance.$portalHost);
1526
+ update(template);
1261
1527
  this.rendered();
1262
1528
  }
1263
1529
  updateProps(newProps) {
@@ -1282,7 +1548,7 @@ var Component = class {
1282
1548
  rerender() {
1283
1549
  this.listener.destroy();
1284
1550
  pushDepContext(this.listener);
1285
- const template = this.instance.$render();
1551
+ const template = this.instance.render();
1286
1552
  popDepContext();
1287
1553
  return template;
1288
1554
  }
@@ -1365,6 +1631,18 @@ function registryComponentDestroyCallback(fn) {
1365
1631
  }
1366
1632
  }
1367
1633
  //#endregion
1634
+ //#region src/base/_render-context.ts
1635
+ var containerStack = [];
1636
+ function pushContainer(container) {
1637
+ containerStack.push(container);
1638
+ }
1639
+ function popContainer() {
1640
+ containerStack.pop();
1641
+ }
1642
+ function getContainer() {
1643
+ return containerStack[containerStack.length - 1];
1644
+ }
1645
+ //#endregion
1368
1646
  //#region src/base/jsx-element.ts
1369
1647
  function Fragment(props) {
1370
1648
  return () => {
@@ -1402,8 +1680,8 @@ function withMark(marks, setup) {
1402
1680
  if (typeof componentRenderFn === "function") return function() {
1403
1681
  return applyMark(marks, componentRenderFn);
1404
1682
  };
1405
- const oldRender = componentRenderFn.$render;
1406
- componentRenderFn.$render = function() {
1683
+ const oldRender = componentRenderFn.render;
1684
+ componentRenderFn.render = function() {
1407
1685
  return applyMark(marks, () => {
1408
1686
  return oldRender.call(componentRenderFn);
1409
1687
  });
@@ -1442,7 +1720,7 @@ function applyMark(mark, render) {
1442
1720
  * return () => {
1443
1721
  * return (
1444
1722
  * <div>
1445
- * <Portal host={modal}>
1723
+ * <Portal container={modal}>
1446
1724
  * 这里的内容将渲染到 modal 节点
1447
1725
  * </Portal>
1448
1726
  * </div>
@@ -1452,12 +1730,10 @@ function applyMark(mark, render) {
1452
1730
  * ```
1453
1731
  */
1454
1732
  function Portal(props) {
1455
- return {
1456
- $portalHost: props.host,
1457
- $render() {
1458
- return props.children;
1459
- }
1460
- };
1733
+ return { render() {
1734
+ pushContainer(props.container);
1735
+ return props.children;
1736
+ } };
1461
1737
  }
1462
1738
  //#endregion
1463
1739
  //#region src/reactive/watch-effect.ts
@@ -1470,12 +1746,18 @@ function Portal(props) {
1470
1746
  function watchEffect(effect) {
1471
1747
  const dep = new Dep(function() {
1472
1748
  pushDepContext(dep);
1749
+ try {
1750
+ effect();
1751
+ } finally {
1752
+ popDepContext();
1753
+ }
1754
+ }, "async");
1755
+ pushDepContext(dep);
1756
+ try {
1473
1757
  effect();
1758
+ } finally {
1474
1759
  popDepContext();
1475
- });
1476
- pushDepContext(dep);
1477
- effect();
1478
- popDepContext();
1760
+ }
1479
1761
  function unWatch() {
1480
1762
  dep.destroy();
1481
1763
  }
@@ -1500,7 +1782,7 @@ function watch(trigger, callback) {
1500
1782
  return;
1501
1783
  }
1502
1784
  const newValue = trigger();
1503
- if (newValue !== oldValue) {
1785
+ if (!Object.is(newValue, oldValue)) {
1504
1786
  callback(newValue, oldValue);
1505
1787
  oldValue = newValue;
1506
1788
  }
@@ -1665,7 +1947,7 @@ var listenerReg = /^on[A-Z]/;
1665
1947
  var nativeNodeRefRecord = /* @__PURE__ */ new WeakMap();
1666
1948
  function createRenderer(component, nativeRenderer, namespace) {
1667
1949
  let isInit = true;
1668
- return function render(host) {
1950
+ return function render(container) {
1669
1951
  if (isInit) {
1670
1952
  isInit = false;
1671
1953
  componentRender(nativeRenderer, component, {
@@ -1679,8 +1961,8 @@ function createRenderer(component, nativeRenderer, namespace) {
1679
1961
  namespace
1680
1962
  }, {
1681
1963
  isParent: true,
1682
- host,
1683
- rootHost: host
1964
+ container,
1965
+ rootContainer: container
1684
1966
  });
1685
1967
  } else deepUpdateByComponentDirtyTree(nativeRenderer, component, false);
1686
1968
  };
@@ -1702,23 +1984,40 @@ function buildElementChildren(atom, nativeRenderer, parentComponent, context) {
1702
1984
  }
1703
1985
  }
1704
1986
  function patchComponent(nativeRenderer, component, oldChildAtom, newAtom, context, needMove) {
1705
- newAtom.child = createChildChain(component.rerender(), nativeRenderer, newAtom.namespace);
1987
+ const oldContainer = component.viewMetadata.container;
1988
+ const expectContainer = component.viewMetadata.expectContainer;
1989
+ const newTemplate = component.rerender();
1990
+ const portalContainer = getContainer();
1991
+ popContainer();
1992
+ if (portalContainer && portalContainer !== expectContainer) context = {
1993
+ isParent: true,
1994
+ container: portalContainer,
1995
+ rootContainer: portalContainer
1996
+ };
1997
+ component.viewMetadata = {
1998
+ atom: newAtom,
1999
+ expectContainer,
2000
+ ...context
2001
+ };
2002
+ if (oldContainer !== context.container) needMove = true;
2003
+ newAtom.child = createChildChain(newTemplate, nativeRenderer, newAtom.namespace);
1706
2004
  diff(nativeRenderer, component, newAtom.child, oldChildAtom, context, needMove);
2005
+ return context;
1707
2006
  }
1708
2007
  function deepUpdateByComponentDirtyTree(nativeRenderer, component, needMove) {
1709
2008
  if (component.dirty) {
1710
- const { atom, host, isParent, rootHost } = component.viewMetadata;
2009
+ const { atom, container, isParent, rootContainer } = component.viewMetadata;
1711
2010
  const context = {
1712
- host,
2011
+ container,
1713
2012
  isParent,
1714
- rootHost
2013
+ rootContainer
1715
2014
  };
1716
2015
  const diffAtom = atom.child;
1717
2016
  patchComponent(nativeRenderer, component, diffAtom, atom, context, needMove);
1718
2017
  const next = atom.sibling;
1719
2018
  if (next && next.jsxNode instanceof Component) {
1720
2019
  const view = next.jsxNode.viewMetadata;
1721
- view.host = context.host;
2020
+ view.container = context.container;
1722
2021
  view.isParent = context.isParent;
1723
2022
  }
1724
2023
  component.rendered();
@@ -1796,47 +2095,42 @@ function updateText(nativeRenderer, context, offset, needMove, newAtom, oldAtom)
1796
2095
  const nativeNode = oldAtom.nativeNode;
1797
2096
  newAtom.nativeNode = nativeNode;
1798
2097
  if (needMove || newAtom.index - offset !== oldAtom.index) insertNode(nativeRenderer, newAtom, context);
1799
- context.host = nativeNode;
2098
+ context.container = nativeNode;
1800
2099
  context.isParent = false;
1801
2100
  }
1802
2101
  function updateElement(nativeRenderer, context, parentComponent, offset, needMove, newAtom, oldAtom) {
1803
2102
  const nativeNode = oldAtom.nativeNode;
1804
2103
  newAtom.nativeNode = nativeNode;
1805
2104
  if (needMove || newAtom.index - offset !== oldAtom.index) insertNode(nativeRenderer, newAtom, context);
1806
- context.host = nativeNode;
2105
+ context.container = nativeNode;
1807
2106
  context.isParent = false;
1808
2107
  updateNativeNodeProperties(nativeRenderer, newAtom, oldAtom, parentComponent, {
1809
- host: nativeNode,
2108
+ container: nativeNode,
1810
2109
  isParent: true,
1811
- rootHost: context.rootHost
2110
+ rootContainer: context.rootContainer
1812
2111
  });
1813
2112
  }
1814
2113
  function updateComponent(nativeRenderer, context, offset, needMove, newAtom, oldAtom) {
1815
2114
  const component = oldAtom.jsxNode;
1816
- const portalHost = component.instance.$portalHost;
1817
- context = portalHost ? {
1818
- isParent: true,
1819
- host: portalHost,
1820
- rootHost: portalHost
1821
- } : context;
1822
- component.viewMetadata = {
1823
- atom: newAtom,
1824
- ...context
1825
- };
1826
2115
  const newProps = newAtom.jsxNode.props;
1827
2116
  newAtom.jsxNode = component;
1828
2117
  needMove = needMove || newAtom.index - offset !== oldAtom.index;
1829
2118
  const propsIsChanged = hasChange(newProps, component.props);
1830
2119
  if (propsIsChanged) component.updateProps(newProps);
1831
2120
  if (propsIsChanged || component.dirty) {
1832
- patchComponent(nativeRenderer, component, oldAtom.child, newAtom, context, needMove);
2121
+ const updatedContext = patchComponent(nativeRenderer, component, oldAtom.child, newAtom, context, needMove);
1833
2122
  const next = oldAtom.sibling;
1834
2123
  if (next && next.jsxNode instanceof Component) {
1835
2124
  const view = next.jsxNode.viewMetadata;
1836
- view.host = context.host;
1837
- view.isParent = context.isParent;
2125
+ view.container = updatedContext.container;
2126
+ view.isParent = updatedContext.isParent;
1838
2127
  }
1839
2128
  } else {
2129
+ component.viewMetadata = {
2130
+ atom: newAtom,
2131
+ expectContainer: component.viewMetadata.expectContainer,
2132
+ ...context
2133
+ };
1840
2134
  newAtom.child = oldAtom.child;
1841
2135
  reuseComponentView(nativeRenderer, newAtom.child, context, needMove, !component.changedSubComponents.size);
1842
2136
  }
@@ -1852,7 +2146,7 @@ function reuseComponentView(nativeRenderer, child, context, moveView, skipSubCom
1852
2146
  if (moveView) insertNode(nativeRenderer, atom, context);
1853
2147
  if (!skipSubComponentDiff) reuseElementChildrenView(nativeRenderer, atom, context);
1854
2148
  context.isParent = false;
1855
- context.host = atom.nativeNode;
2149
+ context.container = atom.nativeNode;
1856
2150
  }
1857
2151
  };
1858
2152
  while (child) {
@@ -1879,7 +2173,7 @@ function cleanElementChildren(atom, nativeRenderer) {
1879
2173
  function cleanView(nativeRenderer, atom, needClean) {
1880
2174
  if (atom.type === ComponentAtomType) {
1881
2175
  const jsxNode = atom.jsxNode;
1882
- if (jsxNode.instance.$portalHost) needClean = true;
2176
+ if (jsxNode.viewMetadata.container !== jsxNode.viewMetadata.expectContainer) needClean = true;
1883
2177
  cleanChildren(atom, nativeRenderer, needClean);
1884
2178
  jsxNode.destroy();
1885
2179
  return;
@@ -1907,15 +2201,19 @@ function cleanChildren(atom, nativeRenderer, needClean) {
1907
2201
  }
1908
2202
  }
1909
2203
  function componentRender(nativeRenderer, component, from, context) {
1910
- component.render((template, portalHost) => {
2204
+ component.render((template) => {
2205
+ const portalContainer = getContainer();
2206
+ popContainer();
1911
2207
  from.child = createChildChain(template, nativeRenderer, from.namespace);
1912
- context = portalHost ? {
2208
+ const expectContainer = context.container;
2209
+ context = portalContainer && portalContainer !== context.container ? {
1913
2210
  isParent: true,
1914
- host: portalHost,
1915
- rootHost: portalHost
2211
+ container: portalContainer,
2212
+ rootContainer: portalContainer
1916
2213
  } : context;
1917
2214
  component.viewMetadata = {
1918
2215
  atom: from,
2216
+ expectContainer,
1919
2217
  ...context
1920
2218
  };
1921
2219
  let child = from.child;
@@ -1972,9 +2270,9 @@ function createChildChain(template, nativeRenderer, namespace) {
1972
2270
  return beforeAtom.sibling;
1973
2271
  }
1974
2272
  function insertNode(nativeRenderer, atom, context) {
1975
- if (context.isParent) if (context.host === context.rootHost) nativeRenderer.appendChild(context.host, atom.nativeNode, atom.namespace);
1976
- else nativeRenderer.prependChild(context.host, atom.nativeNode, atom.namespace);
1977
- else nativeRenderer.insertAfter(atom.nativeNode, context.host, atom.namespace);
2273
+ if (context.isParent) if (context.container === context.rootContainer) nativeRenderer.appendChild(context.container, atom.nativeNode, atom.namespace);
2274
+ else nativeRenderer.prependChild(context.container, atom.nativeNode, atom.namespace);
2275
+ else nativeRenderer.insertAfter(atom.nativeNode, context.container, atom.namespace);
1978
2276
  }
1979
2277
  function createElementChildren(type, children, nativeRenderer, namespace) {
1980
2278
  return createChildChain(children, nativeRenderer, nativeRenderer.getNameSpace(type, namespace));
@@ -2014,10 +2312,10 @@ function createElement(nativeRenderer, atom, parentComponent, context) {
2014
2312
  insertNode(nativeRenderer, atom, context);
2015
2313
  buildElementChildren(atom, nativeRenderer, parentComponent, {
2016
2314
  isParent: true,
2017
- host: nativeNode,
2018
- rootHost: context.rootHost
2315
+ container: nativeNode,
2316
+ rootContainer: context.rootContainer
2019
2317
  });
2020
- context.host = nativeNode;
2318
+ context.container = nativeNode;
2021
2319
  context.isParent = false;
2022
2320
  if (bindingRefs) {
2023
2321
  const refEffects = /* @__PURE__ */ new Map();
@@ -2029,7 +2327,7 @@ function createTextNode(nativeRenderer, atom, context) {
2029
2327
  const nativeNode = nativeRenderer.createTextNode(atom.jsxNode, atom.namespace);
2030
2328
  atom.nativeNode = nativeNode;
2031
2329
  insertNode(nativeRenderer, atom, context);
2032
- context.host = nativeNode;
2330
+ context.container = nativeNode;
2033
2331
  context.isParent = false;
2034
2332
  }
2035
2333
  function updateNativeNodeProperties(nativeRenderer, newAtom, oldAtom, parentComponent, context) {
@@ -2168,7 +2466,7 @@ function viewfly(config) {
2168
2466
  const { context, nativeRenderer, autoUpdate, root } = Object.assign({ autoUpdate: true }, config);
2169
2467
  const modules = [];
2170
2468
  let destroyed = false;
2171
- let appHost = null;
2469
+ let appContainer = null;
2172
2470
  const rootProviders = [];
2173
2471
  const rootComponent = new RootComponent(() => {
2174
2472
  const rootContext = createContext(rootProviders, null, context);
@@ -2178,7 +2476,7 @@ function viewfly(config) {
2178
2476
  }, function() {
2179
2477
  if (destroyed || !autoUpdate) return;
2180
2478
  nextTick(() => {
2181
- render(appHost);
2479
+ render(appContainer);
2182
2480
  });
2183
2481
  });
2184
2482
  const render = createRenderer(rootComponent, nativeRenderer, config.elementNamespace);
@@ -2202,18 +2500,22 @@ function viewfly(config) {
2202
2500
  else modules.push(module);
2203
2501
  return app;
2204
2502
  },
2205
- mount(host) {
2503
+ mount(container) {
2206
2504
  if (isStarted) throw viewflyErrorFn("application has already started.");
2207
2505
  for (const module of modules) module.setup?.(app);
2208
2506
  isStarted = true;
2209
- appHost = host;
2210
- render(host);
2507
+ appContainer = container;
2508
+ render(container);
2211
2509
  for (const module of modules) module.onAfterStartup?.(app);
2212
2510
  if (!autoUpdate) return app;
2213
2511
  return app;
2214
2512
  },
2215
2513
  render() {
2216
- if (appHost) render(appHost);
2514
+ if (appContainer) {
2515
+ flushReactiveEffectsSync();
2516
+ render(appContainer);
2517
+ flushReactiveEffectsSync();
2518
+ }
2217
2519
  return app;
2218
2520
  },
2219
2521
  destroy() {
@@ -2234,9 +2536,31 @@ function viewfly(config) {
2234
2536
  * @returns 一个对象,对象的 value 属性是计算的值
2235
2537
  */
2236
2538
  function computed(getter) {
2237
- return { get value() {
2238
- return getter();
2539
+ let cacheValue;
2540
+ let dirty = true;
2541
+ const target = { get value() {
2542
+ if (dirty) {
2543
+ dep.destroy();
2544
+ pushDepContext(dep);
2545
+ try {
2546
+ cacheValue = getter();
2547
+ dirty = false;
2548
+ } finally {
2549
+ popDepContext();
2550
+ }
2551
+ }
2552
+ return cacheValue;
2239
2553
  } };
2554
+ const dep = new Dep(() => {
2555
+ if (!dirty) {
2556
+ dirty = true;
2557
+ trigger(target, TriggerOpTypes.Set, "value");
2558
+ }
2559
+ }, "sync");
2560
+ registryComponentDestroyCallback(() => {
2561
+ dep.destroy();
2562
+ });
2563
+ return new Proxy(target, readonlyProxyHandler);
2240
2564
  }
2241
2565
  //#endregion
2242
2566
  //#region src/reactive/shallow-reactive.ts
@@ -2258,7 +2582,7 @@ var defaultShallowSetReactiveHandler = new SetReactiveHandler({
2258
2582
  });
2259
2583
  function shallowReactive(raw) {
2260
2584
  if (isReactive(raw)) return raw;
2261
- let proxy = rawToProxyCache.get(raw);
2585
+ let proxy = shallowRawToProxyCache.get(raw);
2262
2586
  if (proxy) return proxy;
2263
2587
  switch (getStringType(raw)) {
2264
2588
  case "[object Object]":
@@ -2277,8 +2601,8 @@ function shallowReactive(raw) {
2277
2601
  break;
2278
2602
  default: return raw;
2279
2603
  }
2280
- rawToProxyCache.set(raw, proxy);
2281
- proxyToRawCache.set(proxy, raw);
2604
+ shallowRawToProxyCache.set(raw, proxy);
2605
+ shallowProxyToRawCache.set(proxy, raw);
2282
2606
  return proxy;
2283
2607
  }
2284
2608
  //#endregion
@@ -2317,4 +2641,4 @@ function createSignal(state) {
2317
2641
  return signal;
2318
2642
  }
2319
2643
  //#endregion
2320
- export { ArrayReactiveHandler, Component, Dep, ForwardRef, Fragment, Inject, InjectFlags, Injectable, InjectionToken, Injector, JSXNodeFactory, MapReactiveHandler, NativeRenderer, NullInjector, ObjectReactiveHandler, Optional, Portal, Prop, ReflectiveInjector, RootComponent, Scope, Self, SetReactiveHandler, SkipSelf, THROW_IF_NOT_FOUND, TrackOpTypes, TriggerOpTypes, Type, applyMark, applyRefs, comparePropsWithCallbacks, computed, createContext, createContextProvider, createDynamicRef, createRef, createRenderer, createShallowReadonlyProxy, createSignal, defaultArrayReactiveHandler, defaultMapReactiveHandler, defaultObjectReactiveHandler, defaultSetReactiveHandler, defaultShallowArrayReactiveHandler, defaultShallowMapReactiveHandler, defaultShallowObjectReactiveHandler, defaultShallowSetReactiveHandler, forwardRef, getCurrentInstance, getDepContext, getSetupContext, inject, internalWrite, isReactive, jsx, jsxs, makeError, normalizeProvider, onMounted, onUnmounted, onUpdated, popDepContext, proxyToRawCache, pushDepContext, rawToProxyCache, reactive, readonlyProxyHandler, registryComponentDestroyCallback, shallowReactive, toRaw, track, trigger, updateRefs, viewfly, watch, watchEffect, withAnnotation, withMark };
2644
+ export { ArrayReactiveHandler, Component, Dep, ForwardRef, Fragment, Inject, InjectFlags, Injectable, InjectionToken, Injector, JSXNodeFactory, MapReactiveHandler, NativeRenderer, NullInjector, ObjectReactiveHandler, Optional, Portal, Prop, ReflectiveInjector, RootComponent, Scope, Self, SetReactiveHandler, SkipSelf, THROW_IF_NOT_FOUND, TrackOpTypes, TriggerOpTypes, Type, applyMark, applyRefs, comparePropsWithCallbacks, computed, createContext, createContextProvider, createDynamicRef, createRef, createRenderer, createShallowReadonlyProxy, createSignal, defaultArrayReactiveHandler, defaultMapReactiveHandler, defaultObjectReactiveHandler, defaultSetReactiveHandler, defaultShallowArrayReactiveHandler, defaultShallowMapReactiveHandler, defaultShallowObjectReactiveHandler, defaultShallowSetReactiveHandler, flushReactiveEffectsSync, forwardRef, getCurrentInstance, getDepContext, getSetupContext, inject, internalWrite, isReactive, jsx, jsxs, makeError, nextTick, normalizeProvider, onMounted, onUnmounted, onUpdated, popDepContext, proxyToRawCache, pushDepContext, rawToProxyCache, reactive, readonlyProxyHandler, registryComponentDestroyCallback, shallowProxyToRawCache, shallowRawToProxyCache, shallowReactive, toRaw, track, trigger, updateRefs, viewfly, watch, watchEffect, withAnnotation, withMark };