airx 0.1.2 → 0.1.4

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 CHANGED
@@ -1,4 +1,4 @@
1
- # airx
1
+ # airx [![npm](https://img.shields.io/npm/v/airx.svg)](https://www.npmjs.com/package/airx) [![build status](https://github.com/airxjs/airx/actions/workflows/check.yml/badge.svg?branch=main)](https://github.com/airxjs/airx/actions/workflows/check.yml)
2
2
 
3
3
  Arix is a front-end framework based on JSX, but it doesn't have hooks like React.
4
4
 
@@ -1,3 +1,4 @@
1
+ import { Ref } from './reactive';
1
2
  import * as symbol from './symbol';
2
3
  type AirxElementType<P> = string | AirxComponent<P>;
3
4
  /**
@@ -7,14 +8,14 @@ type AirxElementType<P> = string | AirxComponent<P>;
7
8
  * props 表示元素的属性
8
9
  * children 表示元素的子元素
9
10
  */
10
- export interface AirxElement<P = unknown> {
11
+ export interface AirxElement<P = any> {
11
12
  type: AirxElementType<P>;
12
13
  props: {
13
14
  [propKey: string]: unknown;
14
- };
15
+ } & P;
15
16
  [symbol.airxElementSymbol]: true;
16
17
  }
17
- export type AirxChildren = null | string | number | boolean | undefined | AirxElement<never> | Array<AirxElement<never>>;
18
+ export type AirxChildren = null | string | number | boolean | undefined | AirxElement | Array<AirxChildren>;
18
19
  /**
19
20
  * 函数式组件接收自己的 props,并返回一个 AirxElement
20
21
  */
@@ -23,18 +24,21 @@ export type AirxComponentRender = () => AirxChildren;
23
24
  /**
24
25
  * createElement 是用于创建 AirxElement 的工具函数
25
26
  */
26
- export declare function createElement<P = unknown>(type: AirxElementType<P>, props: {
27
+ export declare function createElement<P = any>(type: AirxElementType<P>, props: {
27
28
  [key: string]: unknown;
28
29
  } & P, ...children: AirxChildren[]): AirxElement<P>;
29
30
  export declare function isValidElement(element: unknown): element is AirxElement;
30
31
  export declare function Fragment(props: {
31
32
  children: AirxElement;
32
- }): () => AirxElement<unknown>;
33
+ }): () => AirxElement<any>;
33
34
  export type AirxComponentUnmountedListener = () => void;
34
35
  export type AirxComponentMountedListener = () => () => void | void;
35
36
  export interface AirxComponentLifecycle {
36
37
  onMounted: (listener: AirxComponentMountedListener) => void;
37
38
  onUnmounted: (listener: AirxComponentUnmountedListener) => void;
38
39
  }
39
- export type AirxComponentContext = AirxComponentLifecycle;
40
+ export type AirxComponentContext = AirxComponentLifecycle & {
41
+ provide: <T = any>(key: any, value: T) => (newValue: T) => void;
42
+ inject: <T = any>(key: any) => Ref<T | null>;
43
+ };
40
44
  export {};
package/output/element.js CHANGED
@@ -2,6 +2,7 @@ import * as symbol from './symbol';
2
2
  /**
3
3
  * createElement 是用于创建 AirxElement 的工具函数
4
4
  */
