fix(compiler): fix template ref codegen for setup-maybe-ref binding types (#4549)

fix #4546
This commit is contained in:
ygj6
2021-09-16 23:33:16 +08:00
committed by GitHub
parent 14fcced281
commit f29d061124
2 changed files with 95 additions and 6 deletions

View File

@@ -48,7 +48,8 @@ import {
KEEP_ALIVE,
SUSPENSE,
UNREF,
GUARD_REACTIVE_PROPS
GUARD_REACTIVE_PROPS,
IS_REF
} from '../runtimeHelpers'
import {
getInnerRange,
@@ -61,7 +62,7 @@ import {
} from '../utils'
import { buildSlots } from './vSlot'
import { getConstantType } from './hoistStatic'
import { BindingMetadata, BindingTypes } from '../options'
import { BindingTypes } from '../options'
import {
checkCompatEnabled,
CompilerDeprecationTypes,
@@ -475,7 +476,7 @@ export function buildProps(
if (!__BROWSER__ && context.inline && value?.content) {
valueNode = createFunctionExpression(['_value', '_refs'])
valueNode.body = createBlockStatement(
processInlineRef(context.bindingMetadata, value.content)
processInlineRef(context, value.content)
)
}
}
@@ -894,15 +895,28 @@ function isComponentTag(tag: string) {
}
function processInlineRef(
bindings: BindingMetadata,
context: TransformContext,
raw: string
): JSChildNode[] {
const body = [createSimpleExpression(`_refs['${raw}'] = _value`)]
const type = bindings[raw]
const { bindingMetadata, helperString } = context
const type = bindingMetadata[raw]
if (type === BindingTypes.SETUP_REF) {
body.push(createSimpleExpression(`${raw}.value = _value`))
} else if (type === BindingTypes.SETUP_MAYBE_REF) {
body.push(
createSimpleExpression(
`${helperString(IS_REF)}(${raw}) && (${raw}.value = _value)`
)
)
} else if (type === BindingTypes.SETUP_LET) {
body.push(createSimpleExpression(`${raw} = _value`))
body.push(
createSimpleExpression(
`${helperString(
IS_REF
)}(${raw}) ? ${raw}.value = _value : ${raw} = _value`
)
)
}
return body
}