@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/README.md +3 -3
- package/dist/base/_render-context.d.ts +4 -0
- package/dist/base/component.d.ts +5 -5
- package/dist/base/dep.d.ts +3 -2
- package/dist/base/jsx-element.d.ts +3 -4
- package/dist/base/ref.d.ts +46 -0
- package/dist/base/renderer.d.ts +1 -1
- package/dist/di/reflective-injector.d.ts +1 -1
- package/dist/index.esm.js +456 -132
- package/dist/index.js +564 -796
- package/dist/reactive/array-handlers.d.ts +3 -2
- package/dist/reactive/effect.d.ts +8 -1
- package/dist/reactive/map-handlers.d.ts +1 -1
- package/dist/reactive/reactive.d.ts +8 -3
- package/dist/viewfly.d.ts +1 -1
- package/package.json +1 -1
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
|
|
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
|
-
|
|
354
|
-
|
|
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
|
-
|
|
372
|
-
|
|
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.
|
|
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.
|
|
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
|
-
|
|
406
|
-
|
|
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.
|
|
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((
|
|
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 =
|
|
601
|
-
if (subscriber)
|
|
602
|
-
|
|
603
|
-
|
|
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.
|
|
608
|
-
|
|
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
|
|
643
|
-
return predicate.call(
|
|
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
|
-
|
|
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
|
-
|
|
699
|
-
|
|
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
|
-
|
|
704
|
-
|
|
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
|
-
|
|
725
|
-
|
|
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,
|
|
881
|
+
splice(start, ...items) {
|
|
731
882
|
const target = toRaw(this);
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
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
|
-
|
|
755
|
-
|
|
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
|
|
958
|
+
track(target, TrackOpTypes.Iterate);
|
|
797
959
|
target.forEach((v, k, m) => {
|
|
798
|
-
callbackFn.call(
|
|
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
|
|
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,
|
|
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 (
|
|
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
|
|
1007
|
+
track(target, TrackOpTypes.Iterate);
|
|
842
1008
|
target.forEach((v, k, m) => {
|
|
843
|
-
callbackFn.call(
|
|
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
|
|
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
|
-
|
|
905
|
-
|
|
906
|
-
|
|
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 && !
|
|
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
|
|
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
|
-
|
|
923
|
-
|
|
924
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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 ? {
|
|
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
|
|
1524
|
+
const template = this.instance.render();
|
|
1259
1525
|
popDepContext();
|
|
1260
|
-
update(template
|
|
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
|
|
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
|
|
1406
|
-
componentRenderFn
|
|
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
|
|
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
|
-
|
|
1457
|
-
|
|
1458
|
-
|
|
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
|
|
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(
|
|
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
|
-
|
|
1683
|
-
|
|
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
|
-
|
|
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,
|
|
2009
|
+
const { atom, container, isParent, rootContainer } = component.viewMetadata;
|
|
1711
2010
|
const context = {
|
|
1712
|
-
|
|
2011
|
+
container,
|
|
1713
2012
|
isParent,
|
|
1714
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
2105
|
+
context.container = nativeNode;
|
|
1807
2106
|
context.isParent = false;
|
|
1808
2107
|
updateNativeNodeProperties(nativeRenderer, newAtom, oldAtom, parentComponent, {
|
|
1809
|
-
|
|
2108
|
+
container: nativeNode,
|
|
1810
2109
|
isParent: true,
|
|
1811
|
-
|
|
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.
|
|
1837
|
-
view.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.
|
|
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.
|
|
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
|
|
2204
|
+
component.render((template) => {
|
|
2205
|
+
const portalContainer = getContainer();
|
|
2206
|
+
popContainer();
|
|
1911
2207
|
from.child = createChildChain(template, nativeRenderer, from.namespace);
|
|
1912
|
-
|
|
2208
|
+
const expectContainer = context.container;
|
|
2209
|
+
context = portalContainer && portalContainer !== context.container ? {
|
|
1913
2210
|
isParent: true,
|
|
1914
|
-
|
|
1915
|
-
|
|
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.
|
|
1976
|
-
else nativeRenderer.prependChild(context.
|
|
1977
|
-
else nativeRenderer.insertAfter(atom.nativeNode, context.
|
|
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
|
-
|
|
2018
|
-
|
|
2315
|
+
container: nativeNode,
|
|
2316
|
+
rootContainer: context.rootContainer
|
|
2019
2317
|
});
|
|
2020
|
-
context.
|
|
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.
|
|
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
|
|
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(
|
|
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(
|
|
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
|
-
|
|
2210
|
-
render(
|
|
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 (
|
|
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
|
-
|
|
2238
|
-
|
|
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 =
|
|
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
|
-
|
|
2281
|
-
|
|
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 };
|