Skip to content

Commit 55acabe

Browse files
authored
dx(useTemplateRef): warn when declaring with the same key (#11462)
1 parent 6d4eb94 commit 55acabe

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

packages/runtime-core/__tests__/helpers/useTemplateRef.spec.ts

+14
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,18 @@ describe('useTemplateRef', () => {
6868
expect(t2!.value).toBe(root.children[0])
6969
expect(t1!.value).toBe(null)
7070
})
71+
72+
test('should warn on duplicate useTemplateRef', () => {
73+
const root = nodeOps.createElement('div')
74+
render(
75+
h(() => {
76+
useTemplateRef('foo')
77+
useTemplateRef('foo')
78+
return ''
79+
}),
80+
root,
81+
)
82+
83+
expect(`useTemplateRef('foo') already exists.`).toHaveBeenWarned()
84+
})
7185
})

packages/runtime-core/src/helpers/useTemplateRef.ts

+15-5
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,21 @@ export function useTemplateRef<T = unknown, Keys extends string = string>(
1010
const r = shallowRef(null)
1111
if (i) {
1212
const refs = i.refs === EMPTY_OBJ ? (i.refs = {}) : i.refs
13-
Object.defineProperty(refs, key, {
14-
enumerable: true,
15-
get: () => r.value,
16-
set: val => (r.value = val),
17-
})
13+
14+
let desc: PropertyDescriptor | undefined
15+
if (
16+
__DEV__ &&
17+
(desc = Object.getOwnPropertyDescriptor(refs, key)) &&
18+
!desc.configurable
19+
) {
20+
warn(`useTemplateRef('${key}') already exists.`)
21+
} else {
22+
Object.defineProperty(refs, key, {
23+
enumerable: true,
24+
get: () => r.value,
25+
set: val => (r.value = val),
26+
})
27+
}
1828
} else if (__DEV__) {
1929
warn(
2030
`useTemplateRef() is called when there is no active component ` +

0 commit comments

Comments
 (0)