Skip to content

Commit 48a1370

Browse files
authored
fix(compiler-vapor): properly cache variable with optional chaining (#13519)
1 parent c86bf7b commit 48a1370

File tree

3 files changed

+22
-0
lines changed

3 files changed

+22
-0
lines changed

packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,20 @@ export function render(_ctx) {
113113
}"
114114
`;
115115

116+
exports[`cache multiple access > optional chaining 1`] = `
117+
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
118+
const t0 = _template("<div></div>", true)
119+
120+
export function render(_ctx) {
121+
const n0 = t0()
122+
_renderEffect(() => {
123+
const _obj = _ctx.obj
124+
_setProp(n0, "id", _obj?.foo + _obj?.bar)
125+
})
126+
return n0
127+
}"
128+
`;
129+
116130
exports[`cache multiple access > repeated expression in expressions 1`] = `
117131
"import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
118132
const t0 = _template("<div></div>")

packages/compiler-vapor/__tests__/transforms/vBind.spec.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -794,6 +794,13 @@ describe('cache multiple access', () => {
794794
expect(code).contains('_setStyle(n0, {color: _color})')
795795
})
796796

797+
test('optional chaining', () => {
798+
const { code } = compileWithVBind(`<div :id="obj?.foo + obj?.bar"></div>`)
799+
expect(code).matchSnapshot()
800+
expect(code).contains('const _obj = _ctx.obj')
801+
expect(code).contains('_setProp(n0, "id", _obj?.foo + _obj?.bar)')
802+
})
803+
797804
test('not cache variable only used in property shorthand', () => {
798805
const { code } = compileWithVBind(`
799806
<div :style="{color}" />

packages/compiler-vapor/src/generators/expression.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -588,6 +588,7 @@ function extractMemberExpression(
588588
case 'CallExpression': // foo[bar(baz)]
589589
return `${extractMemberExpression(exp.callee, onIdentifier)}(${exp.arguments.map(arg => extractMemberExpression(arg, onIdentifier)).join(', ')})`
590590
case 'MemberExpression': // foo[bar.baz]
591+
case 'OptionalMemberExpression': // foo?.bar
591592
const object = extractMemberExpression(exp.object, onIdentifier)
592593
const prop = exp.computed
593594
? `[${extractMemberExpression(exp.property, onIdentifier)}]`

0 commit comments

Comments
 (0)