Commit 55166ee
feat: access resolved head with
* feat(unhead): add `onRendered` option to `HeadEntryOptions`
Adds a client-side callback option to useHead/useSeoMeta/useHeadSafe that
fires after DOM updates are applied. This enables synchronizing external
tools (e.g. analytics) with the current document head state.
The callback is automatically cleaned up when the entry is disposed
(including on component unmount). Ignored during SSR.
Resolves #615
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
* fix: register onRendered hook in client head, not core
The client createHead wraps core push() with its own push(), and hooks
are only available on the client wrapper. Moved hook registration to the
client head's push() where hooks are accessible.
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
* fix(unhead): register onRendered hook before triggering entries:updated
The onRendered hook was registered after entries:updated was called, but
entries:updated synchronously triggers the renderer which fires dom:rendered.
This meant the callback was never invoked on the initial render.
Also fixes multi-entry test expectations to account for each push()
triggering an immediate render, and adds a Vue component unmount test
to verify onRendered cleanup on component lifecycle.
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
* fix(vue,solid): preserve component scope for onRendered callbacks
Wrap onRendered callbacks to run within the registering component's
scope context. This ensures reactive tracking works correctly and
provides an extra safety layer — disposed scopes silently no-op.
- Vue: capture getCurrentScope(), run callback via scope.run()
- Solid: capture getOwner(), run callback via runWithOwner()
- React/Svelte/Angular: no scope concept — closures + disposal cleanup
already handle this correctly
Co-Authored-By: Claude Opus 4.6 (1M context) <[email protected]>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <[email protected]>onRendered (#712)1 parent 4c785c0 commit 55166ee
15 files changed
Lines changed: 310 additions & 9 deletions
File tree
- docs
- 0.angular/head/guides/0.get-started
- 0.nuxt/head/guides/0.get-started
- 0.react/head/guides/0.get-started
- 0.solid-js/head/guides/0.get-started
- 0.svelte/head/guides/0.get-started
- 0.typescript/head/guides/0.get-started
- 0.vue/head/guides/0.get-started
- head/7.api/composables
- packages
- solid-js/src
- unhead
- src
- client
- types
- test/unit/client
- vue
- src
- test/unit/dom
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | | - | |
| 99 | + | |
100 | 100 | | |
101 | 101 | | |
102 | 102 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
101 | 101 | | |
102 | 102 | | |
103 | 103 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
133 | 133 | | |
134 | 134 | | |
135 | 135 | | |
136 | | - | |
| 136 | + | |
137 | 137 | | |
138 | 138 | | |
139 | 139 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
149 | 149 | | |
150 | 150 | | |
151 | 151 | | |
152 | | - | |
| 152 | + | |
153 | 153 | | |
154 | 154 | | |
155 | 155 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
148 | 148 | | |
149 | 149 | | |
150 | 150 | | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
151 | 154 | | |
152 | 155 | | |
153 | 156 | | |
| |||
177 | 180 | | |
178 | 181 | | |
179 | 182 | | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | + | |
| 199 | + | |
| 200 | + | |
| 201 | + | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
| 206 | + | |
| 207 | + | |
| 208 | + | |
180 | 209 | | |
181 | 210 | | |
182 | 211 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
| 12 | + | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| |||
25 | 25 | | |
26 | 26 | | |
27 | 27 | | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
28 | 36 | | |
29 | 37 | | |
30 | 38 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
34 | 34 | | |
35 | 35 | | |
36 | 36 | | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
37 | 41 | | |
38 | 42 | | |
39 | 43 | | |
| |||
46 | 50 | | |
47 | 51 | | |
48 | 52 | | |
| 53 | + | |
49 | 54 | | |
50 | 55 | | |
51 | 56 | | |
| |||
0 commit comments