fix(compiler-sfc): fix template expression assignment codegen for script setup let refs (#3626)
fix #3625
This commit is contained in:
parent
aa96a0e88a
commit
2c7bd42801
@ -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
|
||||||
|
@ -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 */))
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user