Commit fe7cf0d
authored
fix(todo-fast): make hydration work correctly with FAST-HTML example (#65)
Two issues prevented the todo-fast example from working after hydration:
1. Class field initializers overwrote hydration state
RenderableFASTElement calls prepare() synchronously during super().
Esbuild compiles `@observable items: TodoItemData[] = []` as
`this.items = []` in the subclass constructor AFTER super() returns,
silently overwriting the 3 items that prepare() extracted from the SSR
shadow DOM. Fixed by removing class field initializers from @observable
properties set in prepare().
2. ObserverMap deep proxies silently swallowed immutable-style updates
With `observerMap: 'all'`, each array item is wrapped with deep
observable proxies. When onToggleItem used .map() to create new plain
objects, instanceResolverChanged triggered deepMerge which compared
proxied getter values via deepEqual and concluded nothing changed,
silently dropping the state update. Fixed by mutating items in-place
(item.state = 'done') so the observable setter fires directly.
Other fixes:
- Move todo-item loop from light DOM into shadow DOM template and
query via this.shadowRoot instead of this
- Always assign this.items in prepare() to guarantee a default
- Add return true to onAddKeydown so the event propagates1 parent 8b7d952 commit fe7cf0d
3 files changed
Lines changed: 18 additions & 21 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
| 26 | + | |
35 | 27 | | |
36 | 28 | | |
37 | 29 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
15 | 15 | | |
16 | 16 | | |
17 | 17 | | |
18 | | - | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
19 | 25 | | |
20 | 26 | | |
21 | 27 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | | - | |
| 12 | + | |
| 13 | + | |
14 | 14 | | |
15 | 15 | | |
16 | 16 | | |
| |||
26 | 26 | | |
27 | 27 | | |
28 | 28 | | |
29 | | - | |
| 29 | + | |
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| 36 | + | |
36 | 37 | | |
37 | | - | |
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
41 | 41 | | |
42 | 42 | | |
43 | 43 | | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
50 | 48 | | |
51 | 49 | | |
52 | 50 | | |
| |||
55 | 53 | | |
56 | 54 | | |
57 | 55 | | |
58 | | - | |
| 56 | + | |
59 | 57 | | |
60 | 58 | | |
61 | 59 | | |
| 60 | + | |
62 | 61 | | |
63 | 62 | | |
64 | 63 | | |
| |||
0 commit comments