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
import {
EffectScope,
type ReactiveEffect,
+ type ShallowRef,
TrackOpTypes,
isRef,
markRaw,
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
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,