feat(portal): SSR support for portal disabled prop
This commit is contained in:
@@ -9,8 +9,33 @@ describe('ssr compile: portal', () => {
|
||||
return function ssrRender(_ctx, _push, _parent) {
|
||||
_ssrRenderPortal(_push, (_push) => {
|
||||
_push(\`<div></div>\`)
|
||||
}, _ctx.target, _parent)
|
||||
}, _ctx.target, false, _parent)
|
||||
}"
|
||||
`)
|
||||
})
|
||||
|
||||
test('disabled prop handling', () => {
|
||||
expect(compile(`<portal :target="target" disabled><div/></portal>`).code)
|
||||
.toMatchInlineSnapshot(`
|
||||
"const { ssrRenderPortal: _ssrRenderPortal } = require(\\"@vue/server-renderer\\")
|
||||
|
||||
return function ssrRender(_ctx, _push, _parent) {
|
||||
_ssrRenderPortal(_push, (_push) => {
|
||||
_push(\`<div></div>\`)
|
||||
}, _ctx.target, true, _parent)
|
||||
}"
|
||||
`)
|
||||
|
||||
expect(
|
||||
compile(`<portal :target="target" :disabled="foo"><div/></portal>`).code
|
||||
).toMatchInlineSnapshot(`
|
||||
"const { ssrRenderPortal: _ssrRenderPortal } = require(\\"@vue/server-renderer\\")
|
||||
|
||||
return function ssrRender(_ctx, _push, _parent) {
|
||||
_ssrRenderPortal(_push, (_push) => {
|
||||
_push(\`<div></div>\`)
|
||||
}, _ctx.target, _ctx.foo, _parent)
|
||||
}"
|
||||
`)
|
||||
})
|
||||
})
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import {
|
||||
ComponentNode,
|
||||
findProp,
|
||||
JSChildNode,
|
||||
NodeTypes,
|
||||
createSimpleExpression,
|
||||
createFunctionExpression,
|
||||
createCallExpression
|
||||
createCallExpression,
|
||||
ExpressionNode
|
||||
} from '@vue/compiler-dom'
|
||||
import {
|
||||
SSRTransformContext,
|
||||
@@ -27,12 +27,14 @@ export function ssrProcessPortal(
|
||||
return
|
||||
}
|
||||
|
||||
let target: JSChildNode
|
||||
if (targetProp.type === NodeTypes.ATTRIBUTE && targetProp.value) {
|
||||
target = createSimpleExpression(targetProp.value.content, true)
|
||||
} else if (targetProp.type === NodeTypes.DIRECTIVE && targetProp.exp) {
|
||||
target = targetProp.exp
|
||||
let target: ExpressionNode | undefined
|
||||
if (targetProp.type === NodeTypes.ATTRIBUTE) {
|
||||
target =
|
||||
targetProp.value && createSimpleExpression(targetProp.value.content, true)
|
||||
} else {
|
||||
target = targetProp.exp
|
||||
}
|
||||
if (!target) {
|
||||
context.onError(
|
||||
createSSRCompilerError(
|
||||
SSRErrorCodes.X_SSR_NO_PORTAL_TARGET,
|
||||
@@ -42,6 +44,13 @@ export function ssrProcessPortal(
|
||||
return
|
||||
}
|
||||
|
||||
const disabledProp = findProp(node, 'disabled', false, true /* allow empty */)
|
||||
const disabled = disabledProp
|
||||
? disabledProp.type === NodeTypes.ATTRIBUTE
|
||||
? `true`
|
||||
: disabledProp.exp || `false`
|
||||
: `false`
|
||||
|
||||
const contentRenderFn = createFunctionExpression(
|
||||
[`_push`],
|
||||
undefined, // Body is added later
|
||||
@@ -55,6 +64,7 @@ export function ssrProcessPortal(
|
||||
`_push`,
|
||||
contentRenderFn,
|
||||
target,
|
||||
disabled,
|
||||
`_parent`
|
||||
])
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user