fix(compiler-sfc): fix template expression assignment codegen for script setup let refs (#3626)

fix #3625
This commit is contained in:
edison 2021-05-29 05:58:46 +08:00 committed by GitHub
parent aa96a0e88a
commit 2c7bd42801
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 2 deletions

View File

@ -143,14 +143,14 @@ export function processExpression(
// let is a local non-ref value, and we need to replicate the // let is a local non-ref value, and we need to replicate the
// right hand side value. // right hand side value.
// x = y --> isRef(x) ? x.value = y : x = y // x = y --> isRef(x) ? x.value = y : x = y
const rVal = (parent as AssignmentExpression).right const { right: rVal, operator } = parent as AssignmentExpression
const rExp = rawExp.slice(rVal.start! - 1, rVal.end! - 1) const rExp = rawExp.slice(rVal.start! - 1, rVal.end! - 1)
const rExpString = stringifyExpression( const rExpString = stringifyExpression(
processExpression(createSimpleExpression(rExp, false), context) processExpression(createSimpleExpression(rExp, false), context)
) )
return `${context.helperString(IS_REF)}(${raw})${ return `${context.helperString(IS_REF)}(${raw})${
context.isTS ? ` //@ts-ignore\n` : `` context.isTS ? ` //@ts-ignore\n` : ``
} ? ${raw}.value = ${rExpString} : ${raw}` } ? ${raw}.value ${operator} ${rExpString} : ${raw}`
} else if (isUpdateArg) { } else if (isUpdateArg) {
// make id replace parent in the code range so the raw update operator // make id replace parent in the code range so the raw update operator
// is removed // is removed

View File

@ -361,6 +361,7 @@ export default {
const count = ref(0) const count = ref(0)
const maybe = foo() const maybe = foo()
let lett = 1 let lett = 1
let v = ref(1)
return (_ctx, _cache) => { return (_ctx, _cache) => {
return (_openBlock(), _createBlock(_Fragment, null, [ return (_openBlock(), _createBlock(_Fragment, null, [
@ -372,6 +373,12 @@ return (_ctx, _cache) => {
}), }),
_createVNode(\\"div\\", { _createVNode(\\"div\\", {
onClick: _cache[3] || (_cache[3] = $event => (_isRef(lett) ? lett.value = count.value : lett = count.value)) onClick: _cache[3] || (_cache[3] = $event => (_isRef(lett) ? lett.value = count.value : lett = count.value))
}),
_createVNode(\\"div\\", {
onClick: _cache[4] || (_cache[4] = $event => (_isRef(v) ? v.value += 1 : v += 1))
}),
_createVNode(\\"div\\", {
onClick: _cache[5] || (_cache[5] = $event => (_isRef(v) ? v.value -= 1 : v -= 1))
}) })
], 64 /* STABLE_FRAGMENT */)) ], 64 /* STABLE_FRAGMENT */))
} }

View File

@ -300,11 +300,14 @@ const myEmit = defineEmit(['foo', 'bar'])
const count = ref(0) const count = ref(0)
const maybe = foo() const maybe = foo()
let lett = 1 let lett = 1
let v = ref(1)
</script> </script>
<template> <template>
<div @click="count = 1"/> <div @click="count = 1"/>
<div @click="maybe = count"/> <div @click="maybe = count"/>
<div @click="lett = count"/> <div @click="lett = count"/>
<div @click="v += 1"/>
<div @click="v -= 1"/>
</template> </template>
`, `,
{ inlineTemplate: true } { inlineTemplate: true }
@ -317,6 +320,8 @@ const myEmit = defineEmit(['foo', 'bar'])
expect(content).toMatch( expect(content).toMatch(
`_isRef(lett) ? lett.value = count.value : lett = count.value` `_isRef(lett) ? lett.value = count.value : lett = count.value`
) )
expect(content).toMatch(`_isRef(v) ? v.value += 1 : v += 1`)
expect(content).toMatch(`_isRef(v) ? v.value -= 1 : v -= 1`)
assertCode(content) assertCode(content)
}) })