import { computed, inject, unref } from 'vue' import { isClient } from '@vueuse/core' import { debugWarn } from '@element-plus/utils' import type { InjectionKey, Ref } from 'vue' import type { MaybeRef } from '@vueuse/core' export type ElIdInjectionContext = { prefix: number current: number } const defaultIdInjection = { prefix: Math.floor(Math.random() * 10000), current: 0, } export const ID_INJECTION_KEY: InjectionKey = Symbol('elIdInjection') export const useId = (deterministicId?: MaybeRef): Ref => { const idInjection = inject(ID_INJECTION_KEY, defaultIdInjection) if (!isClient && idInjection === defaultIdInjection) { debugWarn( 'IdInjection', `Looks like you are using server rendering, you must provide a id provider to ensure the hydration process to be succeed usage: app.provide(ID_INJECTION_KEY, { prefix: number, current: number, })` ) } const idRef = computed( () => unref(deterministicId) || `el-id-${idInjection.prefix}-${idInjection.current++}` ) return idRef }