mirror of
https://github.com/nuxt/nuxt.git
synced 2025-03-21 16:55:57 +00:00
fix(nuxt): ensure head components are reactive (#31248)
Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
This commit is contained in:
parent
ade1bcf645
commit
63fb02ce0a
@ -134,19 +134,22 @@ export const NoScript = defineComponent({
|
|||||||
title: String,
|
title: String,
|
||||||
},
|
},
|
||||||
setup (props, { slots }) {
|
setup (props, { slots }) {
|
||||||
const noscript = normalizeProps(props) as Noscript
|
|
||||||
const slotVnodes = slots.default?.()
|
|
||||||
const textContent = slotVnodes
|
|
||||||
? slotVnodes.filter(({ children }) => children).map(({ children }) => children).join('')
|
|
||||||
: ''
|
|
||||||
if (textContent) {
|
|
||||||
noscript.innerHTML = textContent
|
|
||||||
}
|
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.noscript ||= []
|
input.noscript ||= []
|
||||||
const idx: keyof typeof input.noscript = input.noscript.push(noscript) - 1
|
const idx: keyof typeof input.noscript = input.noscript.push({}) - 1
|
||||||
onUnmounted(() => input.noscript![idx] = null)
|
onUnmounted(() => input.noscript![idx] = null)
|
||||||
return () => null
|
return () => {
|
||||||
|
const noscript = normalizeProps(props) as Noscript
|
||||||
|
const slotVnodes = slots.default?.()
|
||||||
|
const textContent = slotVnodes
|
||||||
|
? slotVnodes.filter(({ children }) => children).map(({ children }) => children).join('')
|
||||||
|
: ''
|
||||||
|
if (textContent) {
|
||||||
|
noscript.innerHTML = textContent
|
||||||
|
}
|
||||||
|
input.noscript![idx] = noscript
|
||||||
|
return null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -182,12 +185,14 @@ export const Link = defineComponent({
|
|||||||
target: String as PropType<Target>,
|
target: String as PropType<Target>,
|
||||||
},
|
},
|
||||||
setup (props) {
|
setup (props) {
|
||||||
const link = normalizeProps(props) as UnheadLink
|
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.link ||= []
|
input.link ||= []
|
||||||
const idx: keyof typeof input.link = input.link.push(link) - 1
|
const idx: keyof typeof input.link = input.link.push({}) - 1
|
||||||
onUnmounted(() => input.link![idx] = null)
|
onUnmounted(() => input.link![idx] = null)
|
||||||
return () => null
|
return () => {
|
||||||
|
input.link![idx] = normalizeProps(props) as UnheadLink
|
||||||
|
return null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -202,9 +207,11 @@ export const Base = defineComponent({
|
|||||||
},
|
},
|
||||||
setup (props) {
|
setup (props) {
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.base = normalizeProps(props) as UnheadBase
|
|
||||||
onUnmounted(() => input.base = null)
|
onUnmounted(() => input.base = null)
|
||||||
return () => null
|
return () => {
|
||||||
|
input.base = normalizeProps(props) as UnheadBase
|
||||||
|
return null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -213,16 +220,18 @@ export const Title = defineComponent({
|
|||||||
name: 'Title',
|
name: 'Title',
|
||||||
inheritAttrs: false,
|
inheritAttrs: false,
|
||||||
setup (_, { slots }) {
|
setup (_, { slots }) {
|
||||||
const defaultSlot = slots.default?.()
|
|
||||||
if (import.meta.dev) {
|
|
||||||
if (defaultSlot && (defaultSlot.length > 1 || (defaultSlot[0] && typeof defaultSlot[0].children !== 'string'))) {
|
|
||||||
console.error('<Title> can take only one string in its default slot.')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.title = defaultSlot?.[0]?.children ? String(defaultSlot?.[0]?.children) : undefined
|
|
||||||
onUnmounted(() => input.title = null)
|
onUnmounted(() => input.title = null)
|
||||||
return () => null
|
return () => {
|
||||||
|
const defaultSlot = slots.default?.()
|
||||||
|
input.title = defaultSlot?.[0]?.children ? String(defaultSlot?.[0]?.children) : undefined
|
||||||
|
if (import.meta.dev) {
|
||||||
|
if (defaultSlot && (defaultSlot.length > 1 || (defaultSlot[0] && typeof defaultSlot[0].children !== 'string'))) {
|
||||||
|
console.error('<Title> can take only one string in its default slot.')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -239,16 +248,19 @@ export const Meta = defineComponent({
|
|||||||
property: String,
|
property: String,
|
||||||
},
|
},
|
||||||
setup (props) {
|
setup (props) {
|
||||||
const meta = { 'http-equiv': props.httpEquiv, ...normalizeProps(props) } as UnheadMeta
|
|
||||||
// fix casing for http-equiv
|
|
||||||
if ('httpEquiv' in meta) {
|
|
||||||
delete meta.httpEquiv
|
|
||||||
}
|
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.meta ||= []
|
input.meta ||= []
|
||||||
const idx: keyof typeof input.meta = input.meta.push(meta) - 1
|
const idx: keyof typeof input.meta = input.meta.push({}) - 1
|
||||||
onUnmounted(() => input.meta![idx] = null)
|
onUnmounted(() => input.meta![idx] = null)
|
||||||
return () => null
|
return () => {
|
||||||
|
const meta = { 'http-equiv': props.httpEquiv, ...normalizeProps(props) } as UnheadMeta
|
||||||
|
// fix casing for http-equiv
|
||||||
|
if ('httpEquiv' in meta) {
|
||||||
|
delete meta.httpEquiv
|
||||||
|
}
|
||||||
|
input.meta![idx] = meta
|
||||||
|
return null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -270,19 +282,21 @@ export const Style = defineComponent({
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
setup (props, { slots }) {
|
setup (props, { slots }) {
|
||||||
const style = normalizeProps(props) as UnheadStyle
|
|
||||||
const textContent = slots.default?.()?.[0]?.children
|
|
||||||
if (textContent) {
|
|
||||||
if (import.meta.dev && typeof textContent !== 'string') {
|
|
||||||
console.error('<Style> can only take a string in its default slot.')
|
|
||||||
}
|
|
||||||
style.textContent = textContent
|
|
||||||
}
|
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.style ||= []
|
input.style ||= []
|
||||||
const idx: keyof typeof input.style = input.style.push(style) - 1
|
const idx: keyof typeof input.style = input.style.push({}) - 1
|
||||||
onUnmounted(() => input.style![idx] = null)
|
onUnmounted(() => input.style![idx] = null)
|
||||||
return () => null
|
return () => {
|
||||||
|
const style = normalizeProps(props) as UnheadStyle
|
||||||
|
const textContent = slots.default?.()?.[0]?.children
|
||||||
|
if (textContent) {
|
||||||
|
if (import.meta.dev && typeof textContent !== 'string') {
|
||||||
|
console.error('<Style> can only take a string in its default slot.')
|
||||||
|
}
|
||||||
|
style.textContent = textContent
|
||||||
|
}
|
||||||
|
return null
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -308,9 +322,11 @@ export const Html = defineComponent({
|
|||||||
},
|
},
|
||||||
setup (_props, ctx) {
|
setup (_props, ctx) {
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.htmlAttrs = { ..._props } as HtmlAttributes
|
|
||||||
onUnmounted(() => input.htmlAttrs = null)
|
onUnmounted(() => input.htmlAttrs = null)
|
||||||
return () => ctx.slots.default?.()
|
return () => {
|
||||||
|
input.htmlAttrs = { ..._props } as HtmlAttributes
|
||||||
|
return ctx.slots.default?.()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -321,8 +337,10 @@ export const Body = defineComponent({
|
|||||||
props: globalProps,
|
props: globalProps,
|
||||||
setup (_props, ctx) {
|
setup (_props, ctx) {
|
||||||
const { input } = useHeadComponentCtx()
|
const { input } = useHeadComponentCtx()
|
||||||
input.bodyAttrs = { ..._props } as BodyAttributes
|
|
||||||
onUnmounted(() => input.bodyAttrs = null)
|
onUnmounted(() => input.bodyAttrs = null)
|
||||||
return () => ctx.slots.default?.()
|
return () => {
|
||||||
|
input.bodyAttrs = { ..._props } as BodyAttributes
|
||||||
|
return ctx.slots.default?.()
|
||||||
|
}
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user