@viewfly/core 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/foundation/component.d.ts +26 -21
- package/bundles/foundation/types.d.ts +3 -3
- package/bundles/index.esm.js +50 -22
- package/bundles/index.js +56 -26
- package/package.json +2 -2
|
@@ -26,7 +26,7 @@ export declare class Component extends ReflectiveInjector implements JSXTypeof<J
|
|
|
26
26
|
protected _dirty: boolean;
|
|
27
27
|
protected _changed: boolean;
|
|
28
28
|
private unWatch?;
|
|
29
|
-
private
|
|
29
|
+
private isFirstRendering;
|
|
30
30
|
private refs;
|
|
31
31
|
constructor(parentComponent: Injector | null, type: JSXInternal.ComponentSetup, props: Props, key?: Key | undefined);
|
|
32
32
|
markAsDirtied(): void;
|
|
@@ -107,7 +107,7 @@ export type ExtractInstanceType<T, U = T extends (...args: any) => any ? ReturnT
|
|
|
107
107
|
export interface AbstractInstanceType<T extends Record<string, any>> {
|
|
108
108
|
(): T & JSXInternal.ComponentInstance<any>;
|
|
109
109
|
}
|
|
110
|
-
export declare class
|
|
110
|
+
export declare class DynamicRef<T> {
|
|
111
111
|
private callback;
|
|
112
112
|
private unBindMap;
|
|
113
113
|
private targetCaches;
|
|
@@ -121,7 +121,7 @@ export declare class Ref<T> {
|
|
|
121
121
|
* @example
|
|
122
122
|
* ```tsx
|
|
123
123
|
* function App() {
|
|
124
|
-
* const ref =
|
|
124
|
+
* const ref = createDynamicRef(node => {
|
|
125
125
|
* function fn() {
|
|
126
126
|
* // do something...
|
|
127
127
|
* }
|
|
@@ -136,7 +136,12 @@ export declare class Ref<T> {
|
|
|
136
136
|
* }
|
|
137
137
|
* ```
|
|
138
138
|
*/
|
|
139
|
-
export declare function
|
|
139
|
+
export declare function createDynamicRef<T, U = ExtractInstanceType<T>>(callback: RefListener<U>): DynamicRef<U>;
|
|
140
|
+
export declare class StaticRef<T> extends DynamicRef<T> {
|
|
141
|
+
readonly current: T | null;
|
|
142
|
+
constructor();
|
|
143
|
+
}
|
|
144
|
+
export declare function createRef<T, U = ExtractInstanceType<T>>(): StaticRef<U>;
|
|
140
145
|
declare const depsKey: unique symbol;
|
|
141
146
|
/**
|
|
142
147
|
* 组件状态实例,直接调用可以获取最新的状态,通过 set 方法可以更新状态
|
|
@@ -162,7 +167,7 @@ export interface Signal<T> {
|
|
|
162
167
|
* ```tsx
|
|
163
168
|
* function App() {
|
|
164
169
|
* // 初始化状态
|
|
165
|
-
* const state =
|
|
170
|
+
* const state = createSignal(1)
|
|
166
171
|
*
|
|
167
172
|
* return () => {
|
|
168
173
|
* <div>
|
|
@@ -178,7 +183,7 @@ export interface Signal<T> {
|
|
|
178
183
|
* }
|
|
179
184
|
* }
|
|
180
185
|
*/
|
|
181
|
-
export declare function
|
|
186
|
+
export declare function createSignal<T>(state: T): Signal<T>;
|
|
182
187
|
/**
|
|
183
188
|
* 使用派生值,Viewfly 会收集回调函数内同步执行时访问的 Signal,
|
|
184
189
|
* 并在你获取 useDerived 函数返回的 Signal 的值时,自动计算最新的值。
|
|
@@ -186,28 +191,28 @@ export declare function useSignal<T>(state: T): Signal<T>;
|
|
|
186
191
|
* @param callback
|
|
187
192
|
* @param isContinue 可选的停止函数,在每次值更新后调用,当返回值为 false 时,将不再监听依赖的变化
|
|
188
193
|
*/
|
|
189
|
-
export declare function
|
|
190
|
-
export interface
|
|
194
|
+
export declare function createDerived<T>(callback: () => T, isContinue?: (data: T) => unknown): Signal<T>;
|
|
195
|
+
export interface WatchCallback<T, U> {
|
|
191
196
|
(newValue: T, oldValue: U): void | (() => void);
|
|
192
197
|
}
|
|
193
198
|
/**
|
|
194
199
|
* 监听状态变化,当任意一个状态发生变更时,触发回调。
|
|
195
|
-
*
|
|
200
|
+
* watch 会返回一个取消监听的函数,调用此函数,可以取消监听。
|
|
196
201
|
* 当在组件中调用时,组件销毁时会自动取消监听。
|
|
197
202
|
* @param deps 依赖的状态 Signal,可以是一个 Signal,只可以一个数包含 Signal 的数组,或者是一个求值函数
|
|
198
|
-
* @param
|
|
203
|
+
* @param callback 状态变更后的回调函数
|
|
199
204
|
*/
|
|
200
|
-
export declare function
|
|
201
|
-
export declare function
|
|
202
|
-
export declare function
|
|
203
|
-
export declare function
|
|
204
|
-
export declare function
|
|
205
|
-
export declare function
|
|
206
|
-
export declare function
|
|
207
|
-
export declare function
|
|
208
|
-
export declare function
|
|
209
|
-
export declare function
|
|
210
|
-
export declare function
|
|
205
|
+
export declare function watch<T>(deps: Signal<T>, callback: WatchCallback<T, T>): () => void;
|
|
206
|
+
export declare function watch<T>(deps: [Signal<T>], callback: WatchCallback<[T], [T]>): () => void;
|
|
207
|
+
export declare function watch<T, T1>(deps: [Signal<T>, Signal<T1>], callback: WatchCallback<[T, T1], [T, T1]>): () => void;
|
|
208
|
+
export declare function watch<T, T1, T2>(deps: [Signal<T>, Signal<T1>, Signal<T2>], callback: WatchCallback<[T, T1, T2], [T, T1, T2]>): () => void;
|
|
209
|
+
export declare function watch<T, T1, T2, T3>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>], callback: WatchCallback<[T, T1, T2, T3], [T, T1, T2, T3]>): () => void;
|
|
210
|
+
export declare function watch<T, T1, T2, T3, T4>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>], callback: WatchCallback<[T, T1, T2, T3, T4], [T, T1, T2, T3, T4]>): () => void;
|
|
211
|
+
export declare function watch<T, T1, T2, T3, T4, T5>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>, Signal<T5>], callback: WatchCallback<[T, T1, T2, T3, T4, T5], [T, T1, T2, T3, T4, T5]>): () => void;
|
|
212
|
+
export declare function watch<T, T1, T2, T3, T4, T5, T6>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>, Signal<T5>, Signal<T6>], callback: WatchCallback<[T, T1, T2, T3, T4, T5, T6], [T, T1, T2, T3, T4, T5, T6]>): () => void;
|
|
213
|
+
export declare function watch<T, T1, T2, T3, T4, T5, T6, T7>(deps: [Signal<T>, Signal<T1>, Signal<T2>, Signal<T3>, Signal<T4>, Signal<T5>, Signal<T6>, Signal<T7>], callback: WatchCallback<[T, T1, T2, T3, T4, T5, T6, T7], [T, T1, T2, T3, T4, T5, T6, T7]>): () => void;
|
|
214
|
+
export declare function watch<T>(deps: () => T, callback: WatchCallback<T, T>): () => void;
|
|
215
|
+
export declare function watch<T = any>(deps: Signal<any>[], callback: WatchCallback<T[], T[]>): () => void;
|
|
211
216
|
/**
|
|
212
217
|
* 通过 IoC 容器当前组件提供上下文共享数据的方法
|
|
213
218
|
* @param provider
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Key } from './jsx-element';
|
|
2
|
-
import { ExtractInstanceType,
|
|
2
|
+
import { ExtractInstanceType, DynamicRef } from './component';
|
|
3
3
|
import { Scope } from '../di/injectable';
|
|
4
4
|
export type JSXNode = JSXInternal.JSXNode;
|
|
5
5
|
export declare namespace JSXInternal {
|
|
@@ -19,7 +19,7 @@ export declare namespace JSXInternal {
|
|
|
19
19
|
ref?: any;
|
|
20
20
|
}
|
|
21
21
|
interface RefAttributes<T> extends IntrinsicAttributes {
|
|
22
|
-
ref?:
|
|
22
|
+
ref?: DynamicRef<ExtractInstanceType<T>> | DynamicRef<ExtractInstanceType<T>>[];
|
|
23
23
|
}
|
|
24
24
|
interface ElementClass<P = any> extends ComponentInstance<P> {
|
|
25
25
|
}
|
|
@@ -29,6 +29,6 @@ export declare namespace JSXInternal {
|
|
|
29
29
|
[name: string]: any;
|
|
30
30
|
}
|
|
31
31
|
interface IntrinsicClassAttributes<T> {
|
|
32
|
-
ref?:
|
|
32
|
+
ref?: DynamicRef<T>;
|
|
33
33
|
}
|
|
34
34
|
}
|
package/bundles/index.esm.js
CHANGED
|
@@ -674,7 +674,7 @@ class Component extends ReflectiveInjector {
|
|
|
674
674
|
this.propsChangedDestroyCallbacks = [];
|
|
675
675
|
this._dirty = true;
|
|
676
676
|
this._changed = true;
|
|
677
|
-
this.
|
|
677
|
+
this.isFirstRendering = true;
|
|
678
678
|
}
|
|
679
679
|
markAsDirtied() {
|
|
680
680
|
this._dirty = true;
|
|
@@ -728,7 +728,7 @@ class Component extends ReflectiveInjector {
|
|
|
728
728
|
signalDepsStack.push([]);
|
|
729
729
|
const template = this.instance.$render();
|
|
730
730
|
const deps = signalDepsStack.pop();
|
|
731
|
-
this.unWatch =
|
|
731
|
+
this.unWatch = watch(Array.from(new Set(deps)), () => {
|
|
732
732
|
this.markAsDirtied();
|
|
733
733
|
});
|
|
734
734
|
this.template = template;
|
|
@@ -764,7 +764,7 @@ class Component extends ReflectiveInjector {
|
|
|
764
764
|
signalDepsStack.push([]);
|
|
765
765
|
this.template = this.instance.$render();
|
|
766
766
|
const deps = signalDepsStack.pop();
|
|
767
|
-
this.unWatch =
|
|
767
|
+
this.unWatch = watch(Array.from(new Set(deps)), () => {
|
|
768
768
|
this.markAsDirtied();
|
|
769
769
|
});
|
|
770
770
|
return this.template;
|
|
@@ -775,15 +775,19 @@ class Component extends ReflectiveInjector {
|
|
|
775
775
|
}
|
|
776
776
|
rendered() {
|
|
777
777
|
this.changedSubComponents.clear();
|
|
778
|
-
const is = this.
|
|
779
|
-
this.
|
|
778
|
+
const is = this.isFirstRendering;
|
|
779
|
+
this.isFirstRendering = false;
|
|
780
780
|
this._dirty = this._changed = false;
|
|
781
|
+
this.invokeUpdatedHooks();
|
|
781
782
|
if (is) {
|
|
782
|
-
this.invokeUpdatedHooks();
|
|
783
783
|
this.invokeMountHooks();
|
|
784
784
|
}
|
|
785
|
-
|
|
786
|
-
|
|
785
|
+
if (this.changed) {
|
|
786
|
+
Promise.resolve().then(() => {
|
|
787
|
+
if (this.parentComponent instanceof Component) {
|
|
788
|
+
this.parentComponent.markAsChanged(this);
|
|
789
|
+
}
|
|
790
|
+
});
|
|
787
791
|
}
|
|
788
792
|
}
|
|
789
793
|
destroy() {
|
|
@@ -841,7 +845,7 @@ class Component extends ReflectiveInjector {
|
|
|
841
845
|
}
|
|
842
846
|
function toRefs(ref) {
|
|
843
847
|
return (Array.isArray(ref) ? ref : [ref]).filter(i => {
|
|
844
|
-
return i instanceof
|
|
848
|
+
return i instanceof DynamicRef;
|
|
845
849
|
});
|
|
846
850
|
}
|
|
847
851
|
/**
|
|
@@ -922,7 +926,7 @@ function onUnmounted(callback) {
|
|
|
922
926
|
const component = getSetupContext();
|
|
923
927
|
component.unmountedCallbacks.push(callback);
|
|
924
928
|
}
|
|
925
|
-
class
|
|
929
|
+
class DynamicRef {
|
|
926
930
|
constructor(callback) {
|
|
927
931
|
this.callback = callback;
|
|
928
932
|
this.unBindMap = new Map();
|
|
@@ -956,7 +960,7 @@ class Ref {
|
|
|
956
960
|
* @example
|
|
957
961
|
* ```tsx
|
|
958
962
|
* function App() {
|
|
959
|
-
* const ref =
|
|
963
|
+
* const ref = createDynamicRef(node => {
|
|
960
964
|
* function fn() {
|
|
961
965
|
* // do something...
|
|
962
966
|
* }
|
|
@@ -971,8 +975,32 @@ class Ref {
|
|
|
971
975
|
* }
|
|
972
976
|
* ```
|
|
973
977
|
*/
|
|
974
|
-
function
|
|
975
|
-
return new
|
|
978
|
+
function createDynamicRef(callback) {
|
|
979
|
+
return new DynamicRef(callback);
|
|
980
|
+
}
|
|
981
|
+
const initValue = {};
|
|
982
|
+
class StaticRef extends DynamicRef {
|
|
983
|
+
constructor() {
|
|
984
|
+
let value = initValue;
|
|
985
|
+
let isInit = false;
|
|
986
|
+
super(v => {
|
|
987
|
+
if (v !== initValue && !isInit) {
|
|
988
|
+
value = v;
|
|
989
|
+
isInit = true;
|
|
990
|
+
}
|
|
991
|
+
});
|
|
992
|
+
Object.defineProperty(this, 'current', {
|
|
993
|
+
get() {
|
|
994
|
+
if (value === initValue) {
|
|
995
|
+
return null;
|
|
996
|
+
}
|
|
997
|
+
return value;
|
|
998
|
+
}
|
|
999
|
+
});
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
function createRef() {
|
|
1003
|
+
return new StaticRef();
|
|
976
1004
|
}
|
|
977
1005
|
const depsKey = Symbol('deps');
|
|
978
1006
|
/**
|
|
@@ -982,7 +1010,7 @@ const depsKey = Symbol('deps');
|
|
|
982
1010
|
* ```tsx
|
|
983
1011
|
* function App() {
|
|
984
1012
|
* // 初始化状态
|
|
985
|
-
* const state =
|
|
1013
|
+
* const state = createSignal(1)
|
|
986
1014
|
*
|
|
987
1015
|
* return () => {
|
|
988
1016
|
* <div>
|
|
@@ -998,7 +1026,7 @@ const depsKey = Symbol('deps');
|
|
|
998
1026
|
* }
|
|
999
1027
|
* }
|
|
1000
1028
|
*/
|
|
1001
|
-
function
|
|
1029
|
+
function createSignal(state) {
|
|
1002
1030
|
function signal() {
|
|
1003
1031
|
const depsContext = getSignalDepsContext();
|
|
1004
1032
|
if (depsContext) {
|
|
@@ -1084,9 +1112,9 @@ function listen(model, deps, callback, isContinue) {
|
|
|
1084
1112
|
* @param callback
|
|
1085
1113
|
* @param isContinue 可选的停止函数,在每次值更新后调用,当返回值为 false 时,将不再监听依赖的变化
|
|
1086
1114
|
*/
|
|
1087
|
-
function
|
|
1115
|
+
function createDerived(callback, isContinue) {
|
|
1088
1116
|
const { data, deps } = invokeDepFn(callback);
|
|
1089
|
-
const signal =
|
|
1117
|
+
const signal = createSignal(data);
|
|
1090
1118
|
const component = getSetupContext(false);
|
|
1091
1119
|
const unListen = listen(signal, deps, callback, isContinue);
|
|
1092
1120
|
if (component) {
|
|
@@ -1097,9 +1125,9 @@ function useDerived(callback, isContinue) {
|
|
|
1097
1125
|
return signal;
|
|
1098
1126
|
}
|
|
1099
1127
|
/* eslint-enable max-len*/
|
|
1100
|
-
function
|
|
1128
|
+
function watch(deps, callback) {
|
|
1101
1129
|
if (typeof deps === 'function' && !deps.$isSignal) {
|
|
1102
|
-
deps =
|
|
1130
|
+
deps = createDerived(deps);
|
|
1103
1131
|
}
|
|
1104
1132
|
const signals = Array.isArray(deps) ? deps : [deps];
|
|
1105
1133
|
let oldValues = signals.map(s => s());
|
|
@@ -1109,7 +1137,7 @@ function useEffect(deps, effect) {
|
|
|
1109
1137
|
prevCleanup();
|
|
1110
1138
|
}
|
|
1111
1139
|
const newValues = signals.map(s => s());
|
|
1112
|
-
prevCleanup = Array.isArray(deps) ?
|
|
1140
|
+
prevCleanup = Array.isArray(deps) ? callback(newValues, oldValues) : callback(newValues[0], oldValues[0]);
|
|
1113
1141
|
oldValues = newValues;
|
|
1114
1142
|
}
|
|
1115
1143
|
for (const dep of signals) {
|
|
@@ -1769,7 +1797,7 @@ function updateNativeNodeProperties(nativeRenderer, newVNode, oldVNode, nativeNo
|
|
|
1769
1797
|
function applyRefs(refs, nativeNode, binding) {
|
|
1770
1798
|
const refList = Array.isArray(refs) ? refs : [refs];
|
|
1771
1799
|
for (const item of refList) {
|
|
1772
|
-
if (item instanceof
|
|
1800
|
+
if (item instanceof DynamicRef) {
|
|
1773
1801
|
binding ? item.bind(nativeNode) : item.unBind(nativeNode);
|
|
1774
1802
|
}
|
|
1775
1803
|
}
|
|
@@ -1896,4 +1924,4 @@ function viewfly(config) {
|
|
|
1896
1924
|
return app;
|
|
1897
1925
|
}
|
|
1898
1926
|
|
|
1899
|
-
export { Component, ForwardRef, Fragment, Inject, InjectFlags, Injectable, InjectionToken, Injector, JSXComponent, JSXElement, JSXText, NativeRenderer, NullInjector, Optional, Prop,
|
|
1927
|
+
export { Component, DynamicRef, ForwardRef, Fragment, Inject, InjectFlags, Injectable, InjectionToken, Injector, JSXComponent, JSXElement, JSXText, NativeRenderer, NullInjector, Optional, Prop, ReflectiveInjector, RootComponent, Scope, Self, SkipSelf, StaticRef, THROW_IF_NOT_FOUND, Type, createDerived, createDynamicRef, createRef, createRenderer, createSignal, forwardRef, getCurrentInstance, inject, jsx, jsxs, makeError, normalizeProvider, onMounted, onPropsChanged, onUnmounted, onUpdated, provide, viewfly, watch, withMemo };
|
package/bundles/index.js
CHANGED
|
@@ -676,7 +676,7 @@ class Component extends ReflectiveInjector {
|
|
|
676
676
|
this.propsChangedDestroyCallbacks = [];
|
|
677
677
|
this._dirty = true;
|
|
678
678
|
this._changed = true;
|
|
679
|
-
this.
|
|
679
|
+
this.isFirstRendering = true;
|
|
680
680
|
}
|
|
681
681
|
markAsDirtied() {
|
|
682
682
|
this._dirty = true;
|
|
@@ -730,7 +730,7 @@ class Component extends ReflectiveInjector {
|
|
|
730
730
|
signalDepsStack.push([]);
|
|
731
731
|
const template = this.instance.$render();
|
|
732
732
|
const deps = signalDepsStack.pop();
|
|
733
|
-
this.unWatch =
|
|
733
|
+
this.unWatch = watch(Array.from(new Set(deps)), () => {
|
|
734
734
|
this.markAsDirtied();
|
|
735
735
|
});
|
|
736
736
|
this.template = template;
|
|
@@ -766,7 +766,7 @@ class Component extends ReflectiveInjector {
|
|
|
766
766
|
signalDepsStack.push([]);
|
|
767
767
|
this.template = this.instance.$render();
|
|
768
768
|
const deps = signalDepsStack.pop();
|
|
769
|
-
this.unWatch =
|
|
769
|
+
this.unWatch = watch(Array.from(new Set(deps)), () => {
|
|
770
770
|
this.markAsDirtied();
|
|
771
771
|
});
|
|
772
772
|
return this.template;
|
|
@@ -777,15 +777,19 @@ class Component extends ReflectiveInjector {
|
|
|
777
777
|
}
|
|
778
778
|
rendered() {
|
|
779
779
|
this.changedSubComponents.clear();
|
|
780
|
-
const is = this.
|
|
781
|
-
this.
|
|
780
|
+
const is = this.isFirstRendering;
|
|
781
|
+
this.isFirstRendering = false;
|
|
782
782
|
this._dirty = this._changed = false;
|
|
783
|
+
this.invokeUpdatedHooks();
|
|
783
784
|
if (is) {
|
|
784
|
-
this.invokeUpdatedHooks();
|
|
785
785
|
this.invokeMountHooks();
|
|
786
786
|
}
|
|
787
|
-
|
|
788
|
-
|
|
787
|
+
if (this.changed) {
|
|
788
|
+
Promise.resolve().then(() => {
|
|
789
|
+
if (this.parentComponent instanceof Component) {
|
|
790
|
+
this.parentComponent.markAsChanged(this);
|
|
791
|
+
}
|
|
792
|
+
});
|
|
789
793
|
}
|
|
790
794
|
}
|
|
791
795
|
destroy() {
|
|
@@ -843,7 +847,7 @@ class Component extends ReflectiveInjector {
|
|
|
843
847
|
}
|
|
844
848
|
function toRefs(ref) {
|
|
845
849
|
return (Array.isArray(ref) ? ref : [ref]).filter(i => {
|
|
846
|
-
return i instanceof
|
|
850
|
+
return i instanceof DynamicRef;
|
|
847
851
|
});
|
|
848
852
|
}
|
|
849
853
|
/**
|
|
@@ -924,7 +928,7 @@ function onUnmounted(callback) {
|
|
|
924
928
|
const component = getSetupContext();
|
|
925
929
|
component.unmountedCallbacks.push(callback);
|
|
926
930
|
}
|
|
927
|
-
class
|
|
931
|
+
class DynamicRef {
|
|
928
932
|
constructor(callback) {
|
|
929
933
|
this.callback = callback;
|
|
930
934
|
this.unBindMap = new Map();
|
|
@@ -958,7 +962,7 @@ class Ref {
|
|
|
958
962
|
* @example
|
|
959
963
|
* ```tsx
|
|
960
964
|
* function App() {
|
|
961
|
-
* const ref =
|
|
965
|
+
* const ref = createDynamicRef(node => {
|
|
962
966
|
* function fn() {
|
|
963
967
|
* // do something...
|
|
964
968
|
* }
|
|
@@ -973,8 +977,32 @@ class Ref {
|
|
|
973
977
|
* }
|
|
974
978
|
* ```
|
|
975
979
|
*/
|
|
976
|
-
function
|
|
977
|
-
return new
|
|
980
|
+
function createDynamicRef(callback) {
|
|
981
|
+
return new DynamicRef(callback);
|
|
982
|
+
}
|
|
983
|
+
const initValue = {};
|
|
984
|
+
class StaticRef extends DynamicRef {
|
|
985
|
+
constructor() {
|
|
986
|
+
let value = initValue;
|
|
987
|
+
let isInit = false;
|
|
988
|
+
super(v => {
|
|
989
|
+
if (v !== initValue && !isInit) {
|
|
990
|
+
value = v;
|
|
991
|
+
isInit = true;
|
|
992
|
+
}
|
|
993
|
+
});
|
|
994
|
+
Object.defineProperty(this, 'current', {
|
|
995
|
+
get() {
|
|
996
|
+
if (value === initValue) {
|
|
997
|
+
return null;
|
|
998
|
+
}
|
|
999
|
+
return value;
|
|
1000
|
+
}
|
|
1001
|
+
});
|
|
1002
|
+
}
|
|
1003
|
+
}
|
|
1004
|
+
function createRef() {
|
|
1005
|
+
return new StaticRef();
|
|
978
1006
|
}
|
|
979
1007
|
const depsKey = Symbol('deps');
|
|
980
1008
|
/**
|
|
@@ -984,7 +1012,7 @@ const depsKey = Symbol('deps');
|
|
|
984
1012
|
* ```tsx
|
|
985
1013
|
* function App() {
|
|
986
1014
|
* // 初始化状态
|
|
987
|
-
* const state =
|
|
1015
|
+
* const state = createSignal(1)
|
|
988
1016
|
*
|
|
989
1017
|
* return () => {
|
|
990
1018
|
* <div>
|
|
@@ -1000,7 +1028,7 @@ const depsKey = Symbol('deps');
|
|
|
1000
1028
|
* }
|
|
1001
1029
|
* }
|
|
1002
1030
|
*/
|
|
1003
|
-
function
|
|
1031
|
+
function createSignal(state) {
|
|
1004
1032
|
function signal() {
|
|
1005
1033
|
const depsContext = getSignalDepsContext();
|
|
1006
1034
|
if (depsContext) {
|
|
@@ -1086,9 +1114,9 @@ function listen(model, deps, callback, isContinue) {
|
|
|
1086
1114
|
* @param callback
|
|
1087
1115
|
* @param isContinue 可选的停止函数,在每次值更新后调用,当返回值为 false 时,将不再监听依赖的变化
|
|
1088
1116
|
*/
|
|
1089
|
-
function
|
|
1117
|
+
function createDerived(callback, isContinue) {
|
|
1090
1118
|
const { data, deps } = invokeDepFn(callback);
|
|
1091
|
-
const signal =
|
|
1119
|
+
const signal = createSignal(data);
|
|
1092
1120
|
const component = getSetupContext(false);
|
|
1093
1121
|
const unListen = listen(signal, deps, callback, isContinue);
|
|
1094
1122
|
if (component) {
|
|
@@ -1099,9 +1127,9 @@ function useDerived(callback, isContinue) {
|
|
|
1099
1127
|
return signal;
|
|
1100
1128
|
}
|
|
1101
1129
|
/* eslint-enable max-len*/
|
|
1102
|
-
function
|
|
1130
|
+
function watch(deps, callback) {
|
|
1103
1131
|
if (typeof deps === 'function' && !deps.$isSignal) {
|
|
1104
|
-
deps =
|
|
1132
|
+
deps = createDerived(deps);
|
|
1105
1133
|
}
|
|
1106
1134
|
const signals = Array.isArray(deps) ? deps : [deps];
|
|
1107
1135
|
let oldValues = signals.map(s => s());
|
|
@@ -1111,7 +1139,7 @@ function useEffect(deps, effect) {
|
|
|
1111
1139
|
prevCleanup();
|
|
1112
1140
|
}
|
|
1113
1141
|
const newValues = signals.map(s => s());
|
|
1114
|
-
prevCleanup = Array.isArray(deps) ?
|
|
1142
|
+
prevCleanup = Array.isArray(deps) ? callback(newValues, oldValues) : callback(newValues[0], oldValues[0]);
|
|
1115
1143
|
oldValues = newValues;
|
|
1116
1144
|
}
|
|
1117
1145
|
for (const dep of signals) {
|
|
@@ -1771,7 +1799,7 @@ function updateNativeNodeProperties(nativeRenderer, newVNode, oldVNode, nativeNo
|
|
|
1771
1799
|
function applyRefs(refs, nativeNode, binding) {
|
|
1772
1800
|
const refList = Array.isArray(refs) ? refs : [refs];
|
|
1773
1801
|
for (const item of refList) {
|
|
1774
|
-
if (item instanceof
|
|
1802
|
+
if (item instanceof DynamicRef) {
|
|
1775
1803
|
binding ? item.bind(nativeNode) : item.unBind(nativeNode);
|
|
1776
1804
|
}
|
|
1777
1805
|
}
|
|
@@ -1899,6 +1927,7 @@ function viewfly(config) {
|
|
|
1899
1927
|
}
|
|
1900
1928
|
|
|
1901
1929
|
exports.Component = Component;
|
|
1930
|
+
exports.DynamicRef = DynamicRef;
|
|
1902
1931
|
exports.ForwardRef = ForwardRef;
|
|
1903
1932
|
exports.Fragment = Fragment;
|
|
1904
1933
|
exports.Inject = Inject;
|
|
@@ -1912,15 +1941,19 @@ exports.NativeRenderer = NativeRenderer;
|
|
|
1912
1941
|
exports.NullInjector = NullInjector;
|
|
1913
1942
|
exports.Optional = Optional;
|
|
1914
1943
|
exports.Prop = Prop;
|
|
1915
|
-
exports.Ref = Ref;
|
|
1916
1944
|
exports.ReflectiveInjector = ReflectiveInjector;
|
|
1917
1945
|
exports.RootComponent = RootComponent;
|
|
1918
1946
|
exports.Scope = Scope;
|
|
1919
1947
|
exports.Self = Self;
|
|
1920
1948
|
exports.SkipSelf = SkipSelf;
|
|
1949
|
+
exports.StaticRef = StaticRef;
|
|
1921
1950
|
exports.THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND;
|
|
1922
1951
|
exports.Type = Type;
|
|
1952
|
+
exports.createDerived = createDerived;
|
|
1953
|
+
exports.createDynamicRef = createDynamicRef;
|
|
1954
|
+
exports.createRef = createRef;
|
|
1923
1955
|
exports.createRenderer = createRenderer;
|
|
1956
|
+
exports.createSignal = createSignal;
|
|
1924
1957
|
exports.forwardRef = forwardRef;
|
|
1925
1958
|
exports.getCurrentInstance = getCurrentInstance;
|
|
1926
1959
|
exports.inject = inject;
|
|
@@ -1933,9 +1966,6 @@ exports.onPropsChanged = onPropsChanged;
|
|
|
1933
1966
|
exports.onUnmounted = onUnmounted;
|
|
1934
1967
|
exports.onUpdated = onUpdated;
|
|
1935
1968
|
exports.provide = provide;
|
|
1936
|
-
exports.useDerived = useDerived;
|
|
1937
|
-
exports.useEffect = useEffect;
|
|
1938
|
-
exports.useRef = useRef;
|
|
1939
|
-
exports.useSignal = useSignal;
|
|
1940
1969
|
exports.viewfly = viewfly;
|
|
1970
|
+
exports.watch = watch;
|
|
1941
1971
|
exports.withMemo = withMemo;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@viewfly/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "Viewfly is a simple and easy-to-use JavaScript framework with an intuitive development experience.",
|
|
5
5
|
"main": "./bundles/index.js",
|
|
6
6
|
"module": "./bundles/index.esm.js",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"bugs": {
|
|
48
48
|
"url": "https://github.com/viewfly/viewfly.git/issues"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "75a746eb22f41295157d079e8557154d5fa50e01",
|
|
51
51
|
"dependencies": {
|
|
52
52
|
"reflect-metadata": "^0.1.13"
|
|
53
53
|
}
|