1234567891011121314151617181920212223242526272829303132333435363738394041 |
- import { computed, getCurrentInstance } from 'vue'
- import { fromPairs } from 'lodash-unified'
- import { debugWarn } from '@element-plus/utils'
- import type { ComputedRef } from 'vue'
- interface Params {
- excludeListeners?: boolean
- excludeKeys?: ComputedRef<string[]>
- }
- const DEFAULT_EXCLUDE_KEYS = ['class', 'style']
- const LISTENER_PREFIX = /^on[A-Z]/
- export const useAttrs = (
- params: Params = {}
- ): ComputedRef<Record<string, unknown>> => {
- const { excludeListeners = false, excludeKeys } = params
- const allExcludeKeys = computed<string[]>(() => {
- return (excludeKeys?.value || []).concat(DEFAULT_EXCLUDE_KEYS)
- })
- const instance = getCurrentInstance()
- if (!instance) {
- debugWarn(
- 'use-attrs',
- 'getCurrentInstance() returned null. useAttrs() must be called at the top of a setup function'
- )
- return computed(() => ({}))
- }
- return computed(() =>
- fromPairs(
- Object.entries(instance.proxy?.$attrs!).filter(
- ([key]) =>
- !allExcludeKeys.value.includes(key) &&
- !(excludeListeners && LISTENER_PREFIX.test(key))
- )
- )
- )
- }
|