From 6589b4461810c7edf686aeccde03aac1e6452dc9 Mon Sep 17 00:00:00 2001 From: HoikanChen Date: Mon, 15 Jan 2024 15:51:47 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E5=A2=9E=E5=8A=A0no-vdom=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E5=9C=BA=E6=99=AF=202=E3=80=81=E5=9F=BA=E4=BA=8Ereact?= =?UTF-8?q?ively=E6=96=B9=E5=BC=8F=E9=87=8D=E6=9E=84=E5=93=8D=E5=BA=94?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../no-vnode/no-vnode-base.test.js | 558 ++++++++++++++++++ .../ReactivityTest/reactive-mix-use.test.js | 131 +++- .../reactively/reactively.test.js | 90 +++ .../inula/src/no-vnode/components/For.tsx | 125 ++++ .../inula/src/no-vnode/components/Show.tsx | 25 + packages/inula/src/no-vnode/core.ts | 91 +++ packages/inula/src/no-vnode/dom.ts | 295 +++++++++ packages/inula/src/no-vnode/event.ts | 85 +++ packages/inula/src/reactive/RContext.ts | 11 +- .../inula/src/reactive/RContextCreator.ts | 49 ++ packages/inula/src/reactive/RNode.ts | 23 +- packages/inula/src/reactive/Utils.ts | 3 +- packages/inula/src/reactive/types.ts | 2 +- packages/inula/src/reactively/RNode.ts | 335 +++++++++++ .../inula/src/reactively/RNodeAccessor.ts | 270 +++++++++ packages/inula/src/reactively/RNodeCreator.ts | 73 +++ packages/inula/src/reactively/Reactively.ts | 24 + packages/inula/src/reactively/Utils.ts | 25 + .../src/reactively/proxy/RProxyHandler.ts | 147 +++++ packages/inula/src/renderer/Types.ts | 4 +- .../src/renderer/diff/nodeDiffComparator.ts | 2 +- packages/inula/src/renderer/hooks/UseWatch.ts | 2 +- .../src/renderer/submit/LifeCycleHandler.ts | 4 +- 23 files changed, 2358 insertions(+), 16 deletions(-) create mode 100644 packages/inula/scripts/__tests__/ReactivityTest/no-vnode/no-vnode-base.test.js create mode 100644 packages/inula/scripts/__tests__/ReactivityTest/reactively/reactively.test.js create mode 100644 packages/inula/src/no-vnode/components/For.tsx create mode 100644 packages/inula/src/no-vnode/components/Show.tsx create mode 100644 packages/inula/src/no-vnode/core.ts create mode 100644 packages/inula/src/no-vnode/dom.ts create mode 100644 packages/inula/src/no-vnode/event.ts create mode 100644 packages/inula/src/reactively/RNode.ts create mode 100644 packages/inula/src/reactively/RNodeAccessor.ts create mode 100644 packages/inula/src/reactively/RNodeCreator.ts create mode 100644 packages/inula/src/reactively/Reactively.ts create mode 100644 packages/inula/src/reactively/Utils.ts create mode 100644 packages/inula/src/reactively/proxy/RProxyHandler.ts diff --git a/packages/inula/scripts/__tests__/ReactivityTest/no-vnode/no-vnode-base.test.js b/packages/inula/scripts/__tests__/ReactivityTest/no-vnode/no-vnode-base.test.js new file mode 100644 index 00000000..947eff0f --- /dev/null +++ b/packages/inula/scripts/__tests__/ReactivityTest/no-vnode/no-vnode-base.test.js @@ -0,0 +1,558 @@ +import Inula, { computed, createRef, reactive, watchReactive } from '../../../../src/index'; +import { template as _$template, insert as _$insert, setAttribute as _$setAttribute } from '../../../../src/no-vnode/dom'; +import { createComponent as _$createComponent, render } from '../../../../src/no-vnode/core'; +import { delegateEvents as _$delegateEvents, addEventListener as _$addEventListener } from '../../../../src/no-vnode/event'; + +import { Show } from '../../../../src/no-vnode/components/Show'; +import { For } from '../../../../src/no-vnode/components/For'; + +describe('测试 no-vnode', () => { + it('简单的使用signal', () => { + /** + * 源码: + * const CountingComponent = () => { + * const [count, setCount] = useSignal(0); + * + * return
Count value is {count()}.
; + * }; + * + * render(() => , container); + */ + + let g_count; + + // 编译后: + const _tmpl$ = /*#__PURE__*/ _$template(`
Count value is .`); + const CountingComponent = () => { + const count = reactive(0); + g_count = count; + + return (() => { + const _el$ = _tmpl$(), + _el$2 = _el$.firstChild, + _el$4 = _el$2.nextSibling, + _el$3 = _el$4.nextSibling; + _$insert(_el$, count, _el$4); + return _el$; + })(); + }; + render(() => _$createComponent(CountingComponent, {}), container); + + _$delegateEvents(['click']); + + expect(container.querySelector('#count').innerHTML).toEqual('Count value is 0.'); + + g_count.set(c => c + 1); + + expect(container.querySelector('#count').innerHTML).toEqual('Count value is 1.'); + }); + + it('return数组,click事件', () => { + /** + * 源码: + * const CountingComponent = () => { + * const [count, setCount] = createSignal(0); + * const add = () => { + * setCount((c) => c + 1); + * } + * return <> + *
Count value is {count()}.
+ *
+ * ; + * }; + */ + + // 编译后: + const _tmpl$ = /*#__PURE__*/ _$template(`
Count value is .`), + _tmpl$2 = /*#__PURE__*/ _$template(`
+ *
; + * }; + * + * render(() => , document.getElementById("app")); + */ + + // 编译后: + const _tmpl$ = /*#__PURE__*/ _$template(`
Count value is .`), + _tmpl$2 = /*#__PURE__*/ _$template(`
+ *
; + * }; + * + * render(() => , document.getElementById("app")); + */ + + // 编译后: + const _tmpl$ = /*#__PURE__*/ _$template(`
Count value is .`), + _tmpl$2 = /*#__PURE__*/ _$template(`
+ *
+ *
; + * }; + * + * render(() => , document.getElementById("app")); + */ + + // 编译后: + const _tmpl$ = /*#__PURE__*/_$template(`
Count value is .`), + _tmpl$2 = /*#__PURE__*/_$template(`
+ *
+ * ); + * + * const Main = () => { + * const [state, setState] = createStore({data: [{id: 1, label: '111', selected: false}, {id: 2, label: '222', selected: false}], num: 2}); + * + * function run() { + * setState('data', buildData(5)); + * } + * + * return ( + *
+ *
+ *
+ *

Horizon-reactive-novnode

+ *
+ *
+ *
+ *
+ *
+ *
+ * + * + *
+ *
+ * ); + * }; + * + * render(() =>
, document.getElementById("app")); + */ + + // 编译后: + const _tmpl$ = /*#__PURE__*/_$template(``), + _tmpl$2 = /*#__PURE__*/_$template(`