| 1234567891011121314151617181920212223242526272829303132333435 |
- import { type ShallowRef, readonly, shallowRef } from '@vue/reactivity'
- import { getCurrentInstance } from '../component'
- import { warn } from '../warning'
- import { EMPTY_OBJ } from '@vue/shared'
- export function useTemplateRef<T = unknown, Keys extends string = string>(
- key: Keys,
- ): Readonly<ShallowRef<T | null>> {
- const i = getCurrentInstance()
- 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.`)
- } else {
- Object.defineProperty(refs, key, {
- enumerable: true,
- get: () => r.value,
- set: val => (r.value = val),
- })
- }
- } else if (__DEV__) {
- warn(
- `useTemplateRef() is called when there is no active component ` +
- `instance to be associated with.`,
- )
- }
- return (__DEV__ ? readonly(r) : r) as any
- }
|