]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
feat(useTemplateRef): allows useTemplateRef to be called multiple times using the...
authordaiwei <daiwei521@126.com>
Tue, 18 Feb 2025 08:48:31 +0000 (16:48 +0800)
committerdaiwei <daiwei521@126.com>
Tue, 18 Feb 2025 08:48:31 +0000 (16:48 +0800)
packages/runtime-core/__tests__/helpers/useTemplateRef.spec.ts
packages/runtime-core/src/component.ts
packages/runtime-core/src/helpers/useTemplateRef.ts

index adc8ed66c7789c76a14462ea8ddef2f766fa660f..d0161225239ecbc55eec701fc7a20089d9c32b26 100644 (file)
@@ -70,18 +70,22 @@ describe('useTemplateRef', () => {
     expect(t1!.value).toBe(null)
   })
 
-  test('should warn on duplicate useTemplateRef', () => {
+  test('should return same element for multiple useTemplateRef calls with same key', async () => {
+    let t1, t2
+    const key = ref('foo')
     const root = nodeOps.createElement('div')
     render(
       h(() => {
-        useTemplateRef('foo')
-        useTemplateRef('foo')
-        return ''
+        t1 = useTemplateRef('foo')
+        t2 = useTemplateRef('foo')
+        return h('div', { ref: key.value })
       }),
       root,
     )
-
-    expect(`useTemplateRef('foo') already exists.`).toHaveBeenWarned()
+    await nextTick()
+    expect(t1!.value).toBe(root.children[0])
+    expect(t2!.value).toBe(root.children[0])
+    expect(t1!.value).toBe(t2!.value)
   })
 
   // #11795
index 3ed42ed0b55bec8c89976c6d010c878b7b196325..4c471ce9cbc599547610f9dfc17f7e87ae04a814 100644 (file)
@@ -2,6 +2,7 @@ import { type VNode, type VNodeChild, isVNode } from './vnode'
 import {
   EffectScope,
   type ReactiveEffect,
+  type ShallowRef,
   TrackOpTypes,
   isRef,
   markRaw,
@@ -461,6 +462,12 @@ export interface ComponentInternalInstance {
   refs: Data
   emit: EmitFn
 
+  /**
+   * used for caching useTemplateRef results
+   * @internal
+   */
+  refsCache?: Map<string, ShallowRef>
+
   /**
    * used for keeping track of .once event handlers on components
    * @internal
index 4cb10ea8139e462c9d9582c62f00531f45563240..aa31c29c22cab7e7900a75bb348241de9aa1db89 100644 (file)
@@ -12,14 +12,12 @@ export function useTemplateRef<T = unknown, Keys extends string = string>(
   const r = shallowRef(null)
   if (i) {
     const refs = i.refs === EMPTY_OBJ ? (i.refs = {}) : i.refs
-    let desc: PropertyDescriptor | undefined
-    if (
-      __DEV__ &&
-      (desc = Object.getOwnPropertyDescriptor(refs, key)) &&
-      !desc.configurable
-    ) {
-      warn(`useTemplateRef('${key}') already exists.`)
+    const refsCache =
+      i.refsCache || (i.refsCache = new Map<string, ShallowRef>())
+    if (refsCache.has(key)) {
+      return refsCache.get(key)!
     } else {
+      refsCache.set(key, r)
       Object.defineProperty(refs, key, {
         enumerable: true,
         get: () => r.value,