Merge branch 'edison/fix/cacheOptionalMemberExpr' into edison/testVapor
ci / test (push) Waiting to run Details
ci / continuous-release (push) Waiting to run Details

This commit is contained in:
daiwei 2025-06-23 21:43:46 +08:00
commit 061a4b34b1
3 changed files with 22 additions and 0 deletions

View File

@ -113,6 +113,20 @@ export function render(_ctx) {
}"
`;
exports[`cache multiple access > optional chaining 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>", true)
export function render(_ctx) {
const n0 = t0()
_renderEffect(() => {
const _obj = _ctx.obj
_setProp(n0, "id", _obj?.foo + _obj?.bar)
})
return n0
}"
`;
exports[`cache multiple access > repeated expression in expressions 1`] = `
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
const t0 = _template("<div></div>")

View File

@ -794,6 +794,13 @@ describe('cache multiple access', () => {
expect(code).contains('_setStyle(n0, {color: _color})')
})
test('optional chaining', () => {
const { code } = compileWithVBind(`<div :id="obj?.foo + obj?.bar"></div>`)
expect(code).matchSnapshot()
expect(code).contains('const _obj = _ctx.obj')
expect(code).contains('_setProp(n0, "id", _obj?.foo + _obj?.bar)')
})
test('not cache variable only used in property shorthand', () => {
const { code } = compileWithVBind(`
<div :style="{color}" />

View File

@ -588,6 +588,7 @@ function extractMemberExpression(
case 'CallExpression': // foo[bar(baz)]
return `${extractMemberExpression(exp.callee, onIdentifier)}(${exp.arguments.map(arg => extractMemberExpression(arg, onIdentifier)).join(', ')})`
case 'MemberExpression': // foo[bar.baz]
case 'OptionalMemberExpression': // foo?.bar
const object = extractMemberExpression(exp.object, onIdentifier)
const prop = exp.computed
? `[${extractMemberExpression(exp.property, onIdentifier)}]`