5
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
6
  export function createElement(type, props, ...children) {
6
7
  return {
7
8
  type,
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","sourceRoot":"","sources":["../source/element.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAgClC;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAwB,EACxB,KAAqC,EACrC,GAAG,QAAwB;IAE3B,OAAO;QACL,IAAI;QACJ,KAAK,EAAE;YACL,GAAG,KAAK;YACR,QAAQ;SACT;QACD,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI;KACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,OAAO,OAAO,KAAK,QAAQ;WAC7B,OAAO,KAAK,IAAI;WAChB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAgC;IACvD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAA;AAC7B,CAAC"}
1
+ {"version":3,"file":"element.js","sourceRoot":"","sources":["../source/element.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,MAAM,UAAU,CAAA;AAiClC;;GAEG;AACH,8DAA8D;AAC9D,MAAM,UAAU,aAAa,CAC3B,IAAwB,EACxB,KAAqC,EACrC,GAAG,QAAwB;IAE3B,OAAO;QACL,IAAI;QACJ,KAAK,EAAE;YACL,GAAG,KAAK;YACR,QAAQ;SACT;QACD,CAAC,MAAM,CAAC,iBAAiB,CAAC,EAAE,IAAI;KACjC,CAAA;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO,OAAO,OAAO,KAAK,QAAQ;WAC7B,OAAO,KAAK,IAAI;WAChB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,iBAAiB,CAAC,CAAA;AACrD,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAgC;IACvD,OAAO,GAAG,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAA;AAC7B,CAAC"}
package/output/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { AirxElement } from './element';
2
2
  export * from './types';
3
- export { createRef } from './reactive';
3
+ export { createRef, Ref } from './reactive';
4
4
  export { Fragment, createElement, AirxComponent, AirxElement, AirxChildren, AirxComponentContext } from './element';
5
- export { useContext, onMounted, onUnmounted } from './render';
5
+ export { inject, provide, onMounted, onUnmounted } from './render';
6
6
  export interface AirxApp {
7
7
  mount: (container: HTMLElement) => AirxApp;
8
8
  }
package/output/index.js CHANGED
@@ -2,7 +2,7 @@ import { render } from './render';
2
2
  export * from './types';
3
3
  export { createRef } from './reactive';
4
4
  export { Fragment, createElement } from './element';
5
- export { useContext, onMounted, onUnmounted } from './render';
5
+ export { inject, provide, onMounted, onUnmounted } from './render';
6
6
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
7
7
  export function createApp(element) {
8
8
  const app = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,cAAc,SAAS,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAA;AAEtC,OAAO,EACL,QAAQ,EACR,aAAa,EAKd,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACZ,MAAM,UAAU,CAAA;AAOjB,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,GAAG,GAAY;QACnB,yBAAyB;QACzB,yBAAyB;QACzB,eAAe;QACf,KAAK;QAEL,KAAK,EAAE,CAAC,SAAsB,EAAE,EAAE;YAChC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YAC1B,OAAO,GAAG,CAAA;QACZ,CAAC;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../source/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAEjC,cAAc,SAAS,CAAA;AAEvB,OAAO,EAAE,SAAS,EAAO,MAAM,YAAY,CAAA;AAE3C,OAAO,EACL,QAAQ,EACR,aAAa,EAKd,MAAM,WAAW,CAAA;AAElB,OAAO,EACL,MAAM,EACN,OAAO,EACP,SAAS,EACT,WAAW,EACZ,MAAM,UAAU,CAAA;AAOjB,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,OAAyB;IACjD,MAAM,GAAG,GAAY;QACnB,yBAAyB;QACzB,yBAAyB;QACzB,eAAe;QACf,KAAK;QAEL,KAAK,EAAE,CAAC,SAAsB,EAAE,EAAE;YAChC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAA;YAC1B,OAAO,GAAG,CAAA;QACZ,CAAC;KACF,CAAA;IAED,OAAO,GAAG,CAAA;AACZ,CAAC"}
@@ -2,9 +2,8 @@ export declare function createCollector(): {
2
2
  complete: () => Ref<unknown>[];
3
3
  collect: <R = unknown>(process: () => R) => R;
4
4
  };
5
- interface Ref<T = unknown> {
5
+ export interface Ref<T = unknown> {
6
6
  value: T;
7
7
  }
8
8
  export declare function watch<T = unknown>(ref: Ref<T>, listener: () => unknown): () => void;
9
9
  export declare function createRef<T>(obj: T): Ref<T>;
10
- export {};
@@ -49,19 +49,20 @@ export function createRef(obj) {
49
49
  if (!globalContext.dependencies.has(ref)) {
50
50
  globalContext.dependencies.add(ref);
51
51
  }
52
- return new Proxy(ref, {
53
- get(target, key, receiver) {
54
- const result = Reflect.get(target, key, receiver);
52
+ let value = ref.value;
53
+ Reflect.defineProperty(ref, 'value', {
54
+ get() {
55
55
  if (!globalContext.dependencies.has(ref)) {
56
56
  globalContext.dependencies.add(ref);
57
57
  }
58
- return result;
59
- },
60
- set(target, key, value, receiver) {
61
- const result = Reflect.set(target, key, value, receiver);
62
- triggerRef(target);
63
- return result;
58
+ return value;
64
59
  },
60
+ set(newValue) {
61
+ value = newValue;
62
+ triggerRef(ref);
63
+ return value;
64
+ }
65
65
  });
66
+ return ref;
66
67
  }
67
68
  //# sourceMappingURL=reactive.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactive.js","sourceRoot":"","sources":["../source/reactive.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactive.js","sourceRoot":"","sources":["../source/reactive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { AirxElement } from '../element';
2
+ import { Instance } from './common';
3
+ export declare function render(element: AirxElement, domRef: HTMLElement): Instance;
@@ -0,0 +1,272 @@
1
+ import { createLogger } from '../logger';
2
+ import { InnerAirxComponentContext, performUnitOfWork } from './common';
3
+ export function render(element, domRef) {
4
+ const rootInstance = {
5
+ domRef,
6
+ context: new InnerAirxComponentContext()
7
+ };
8
+ rootInstance.context.instance = rootInstance;
9
+ const context = {
10
+ rootInstance,
11
+ nextUnitOfWork: null,
12
+ needCommitDom: false
13
+ };
14
+ const appInstance = {
15
+ element,
16
+ parent: context.rootInstance,
17
+ memoProps: { ...element.props },
18
+ context: new InnerAirxComponentContext()
19
+ };
20
+ appInstance.context.instance = appInstance;
21
+ context.rootInstance.child = appInstance;
22
+ context.nextUnitOfWork = appInstance;
23
+ /**
24
+ * 提交 Dom 变化
25
+ */
26
+ function commitDom(rootInstance, rootNode) {
27
+ const logger = createLogger('commitDom');
28
+ logger.debug('commitDom', rootInstance);
29
+ function updateDomProperties(dom, nextProps, prevProps = {}) {
30
+ const isKey = (key) => key === 'key';
31
+ const isStyle = (key) => key === 'style';
32
+ const isClass = (key) => key === 'class';
33
+ const isEvent = (key) => key.startsWith("on");
34
+ const isChildren = (key) => key === 'children';
35
+ const isGone = (_prev, next) => (key) => !(key in next);
36
+ const isNew = (prev, next) => (key) => prev[key] !== next[key];
37
+ const isProperty = (key) => !isChildren(key) && !isEvent(key) && !isStyle(key) && !isClass(key) && !isKey(key);
38
+ // https://developer.mozilla.org/zh-CN/docs/Web/API/Node
39
+ if (dom.nodeName === '#text' || dom.nodeName === '#comment') {
40
+ const textNode = dom;
41
+ if (textNode.nodeValue !== nextProps.textContent) {
42
+ textNode.nodeValue = String(nextProps.textContent);
43
+ }
44
+ return;
45
+ }
46
+ // remove old style
47
+ const oldStyle = prevProps?.style;
48
+ if (typeof oldStyle === 'object' && oldStyle != null) {
49
+ Object.keys(oldStyle).forEach(key => {
50
+ /* eslint-disable @typescript-eslint/no-explicit-any */
51
+ delete dom.style[key];
52
+ /* eslint-enable @typescript-eslint/no-explicit-any */
53
+ });
54
+ }
55
+ // add new style
56
+ const newStyle = nextProps?.style;
57
+ if (typeof newStyle === 'object' && newStyle != null) {
58
+ Object.keys(newStyle).forEach((key) => {
59
+ /* eslint-disable @typescript-eslint/no-explicit-any */
60
+ const value = newStyle?.[key];
61
+ dom.style[key] = value == null ? '' : value;
62
+ /* eslint-enable @typescript-eslint/no-explicit-any */
63
+ });
64
+ }
65
+ if (dom.className !== nextProps?.class) {
66
+ if (!nextProps?.class) {
67
+ dom.removeAttribute('class');
68
+ }
69
+ else if (typeof nextProps?.class === 'string') {
70
+ dom.setAttribute('class', nextProps?.class);
71
+ }
72
+ }
73
+ //Remove old or changed event listeners
74
+ Object.keys(prevProps)
75
+ .filter(isEvent)
76
+ .filter(key => !(key in nextProps) ||
77
+ isNew(prevProps, nextProps)(key))
78
+ .forEach(name => {
79
+ const eventType = name
80
+ .toLowerCase()
81
+ .substring(2);
82
+ if (prevProps[name] == null)
83
+ return;
84
+ if (typeof prevProps[name] !== 'function') {
85
+ console.error('EventListener is not a function');
86
+ }
87
+ else {
88
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
89
+ dom.removeEventListener(eventType, prevProps[name]);
90
+ }
91
+ });
92
+ // Add event listeners
93
+ Object.keys(nextProps)
94
+ .filter(isEvent)
95
+ .filter(isNew(prevProps, nextProps))
96
+ .forEach(name => {
97
+ const eventType = name
98
+ .toLowerCase()
99
+ .substring(2);
100
+ if (nextProps[name] == null)
101
+ return;
102
+ if (typeof nextProps[name] !== 'function') {
103
+ console.error('EventListener is not a function');
104
+ }
105
+ else {
106
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
107
+ dom.addEventListener(eventType, nextProps[name]);
108
+ }
109
+ });
110
+ // Remove old properties
111
+ Object.keys(prevProps)
112
+ .filter(isProperty)
113
+ .filter(isGone(prevProps, nextProps))
114
+ .forEach(name => dom.setAttribute(name, ''));
115
+ // Set new or changed properties
116
+ Object.keys(nextProps)
117
+ .filter(isProperty)
118
+ .filter(isNew(prevProps, nextProps))
119
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
120
+ .forEach(name => dom.setAttribute(name, nextProps[name]));
121
+ }
122
+ function getParentDom(instance) {
123
+ if (instance.parent?.domRef != null) {
124
+ return instance.parent.domRef;
125
+ }
126
+ if (instance.parent) {
127
+ return getParentDom(instance.parent);
128
+ }
129
+ throw new Error('Cant find dom');
130
+ }
131
+ /**
132
+ * 查找 instance 下所有的一级 dom
133
+ * @param instance
134
+ * @returns
135
+ */
136
+ function getChildDoms(instance) {
137
+ const domList = [];
138
+ const todoList = [instance];
139
+ while (todoList.length > 0) {
140
+ const current = todoList.pop();
141
+ // 找到真实 dom 直接提交
142
+ if (current?.domRef != null) {
143
+ domList.push(current.domRef);
144
+ }
145
+ // 有子节点但是无真实 dom,向下继续查找
146
+ if (current?.domRef == null) {
147
+ if (current?.child != null) {
148
+ todoList.push(current.child);
149
+ }
150
+ }
151
+ // 可能有兄弟节点,则需要继续查找
152
+ if (current?.sibling != null) {
153
+ todoList.push(current.sibling);
154
+ }
155
+ }
156
+ return domList;
157
+ }
158
+ function commitInstanceDom(nextInstance, oldNode) {
159
+ // 移除标删元素
160
+ if (nextInstance.deletions) {
161
+ for (const deletion of nextInstance.deletions) {
162
+ const domList = getChildDoms(deletion);
163
+ for (let index = 0; index < domList.length; index++) {
164
+ const dom = domList[index];
165
+ if (dom && dom.parentNode)
166
+ dom.parentNode.removeChild(dom);
167
+ }
168
+ deletion.context.triggerUnmounted();
169
+ }
170
+ nextInstance.deletions.clear();
171
+ }
172
+ // 创建 dom
173
+ if (nextInstance.domRef == null) {
174
+ if (nextInstance.element == null)
175
+ throw new Error('???');
176
+ if (typeof nextInstance.element.type === 'string') {
177
+ if (nextInstance.element.type === 'text') {
178
+ const textContent = nextInstance.element.props.textContent;
179
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
180
+ nextInstance.domRef = document.createTextNode(textContent);
181
+ }
182
+ else if (nextInstance.element.type === 'comment') {
183
+ const textContent = nextInstance.element.props.textContent;
184
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
185
+ nextInstance.domRef = document.createComment(textContent);
186
+ }
187
+ else {
188
+ nextInstance.domRef = document.createElement(nextInstance.element.type);
189
+ }
190
+ }
191
+ }
192
+ // 更新属性
193
+ if (nextInstance.domRef != null && nextInstance.element != null) {
194
+ updateDomProperties(nextInstance.domRef, nextInstance.element.props, nextInstance.beforeElement?.props);
195
+ }
196
+ // 插入 parent
197
+ // TODO: 针对仅移动时优化
198
+ if (nextInstance.domRef != null) {
199
+ if (oldNode !== nextInstance.domRef) {
200
+ if (nextInstance.domRef.parentNode) {
201
+ nextInstance.domRef.parentNode.removeChild(nextInstance.domRef);
202
+ }
203
+ const parentDom = getParentDom(nextInstance);
204
+ parentDom.appendChild(nextInstance.domRef);
205
+ }
206
+ }
207
+ }
208
+ function commitWalkV2(initInstance, initNode) {
209
+ // 创建一个栈,将根节点压入栈中
210
+ const stack = [[initInstance, initNode]];
211
+ while (stack.length > 0) {
212
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
213
+ const stackLayer = stack.pop();
214
+ if (typeof stackLayer === 'function') {
215
+ stackLayer();
216
+ continue;
217
+ }
218
+ const [instance, node] = stackLayer;
219
+ commitInstanceDom(instance, node);
220
+ // stack 是先入后出
221
+ // 实际上是先渲染 child
222
+ // 这里然后再渲染 sibling
223
+ // 执行生命周期的 Mount
224
+ stack.push(() => instance.context.triggerMounted());
225
+ // 更新下一个兄弟节点
226
+ if (instance.sibling != null) {
227
+ const siblingNode = instance.domRef
228
+ ? instance.domRef.nextSibling
229
+ : node?.nextSibling;
230
+ stack.push([instance.sibling, siblingNode || undefined]);
231
+ }
232
+ // 更新下一个子节点
233
+ if (instance.child != null) {
234
+ const childNode = instance.domRef
235
+ ? instance.domRef.firstChild
236
+ : node;
237
+ stack.push([instance.child, childNode || undefined]);
238
+ }
239
+ }
240
+ }
241
+ commitWalkV2(rootInstance, rootNode);
242
+ }
243
+ function onUpdateRequire() {
244
+ if (context.nextUnitOfWork == null && context.rootInstance.child) {
245
+ context.nextUnitOfWork = context.rootInstance.child;
246
+ }
247
+ }
248
+ /**
249
+ * 调度
250
+ */
251
+ function workLoop(deadline) {
252
+ let shouldYield = false;
253
+ const logger = createLogger('workLoop');
254
+ while (context.nextUnitOfWork && !shouldYield) {
255
+ logger.debug('nextUnitOfWork', context.nextUnitOfWork);
256
+ context.nextUnitOfWork = performUnitOfWork(context.nextUnitOfWork, onUpdateRequire);
257
+ if (context.nextUnitOfWork == null)
258
+ context.needCommitDom = true;
259
+ if (deadline)
260
+ shouldYield = deadline.timeRemaining() < 1;
261
+ }
262
+ if (context.needCommitDom && context.rootInstance.child) {
263
+ commitDom(context.rootInstance.child, context.rootInstance.domRef?.firstChild || undefined);
264
+ context.needCommitDom = false;
265
+ }
266
+ requestIdleCallback(workLoop);
267
+ }
268
+ // 开始调度
269
+ requestIdleCallback(workLoop);
270
+ return context.rootInstance;
271
+ }
272
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../source/render/browser.ts"],"names":[],"mappings":"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"}
@@ -1,16 +1,23 @@
1
- import { AirxElement, AirxComponentRender, AirxComponentContext, AirxComponentMountedListener, AirxComponentUnmountedListener } from './element';
2
- export declare function useContext(): AirxComponentContext;
1
+ import { Ref } from '../../reactive';
2
+ import { AirxComponentContext, AirxComponentMountedListener, AirxComponentRender, AirxComponentUnmountedListener, AirxElement } from '../../element';
3
3
  export declare const onMounted: AirxComponentContext['onMounted'];
4
4
  export declare const onUnmounted: AirxComponentContext['onUnmounted'];
5
+ export declare const inject: AirxComponentContext['inject'];
6
+ export declare const provide: AirxComponentContext['provide'];
5
7
  export type Disposer = () => void;
6
- declare class InnerAirxComponentContext implements AirxComponentContext {
8
+ export declare class InnerAirxComponentContext implements AirxComponentContext {
9
+ instance?: Instance;
7
10
  private disposers;
11
+ private providedMap;
12
+ private injectedMap;
8
13
  private mountListeners;
9
14
  private unmountedListeners;
10
15
  triggerMounted(): void;
11
16
  triggerUnmounted(): void;
12
17
  onMounted(listener: AirxComponentMountedListener): void;
13
18
  onUnmounted(listener: AirxComponentUnmountedListener): void;
19
+ provide<T = unknown>(key: any, value: any): (v: T) => void;
20
+ inject<T = unknown>(key: any): Ref<T | null>;
14
21
  addDisposer(...disposers: Disposer[]): void;
15
22
  dispose(): void;
16
23
  /**
@@ -27,7 +34,7 @@ declare class InnerAirxComponentContext implements AirxComponentContext {
27
34
  * ↓ | |
28
35
  * instance -sibling→ instance...
29
36
  */
30
- interface Instance {
37
+ export interface Instance {
31
38
  domRef?: HTMLElement;
32
39
  child?: Instance;
33
40
  parent?: Instance;
@@ -36,9 +43,21 @@ interface Instance {
36
43
  element?: AirxElement;
37
44
  beforeElement?: AirxElement;
38
45
  render?: AirxComponentRender;
39
- memoProps?: object;
46
+ memoProps?: any;
40
47
  requiredUpdate?: boolean;
41
48
  context: InnerAirxComponentContext;
42
49
  }
43
- export declare function render(element: AirxElement, domRef: HTMLElement): Instance;
50
+ /**
51
+ * 更新 children
52
+ * @param parentInstance 当前正在处理的组件的实例
53
+ * @param children 当前组件的子节点
54
+ */
55
+ export declare function reconcileChildren(parentInstance: Instance, childrenElementArray: AirxElement[]): void;
56
+ type OnUpdateRequire = (instance: Instance) => void;
57
+ /**
58
+ * 处理单个 instance
59
+ * @param instance 当前处理的实例
60
+ * @returns 返回下一个需要处理的 instance
61
+ */
62
+ export declare function performUnitOfWork(instance: Instance, onUpdateRequire?: OnUpdateRequire): Instance | null;
44
63
  export {};