]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
fix(compiler-vapor): prevent duplicate processing of member expressions in expression...
authoredison <daiwei521@126.com>
Tue, 18 Nov 2025 00:56:02 +0000 (08:56 +0800)
committerGitHub <noreply@github.com>
Tue, 18 Nov 2025 00:56:02 +0000 (08:56 +0800)
packages/compiler-vapor/__tests__/transforms/__snapshots__/vBind.spec.ts.snap
packages/compiler-vapor/__tests__/transforms/vBind.spec.ts
packages/compiler-vapor/src/generators/expression.ts

index 228dbc0c5427bd77ed648bbd52ebc5b7fc9be5f9..e2579c9ff7fa92cb32d32af51bedd83b8825f340 100644 (file)
@@ -57,6 +57,21 @@ export function render(_ctx) {
 }"
 `;
 
+exports[`cache multiple access > dynamic property access with parentheses 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 _foo_bar = _ctx.foo[_ctx.bar]
+    _setProp(n0, "x", (_foo_bar).x)
+    _setProp(n0, "bar", (_foo_bar))
+  })
+  return n0
+}"
+`;
+
 exports[`cache multiple access > function calls with arguments 1`] = `
 "import { setProp as _setProp, renderEffect as _renderEffect, template as _template } from 'vue';
 const t0 = _template("<div></div>")
index e30a54f203bf84bf18e2e53bb5fa66a5a4492a55..63744c2ad783aeb3e3c26ae7afc2fba68a6bdb94 100644 (file)
@@ -801,6 +801,16 @@ describe('cache multiple access', () => {
     expect(code).contains('_setProp(n0, "id", _obj[1][_ctx.baz] + _obj.bar)')
   })
 
+  test('dynamic property access with parentheses', () => {
+    const { code } = compileWithVBind(`
+        <div :x="(foo[bar]).x" :bar="(foo[bar])"></div>
+      `)
+    expect(code).matchSnapshot()
+    expect(code).contains('const _foo_bar = _ctx.foo[_ctx.bar]')
+    expect(code).contains('_setProp(n0, "x", (_foo_bar).x)')
+    expect(code).contains('_setProp(n0, "bar", (_foo_bar))')
+  })
+
   test('variable name substring edge cases', () => {
     const { code } = compileWithVBind(
       `<div :id="title + titles + title"></div>`,
index 8362c6f94040958089ca98236e97b2c65f272020..75803d5629bb544625008ccdda1e47b2632df065 100644 (file)
@@ -327,8 +327,10 @@ function analyzeExpressions(expressions: SimpleExpressionNode[]) {
       continue
     }
 
+    const seenParents = new Set<Node>()
     walkIdentifiers(exp.ast, (currentNode, parent, parentStack) => {
-      if (parent && isMemberExpression(parent)) {
+      if (parent && isMemberExpression(parent) && !seenParents.has(parent)) {
+        seenParents.add(parent)
         const memberExp = extractMemberExpression(parent, id => {
           registerVariable(id.name, exp, true, {
             start: id.start!,