webdetta 0.1.229 → 0.1.230
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/package.json +1 -1
- package/packages/realdom/base.js +17 -8
- package/packages/realdom/dynamic.js +6 -10
package/package.json
CHANGED
package/packages/realdom/base.js
CHANGED
|
@@ -45,15 +45,24 @@ Element.from = arg => {
|
|
|
45
45
|
return document.createTextNode(arg);
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
const
|
|
49
|
-
|
|
48
|
+
const hooks = {
|
|
49
|
+
beforeAppend: new WeakMap(),
|
|
50
|
+
afterAppend: new WeakMap(),
|
|
51
|
+
beforeRemove: new WeakMap(),
|
|
52
|
+
afterRemove: new WeakMap(),
|
|
53
|
+
}
|
|
54
|
+
Element.registerHook = (node, hook, handler) => {
|
|
55
|
+
const map = hooks[hook];
|
|
56
|
+
const prev = map.get(node);
|
|
57
|
+
map.set(node, function hook() { prev?.(); handler(); });
|
|
58
|
+
}
|
|
50
59
|
|
|
51
60
|
const performAppend = (node, method, item) => {
|
|
52
61
|
const itemNode = Element.from(item);
|
|
53
|
-
const
|
|
54
|
-
|
|
62
|
+
const { beforeAppend, afterAppend } = hooks;
|
|
63
|
+
beforeAppend.get(itemNode)?.();
|
|
55
64
|
node[method](itemNode);
|
|
56
|
-
|
|
65
|
+
afterAppend.get(itemNode)?.();
|
|
57
66
|
}
|
|
58
67
|
Element.append = (node, item) => {
|
|
59
68
|
processItem(item,
|
|
@@ -67,10 +76,10 @@ Element.appendBefore = (node, sibling) => performAppend(node, 'before', sibling)
|
|
|
67
76
|
Element.appendAfter = (node, sibling) => performAppend(node, 'after', sibling);
|
|
68
77
|
|
|
69
78
|
Element.remove = (node) => {
|
|
70
|
-
const
|
|
71
|
-
|
|
79
|
+
const { beforeRemove, afterRemove } = hooks;
|
|
80
|
+
beforeRemove.get(node)?.();
|
|
72
81
|
node.remove();
|
|
73
|
-
|
|
82
|
+
afterRemove.get(node)?.();
|
|
74
83
|
}
|
|
75
84
|
|
|
76
85
|
export const Operator = (...funcs) => Builder((tasks, node) => {
|
|
@@ -62,12 +62,10 @@ const createContainer = (content) => {
|
|
|
62
62
|
export const createList = (itemsFn, renderItem, keyFn = listItemKey) => {
|
|
63
63
|
const root = document.createTextNode('');
|
|
64
64
|
const containers = new Map();
|
|
65
|
-
Element.
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
containers.clear();
|
|
70
|
-
}
|
|
65
|
+
Element.registerHook(root, 'afterAppend', () => effect.run());
|
|
66
|
+
Element.registerHook(root, 'beforeRemove', () => {
|
|
67
|
+
for (const c of containers.values()) c.remove();
|
|
68
|
+
containers.clear();
|
|
71
69
|
});
|
|
72
70
|
|
|
73
71
|
const effect = r.effect(() => {
|
|
@@ -98,10 +96,8 @@ export const createList = (itemsFn, renderItem, keyFn = listItemKey) => {
|
|
|
98
96
|
export const createSlot = (content) => {
|
|
99
97
|
const root = document.createTextNode('');
|
|
100
98
|
const container = createContainer(content);
|
|
101
|
-
Element.
|
|
102
|
-
|
|
103
|
-
beforeRemove: () => container.remove()
|
|
104
|
-
});
|
|
99
|
+
Element.registerHook(root, 'afterAppend', () => container.appendAfter(root));
|
|
100
|
+
Element.registerHook(root, 'beforeRemove', () => container.remove());
|
|
105
101
|
return root;
|
|
106
102
|
}
|
|
107
103
|
|