diff --git a/packages/dom/src/renderDOMHead.ts b/packages/dom/src/renderDOMHead.ts index ce6d6dc0..70a5aff2 100644 --- a/packages/dom/src/renderDOMHead.ts +++ b/packages/dom/src/renderDOMHead.ts @@ -149,5 +149,6 @@ export async function renderDOMHead>(head: T, options: Ren // clear all side effects still pending Object.values(state.pendingSideEffects).forEach(fn => fn()) head._dom = state + head.dirty = false await head.hooks.callHook('dom:rendered', { renders: tags }) } diff --git a/packages/schema/src/head.ts b/packages/schema/src/head.ts index d113246d..05b78cbf 100644 --- a/packages/schema/src/head.ts +++ b/packages/schema/src/head.ts @@ -123,6 +123,10 @@ export interface Unhead { * @internal */ _domUpdatePromise?: Promise + /** + * @internal + */ + dirty: boolean } export interface DomState { diff --git a/packages/unhead/src/createHead.ts b/packages/unhead/src/createHead.ts index 3543464d..b92624ba 100644 --- a/packages/unhead/src/createHead.ts +++ b/packages/unhead/src/createHead.ts @@ -61,10 +61,14 @@ export function createHeadCore(options: CreateHeadOptions = ...(options?.plugins || []), ] - const updated = () => hooks.callHook('entries:updated', head) + const updated = () => { + head.dirty = true + hooks.callHook('entries:updated', head) + } let entryCount = 0 let entries: HeadEntry[] = [] const head: Unhead = { + dirty: false, resolvedOptions: options, hooks, headEntries() { diff --git a/test/vue/dom/classes.test.ts b/test/vue/dom/classes.test.ts index ca4f53d9..93d4d3a8 100644 --- a/test/vue/dom/classes.test.ts +++ b/test/vue/dom/classes.test.ts @@ -40,6 +40,8 @@ describe('vue dom classes', () => { isNavActive.value = true + // wait 100ms + await new Promise(resolve => setTimeout(resolve, 100)) await renderDOMHead(head, { document: dom.window.document }) expect(dom.serialize()).toMatchInlineSnapshot(` "