mirror of https://github.com/vuejs/core.git
fix(ssr): directive binding.instance should respect exposed during ssr
close #7499 close #7502
This commit is contained in:
parent
9daf90e29f
commit
df686abb4f
|
@ -363,7 +363,11 @@ export { transformVNodeArgs } from './vnode'
|
||||||
// **IMPORTANT** These APIs are exposed solely for @vue/server-renderer and may
|
// **IMPORTANT** These APIs are exposed solely for @vue/server-renderer and may
|
||||||
// change without notice between versions. User code should never rely on them.
|
// change without notice between versions. User code should never rely on them.
|
||||||
|
|
||||||
import { createComponentInstance, setupComponent } from './component'
|
import {
|
||||||
|
createComponentInstance,
|
||||||
|
getComponentPublicInstance,
|
||||||
|
setupComponent,
|
||||||
|
} from './component'
|
||||||
import { renderComponentRoot } from './componentRenderUtils'
|
import { renderComponentRoot } from './componentRenderUtils'
|
||||||
import { setCurrentRenderingInstance } from './componentRenderContext'
|
import { setCurrentRenderingInstance } from './componentRenderContext'
|
||||||
import { isVNode, normalizeVNode } from './vnode'
|
import { isVNode, normalizeVNode } from './vnode'
|
||||||
|
@ -375,6 +379,7 @@ const _ssrUtils = {
|
||||||
setCurrentRenderingInstance,
|
setCurrentRenderingInstance,
|
||||||
isVNode,
|
isVNode,
|
||||||
normalizeVNode,
|
normalizeVNode,
|
||||||
|
getComponentPublicInstance,
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,7 +2,10 @@ import { renderToString } from '../src/renderToString'
|
||||||
import {
|
import {
|
||||||
createApp,
|
createApp,
|
||||||
h,
|
h,
|
||||||
|
mergeProps,
|
||||||
|
ref,
|
||||||
resolveDirective,
|
resolveDirective,
|
||||||
|
unref,
|
||||||
vModelCheckbox,
|
vModelCheckbox,
|
||||||
vModelDynamic,
|
vModelDynamic,
|
||||||
vModelRadio,
|
vModelRadio,
|
||||||
|
@ -542,4 +545,44 @@ describe('ssr: directives', () => {
|
||||||
),
|
),
|
||||||
).toBe(`<div id="foo-arg-true"></div>`)
|
).toBe(`<div id="foo-arg-true"></div>`)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
// #7499
|
||||||
|
test('custom directive w/ getSSRProps (expose)', async () => {
|
||||||
|
let exposeVars: null | string | undefined = null
|
||||||
|
const useTestDirective = () => ({
|
||||||
|
vTest: {
|
||||||
|
getSSRProps({ instance }: any) {
|
||||||
|
if (instance) {
|
||||||
|
exposeVars = instance.x
|
||||||
|
}
|
||||||
|
return { id: exposeVars }
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
const { vTest } = useTestDirective()
|
||||||
|
|
||||||
|
const renderString = await renderToString(
|
||||||
|
createApp({
|
||||||
|
setup(props, { expose }) {
|
||||||
|
const x = ref('foo')
|
||||||
|
expose({ x })
|
||||||
|
const __returned__ = { useTestDirective, vTest, ref, x }
|
||||||
|
Object.defineProperty(__returned__, '__isScriptSetup', {
|
||||||
|
enumerable: false,
|
||||||
|
value: true,
|
||||||
|
})
|
||||||
|
return __returned__
|
||||||
|
},
|
||||||
|
ssrRender(_ctx, _push, _parent, _attrs) {
|
||||||
|
_push(
|
||||||
|
`<div${ssrRenderAttrs(
|
||||||
|
mergeProps(_attrs!, ssrGetDirectiveProps(_ctx, unref(vTest))),
|
||||||
|
)}></div>`,
|
||||||
|
)
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
expect(renderString).toBe(`<div id="foo"></div>`)
|
||||||
|
expect(exposeVars).toBe('foo')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
import type { ComponentPublicInstance, Directive } from '@vue/runtime-core'
|
import {
|
||||||
|
type ComponentPublicInstance,
|
||||||
|
type Directive,
|
||||||
|
ssrUtils,
|
||||||
|
} from '@vue/runtime-core'
|
||||||
|
|
||||||
export function ssrGetDirectiveProps(
|
export function ssrGetDirectiveProps(
|
||||||
instance: ComponentPublicInstance,
|
instance: ComponentPublicInstance,
|
||||||
|
@ -12,7 +16,7 @@ export function ssrGetDirectiveProps(
|
||||||
dir.getSSRProps(
|
dir.getSSRProps(
|
||||||
{
|
{
|
||||||
dir,
|
dir,
|
||||||
instance,
|
instance: ssrUtils.getComponentPublicInstance(instance.$),
|
||||||
value,
|
value,
|
||||||
oldValue: undefined,
|
oldValue: undefined,
|
||||||
arg,
|
arg,
|
||||||
|
|
Loading…
Reference in New Issue