]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
revert: perf(templateRef): avoid double render when using template ref on v-for
authorEvan You <yyx990803@gmail.com>
Wed, 7 Feb 2024 05:24:03 +0000 (13:24 +0800)
committerEvan You <yyx990803@gmail.com>
Wed, 7 Feb 2024 05:25:18 +0000 (13:25 +0800)
This reverts commit de4d2e2143ea8397cebeb1c7a57a60007b283c9f.

reopen #9908
close #10210, close #10234

packages/runtime-core/src/rendererTemplateRef.ts

index 7f991bc9f5f919548ada395bf16f8d7e37a0cf3f..b652edeac4c96a3dea6ba02a6ccdbfc2128e9023 100644 (file)
@@ -81,10 +81,9 @@ export function setRef(
   } else {
     const _isString = isString(ref)
     const _isRef = isRef(ref)
-    const isVFor = rawRef.f
     if (_isString || _isRef) {
       const doSet = () => {
-        if (isVFor) {
+        if (rawRef.f) {
           const existing = _isString
             ? hasOwn(setupState, ref)
               ? setupState[ref]
@@ -119,15 +118,14 @@ export function setRef(
           warn('Invalid template ref type:', ref, `(${typeof ref})`)
         }
       }
-      // #9908 ref on v-for mutates the same array for both mount and unmount
-      // and should be done together
-      if (isUnmount || isVFor) {
-        doSet()
-      } else {
-        // #1789: set new refs in a post job so that they don't get overwritten
-        // by unmounting ones.
+      if (value) {
+        // #1789: for non-null values, set them after render
+        // null values means this is unmount and it should not overwrite another
+        // ref with the same key
         ;(doSet as SchedulerJob).id = -1
         queuePostRenderEffect(doSet, parentSuspense)
+      } else {
+        doSet()
       }
     } else if (__DEV__) {
       warn('Invalid template ref type:', ref, `(${typeof ref})`)