From db1d9401fe2685d2a674883e2b492d6f1edad72d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=B8=89=E5=92=B2=E6=99=BA=E5=AD=90?= Date: Fri, 10 Dec 2021 17:21:01 +0800 Subject: [PATCH] feat(components): [el-config-provider] add size (#4730) --- packages/components/button/src/button.ts | 6 ++- packages/components/button/src/button.vue | 26 +++++----- packages/components/cascader/src/index.vue | 8 +-- .../checkbox/src/checkbox-group.vue | 7 ++- .../components/checkbox/src/checkbox.type.ts | 4 +- .../components/checkbox/src/useCheckbox.ts | 25 ++++------ .../components/color-picker/src/index.vue | 8 +-- .../config-provider/src/config-provider.ts | 22 ++++----- .../components/descriptions/src/index.vue | 9 ++-- packages/components/dropdown/src/dropdown.vue | 5 +- .../components/dropdown/src/useDropdown.ts | 4 +- packages/components/form/src/form-item.vue | 14 ++---- .../input-number/src/input-number.vue | 6 +-- packages/components/input/src/input.ts | 5 +- packages/components/input/src/input.vue | 24 ++++----- packages/components/radio/src/radio-group.ts | 5 +- packages/components/radio/src/radio-group.vue | 4 +- packages/components/radio/src/radio.ts | 11 ++--- .../components/select-v2/src/useSelect.ts | 14 ++---- packages/components/select/src/useSelect.ts | 9 ++-- .../table/src/table/style-helper.ts | 7 +-- packages/components/tag/src/tag.vue | 6 +-- .../time-picker/src/common/picker.vue | 9 ++-- packages/hooks/index.ts | 2 + packages/hooks/use-common-props/index.ts | 49 +++++++++++++++++++ packages/hooks/use-form-item/index.ts | 47 +----------------- packages/hooks/use-global-config/index.ts | 21 +++++--- packages/hooks/use-prop/index.ts | 7 +++ packages/tokens/form.ts | 2 +- packages/utils/util.ts | 7 ++- 30 files changed, 178 insertions(+), 195 deletions(-) create mode 100644 packages/hooks/use-common-props/index.ts create mode 100644 packages/hooks/use-prop/index.ts diff --git a/packages/components/button/src/button.ts b/packages/components/button/src/button.ts index 2d2505bc43..1db79ebd42 100644 --- a/packages/components/button/src/button.ts +++ b/packages/components/button/src/button.ts @@ -1,4 +1,4 @@ -import { useFormItemProps } from '@element-plus/hooks' +import { useSizeProp } from '@element-plus/hooks' import { buildProps, definePropType } from '@element-plus/utils/props' import type { ExtractPropTypes, Component } from 'vue' import type button from './button.vue' @@ -17,7 +17,8 @@ export const buttonSize = ['', 'large', 'medium', 'small', 'mini'] as const export const buttonNativeType = ['button', 'submit', 'reset'] as const export const buttonProps = buildProps({ - ...useFormItemProps, + size: useSizeProp, + disabled: Boolean, type: { type: String, values: buttonType, @@ -40,6 +41,7 @@ export const buttonProps = buildProps({ color: String, autoInsertSpace: { type: Boolean, + default: undefined, }, } as const) diff --git a/packages/components/button/src/button.vue b/packages/components/button/src/button.vue index ee91006d96..4ef8b0b75b 100644 --- a/packages/components/button/src/button.vue +++ b/packages/components/button/src/button.vue @@ -38,7 +38,12 @@ import { computed, inject, defineComponent, Text, ref } from 'vue' import { useCssVar } from '@vueuse/core' import { ElIcon } from '@element-plus/components/icon' -import { useFormItem, useGlobalConfig } from '@element-plus/hooks' +import { + useDisabled, + useFormItem, + useGlobalConfig, + useSize, +} from '@element-plus/hooks' import { buttonGroupContextKey } from '@element-plus/tokens' import { Loading } from '@element-plus/icons-vue' @@ -60,10 +65,11 @@ export default defineComponent({ setup(props, { emit, slots }) { const buttonRef = ref() const buttonGroupContext = inject(buttonGroupContextKey, undefined) - const globalConfig = useGlobalConfig() - const autoInsertSpace = computed(() => { - return props.autoInsertSpace ?? globalConfig?.button.autoInsertSpace - }) + const globalConfig = useGlobalConfig('button') + const autoInsertSpace = computed( + () => + props.autoInsertSpace ?? globalConfig.value?.autoInsertSpace ?? false + ) // add space between two characters in Chinese const shouldAddSpace = computed(() => { @@ -78,13 +84,9 @@ export default defineComponent({ return false }) - const { - form, - size: buttonSize, - disabled: buttonDisabled, - } = useFormItem({ - size: computed(() => buttonGroupContext?.size), - }) + const { form } = useFormItem() + const buttonSize = useSize(computed(() => buttonGroupContext?.size)) + const buttonDisabled = useDisabled() const buttonType = computed( () => props.type || buttonGroupContext?.type || 'default' ) diff --git a/packages/components/cascader/src/index.vue b/packages/components/cascader/src/index.vue index 462c8a060b..7a9788a551 100644 --- a/packages/components/cascader/src/index.vue +++ b/packages/components/cascader/src/index.vue @@ -169,12 +169,11 @@ import ElIcon from '@element-plus/components/icon' import { elFormKey, elFormItemKey } from '@element-plus/tokens' import { ClickOutside as Clickoutside } from '@element-plus/directives' -import { useLocale } from '@element-plus/hooks' +import { useLocale, useSize } from '@element-plus/hooks' import { EVENT_CODE, focusNode, getSibling } from '@element-plus/utils/aria' import { UPDATE_MODEL_EVENT, CHANGE_EVENT } from '@element-plus/utils/constants' import isServer from '@element-plus/utils/isServer' -import { useGlobalConfig } from '@element-plus/utils/util' import { addResizeListener, removeResizeListener, @@ -302,7 +301,6 @@ export default defineComponent({ let pressDeleteCount = 0 const { t } = useLocale() - const $ELEMENT = useGlobalConfig() const elForm = inject(elFormKey, {} as ElFormContext) const elFormItem = inject(elFormItemKey, {} as ElFormItemContext) @@ -324,9 +322,7 @@ export default defineComponent({ const inputPlaceholder = computed( () => props.placeholder || t('el.cascader.placeholder') ) - const realSize: ComputedRef = computed( - () => props.size || elFormItem.size || $ELEMENT.size - ) + const realSize = useSize() const tagSize = computed(() => ['small', 'mini'].includes(realSize.value) ? 'mini' : 'small' ) diff --git a/packages/components/checkbox/src/checkbox-group.vue b/packages/components/checkbox/src/checkbox-group.vue index 3d62f5de20..f74f76a082 100644 --- a/packages/components/checkbox/src/checkbox-group.vue +++ b/packages/components/checkbox/src/checkbox-group.vue @@ -15,6 +15,7 @@ import { } from 'vue' import { UPDATE_MODEL_EVENT } from '@element-plus/utils/constants' import { isValidComponentSize } from '@element-plus/utils/validators' +import { useSize } from '@element-plus/hooks' import { useCheckboxGroup } from './useCheckbox' import type { PropType } from 'vue' @@ -54,10 +55,8 @@ export default defineComponent({ emits: [UPDATE_MODEL_EVENT, 'change'], setup(props, ctx) { - const { elFormItem, elFormItemSize, ELEMENT } = useCheckboxGroup() - const checkboxGroupSize = computed( - () => props.size || elFormItemSize.value || ELEMENT.size - ) + const { elFormItem } = useCheckboxGroup() + const checkboxGroupSize = useSize() const changeEvent = (value) => { ctx.emit(UPDATE_MODEL_EVENT, value) diff --git a/packages/components/checkbox/src/checkbox.type.ts b/packages/components/checkbox/src/checkbox.type.ts index 29ba28baf0..36dacf55b0 100644 --- a/packages/components/checkbox/src/checkbox.type.ts +++ b/packages/components/checkbox/src/checkbox.type.ts @@ -1,5 +1,5 @@ import type { ComputedRef } from 'vue' -import type { AnyFunction } from '@element-plus/utils/types' +import type { AnyFunction, ComponentSize } from '@element-plus/utils/types' export interface ICheckboxGroupInstance { name?: string modelValue?: ComputedRef @@ -9,6 +9,6 @@ export interface ICheckboxGroupInstance { size?: ComputedRef fill?: ComputedRef textColor?: ComputedRef - checkboxGroupSize?: ComputedRef + checkboxGroupSize?: ComputedRef changeEvent?: AnyFunction } diff --git a/packages/components/checkbox/src/useCheckbox.ts b/packages/components/checkbox/src/useCheckbox.ts index b39fbb7756..3587ae2931 100644 --- a/packages/components/checkbox/src/useCheckbox.ts +++ b/packages/components/checkbox/src/useCheckbox.ts @@ -1,9 +1,9 @@ import { ref, computed, inject, getCurrentInstance, watch } from 'vue' import { toTypeString } from '@vue/shared' import { UPDATE_MODEL_EVENT } from '@element-plus/utils/constants' -import { useGlobalConfig } from '@element-plus/utils/util' import { elFormKey, elFormItemKey } from '@element-plus/tokens' +import { useSize } from '@element-plus/hooks' import type { ExtractPropTypes } from 'vue' import type { ElFormContext, ElFormItemContext } from '@element-plus/tokens' import type { PartialReturnType } from '@element-plus/utils/types' @@ -39,7 +39,6 @@ export const useCheckboxProps = { export type IUseCheckboxProps = ExtractPropTypes export const useCheckboxGroup = () => { - const ELEMENT = useGlobalConfig() const elForm = inject(elFormKey, {} as ElFormContext) const elFormItem = inject(elFormItemKey, {} as ElFormItemContext) const checkboxGroup = inject('CheckboxGroup', {}) @@ -53,7 +52,6 @@ export const useCheckboxGroup = () => { isGroup, checkboxGroup, elForm, - ELEMENT, elFormItemSize, elFormItem, } @@ -95,14 +93,9 @@ const useCheckboxStatus = ( props: IUseCheckboxProps, { model }: PartialReturnType ) => { - const { isGroup, checkboxGroup, elFormItemSize, ELEMENT } = useCheckboxGroup() + const { isGroup, checkboxGroup } = useCheckboxGroup() const focus = ref(false) - const size = computed( - () => - checkboxGroup?.checkboxGroupSize?.value || - elFormItemSize.value || - ELEMENT.size - ) + const size = useSize(checkboxGroup?.checkboxGroupSize, { prop: true }) const isChecked = computed(() => { const value = model.value if (toTypeString(value) === '[object Boolean]') { @@ -115,12 +108,12 @@ const useCheckboxStatus = ( return !!value } }) - const checkboxSize = computed(() => { - const temCheckboxSize = props.size || elFormItemSize.value || ELEMENT.size - return isGroup.value - ? checkboxGroup?.checkboxGroupSize?.value || temCheckboxSize - : temCheckboxSize - }) + + const checkboxSize = useSize( + computed(() => + isGroup.value ? checkboxGroup?.checkboxGroupSize?.value : undefined + ) + ) return { isChecked, diff --git a/packages/components/color-picker/src/index.vue b/packages/components/color-picker/src/index.vue index fb935565ad..ef7c72c051 100644 --- a/packages/components/color-picker/src/index.vue +++ b/packages/components/color-picker/src/index.vue @@ -111,11 +111,10 @@ import ElButton from '@element-plus/components/button' import ElIcon from '@element-plus/components/icon' import { ClickOutside } from '@element-plus/directives' import { elFormItemKey, elFormKey } from '@element-plus/tokens' -import { useLocale } from '@element-plus/hooks' +import { useLocale, useSize } from '@element-plus/hooks' import ElPopper, { Effect } from '@element-plus/components/popper' import ElInput from '@element-plus/components/input' import { UPDATE_MODEL_EVENT } from '@element-plus/utils/constants' -import { useGlobalConfig } from '@element-plus/utils/util' import { isValidComponentSize } from '@element-plus/utils/validators' import { Close, ArrowDown } from '@element-plus/icons-vue' import AlphaSlider from './components/alpha-slider.vue' @@ -161,7 +160,6 @@ export default defineComponent({ }, emits: ['change', 'active-change', UPDATE_MODEL_EVENT], setup(props, { emit }) { - const ELEMENT = useGlobalConfig() const { t } = useLocale() const elForm = inject(elFormKey, {} as ElFormContext) const elFormItem = inject(elFormItemKey, {} as ElFormItemContext) @@ -187,9 +185,7 @@ export default defineComponent({ } return displayedRgb(color, props.showAlpha) }) - const colorSize = computed(() => { - return props.size || elFormItem.size || ELEMENT.size - }) + const colorSize = useSize() const colorDisabled = computed(() => { return props.disabled || elForm.disabled }) diff --git a/packages/components/config-provider/src/config-provider.ts b/packages/components/config-provider/src/config-provider.ts index c25c39082e..38ce06bc7d 100644 --- a/packages/components/config-provider/src/config-provider.ts +++ b/packages/components/config-provider/src/config-provider.ts @@ -1,16 +1,16 @@ import { useLocaleProps } from '@element-plus/hooks' -import { buildProp, definePropType, mutable } from '@element-plus/utils/props' +import { buildProps, definePropType } from '@element-plus/utils/props' import type { ButtonConfigContext } from '@element-plus/components/button' -export const configProviderProps = { +export const configProviderProps = buildProps({ ...useLocaleProps, - // Add more configs - button: buildProp({ + + size: { + type: String, + values: ['large', 'medium', 'small', 'mini'], + }, + + button: { type: definePropType(Object), - default: () => { - return mutable({ - autoInsertSpace: false, - } as const) - }, - }), -} + }, +} as const) diff --git a/packages/components/descriptions/src/index.vue b/packages/components/descriptions/src/index.vue index bb176804c2..c6045dab38 100644 --- a/packages/components/descriptions/src/index.vue +++ b/packages/components/descriptions/src/index.vue @@ -31,9 +31,9 @@