refactor: form use genHook (#34888)

This commit is contained in:
MadCcc 2022-04-06 22:14:16 +08:00 committed by GitHub
parent e5efbee968
commit b7c7abfdd4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 62 additions and 83 deletions

View File

@ -1,4 +1,4 @@
import * as React from 'react';
import type * as React from 'react';
import type { ComponentToken as ButtonComponentToken } from '../../button/style';
import type { ComponentToken as DividerComponentToken } from '../../divider/style';
import type { ComponentToken as EmptyComponentToken } from '../../empty/style';
@ -43,6 +43,7 @@ export interface OverrideToken {
Cascader?: CascaderComponentToken;
Divider?: DividerComponentToken;
Empty?: EmptyComponentToken;
Form?: {};
Input?: {};
InputNumber?: InputNumberComponentToken;
Mentions?: MentionsComponentToken;

View File

@ -2,15 +2,17 @@ import * as React from 'react';
import { useMemo } from 'react';
import classNames from 'classnames';
import FieldForm, { List } from 'rc-field-form';
import { FormProps as RcFormProps } from 'rc-field-form/lib/Form';
import { ValidateErrorEntity } from 'rc-field-form/lib/interface';
import { Options } from 'scroll-into-view-if-needed';
import { ColProps } from '../grid/col';
import type { FormProps as RcFormProps } from 'rc-field-form/lib/Form';
import type { ValidateErrorEntity } from 'rc-field-form/lib/interface';
import type { Options } from 'scroll-into-view-if-needed';
import type { ColProps } from '../grid/col';
import { ConfigContext } from '../config-provider';
import { FormContext, FormContextProps } from './context';
import { FormLabelAlign } from './interface';
import type { FormContextProps } from './context';
import { FormContext } from './context';
import type { FormLabelAlign } from './interface';
import useForm, { FormInstance } from './hooks/useForm';
import SizeContext, { SizeType, SizeContextProvider } from '../config-provider/SizeContext';
import type { SizeType } from '../config-provider/SizeContext';
import SizeContext, { SizeContextProvider } from '../config-provider/SizeContext';
import useStyle from './style';
export type RequiredMark = boolean | 'optional';
@ -35,12 +37,7 @@ export interface FormProps<Values = any> extends Omit<RcFormProps<Values>, 'form
const InternalForm: React.ForwardRefRenderFunction<FormInstance, FormProps> = (props, ref) => {
const contextSize = React.useContext(SizeContext);
const {
getPrefixCls,
direction,
form: contextForm,
iconPrefixCls,
} = React.useContext(ConfigContext);
const { getPrefixCls, direction, form: contextForm } = React.useContext(ConfigContext);
const {
prefixCls: customizePrefixCls,
@ -82,7 +79,7 @@ const InternalForm: React.ForwardRefRenderFunction<FormInstance, FormProps> = (p
const prefixCls = getPrefixCls('form', customizePrefixCls);
// Style
const [wrapSSR, hashId] = useStyle(prefixCls, iconPrefixCls, getPrefixCls());
const [wrapSSR, hashId] = useStyle(prefixCls);
const formClassName = classNames(
prefixCls,

View File

@ -1,9 +1,11 @@
import * as React from 'react';
import { ReactNode, useContext, useMemo } from 'react';
import type { ReactNode } from 'react';
import { useContext, useMemo } from 'react';
import classNames from 'classnames';
import { Field, FormInstance, FieldContext, ListContext } from 'rc-field-form';
import { FieldProps } from 'rc-field-form/lib/Field';
import { Meta, NamePath } from 'rc-field-form/lib/interface';
import type { FormInstance } from 'rc-field-form';
import { Field, FieldContext, ListContext } from 'rc-field-form';
import type { FieldProps } from 'rc-field-form/lib/Field';
import type { Meta, NamePath } from 'rc-field-form/lib/interface';
import { supportRef } from 'rc-util/lib/ref';
import useState from 'rc-util/lib/hooks/useState';
import omit from 'rc-util/lib/omit';
@ -16,14 +18,12 @@ import Row from '../grid/row';
import { ConfigContext } from '../config-provider';
import { tuple } from '../_util/type';
import devWarning from '../_util/devWarning';
import FormItemLabel, { FormItemLabelProps, LabelTooltipType } from './FormItemLabel';
import FormItemInput, { FormItemInputProps } from './FormItemInput';
import {
FormContext,
FormItemInputContext,
NoStyleItemContext,
FormItemStatusContextProps,
} from './context';
import type { FormItemLabelProps, LabelTooltipType } from './FormItemLabel';
import FormItemLabel from './FormItemLabel';
import type { FormItemInputProps } from './FormItemInput';
import FormItemInput from './FormItemInput';
import type { FormItemStatusContextProps } from './context';
import { FormContext, FormItemInputContext, NoStyleItemContext } from './context';
import { toArray, getFieldId } from './util';
import { cloneElement, isValidElement } from '../_util/reactNode';
import useFrameState from './hooks/useFrameState';
@ -122,7 +122,7 @@ function FormItem<Values = any>(props: FormItemProps<Values>): React.ReactElemen
hidden,
...restProps
} = props;
const { getPrefixCls, iconPrefixCls } = useContext(ConfigContext);
const { getPrefixCls } = useContext(ConfigContext);
const { name: formName, requiredMark } = useContext(FormContext);
const isRenderProps = typeof children === 'function';
const notifyParentMetaChange = useContext(NoStyleItemContext);
@ -136,7 +136,7 @@ function FormItem<Values = any>(props: FormItemProps<Values>): React.ReactElemen
const prefixCls = getPrefixCls('form', customizePrefixCls);
// Style
const [wrapSSR, hashId] = useStyle(prefixCls, iconPrefixCls, getPrefixCls());
const [wrapSSR, hashId] = useStyle(prefixCls);
// ========================= MISC =========================
// Get `noStyle` required info

View File

@ -1,18 +1,10 @@
// deps-lint-skip-all
import { CSSObject } from '@ant-design/cssinjs';
import {
AliasToken,
GenerateStyle,
resetComponent,
UseComponentStyleResult,
useStyleRegister,
useToken,
} from '../../_util/theme';
import type { CSSObject } from '@ant-design/cssinjs';
import type { AliasToken, FullToken, GenerateStyle } from '../../_util/theme';
import { genComponentStyleHook, resetComponent } from '../../_util/theme';
interface FormToken extends AliasToken {
formCls: string;
interface FormToken extends FullToken<'Form'> {
formItemCls: string;
iconCls: string;
rootPrefixCls: string;
}
@ -86,14 +78,14 @@ const genFormSize = (token: FormToken, height: number): CSSObject => ({
});
const genFormStyle: GenerateStyle<FormToken> = token => {
const { formCls } = token;
const { componentCls } = token;
return {
[token.formCls]: {
[token.componentCls]: {
...resetComponent(token),
...resetForm(token),
[`${formCls}-text`]: {
[`${componentCls}-text`]: {
display: 'inline-block',
paddingInlineEnd: token.paddingSM,
},
@ -113,7 +105,7 @@ const genFormStyle: GenerateStyle<FormToken> = token => {
};
const genFormItemStyle: GenerateStyle<FormToken> = token => {
const { formItemCls, iconCls, formCls, rootPrefixCls } = token;
const { formItemCls, iconCls, componentCls, rootPrefixCls } = token;
return {
[formItemCls]: {
@ -192,7 +184,7 @@ const genFormItemStyle: GenerateStyle<FormToken> = token => {
lineHeight: 1,
content: '"*"',
[`${formCls}-hide-required-mark &`]: {
[`${componentCls}-hide-required-mark &`]: {
display: 'none',
},
},
@ -203,7 +195,7 @@ const genFormItemStyle: GenerateStyle<FormToken> = token => {
marginInlineStart: token.marginXXS,
color: token.colorTextSecondary,
[`${formCls}-hide-required-mark &`]: {
[`${componentCls}-hide-required-mark &`]: {
display: 'none',
},
},
@ -327,10 +319,10 @@ const genFormItemStyle: GenerateStyle<FormToken> = token => {
};
const genFormMotionStyle: GenerateStyle<FormToken> = token => {
const { formCls, rootPrefixCls } = token;
const { componentCls, rootPrefixCls } = token;
return {
[formCls]: {
[componentCls]: {
// Explain holder
[`.${rootPrefixCls}-show-help`]: {
transition: `height ${token.motionDurationSlow} linear,
@ -374,10 +366,10 @@ const genFormMotionStyle: GenerateStyle<FormToken> = token => {
};
const genHorizontalStyle: GenerateStyle<FormToken> = token => {
const { formCls, formItemCls, rootPrefixCls } = token;
const { componentCls, formItemCls, rootPrefixCls } = token;
return {
[`${formCls}-horizontal`]: {
[`${componentCls}-horizontal`]: {
[`${formItemCls}-label`]: {
flexGrow: 0,
},
@ -398,10 +390,10 @@ const genHorizontalStyle: GenerateStyle<FormToken> = token => {
};
const genInlineStyle: GenerateStyle<FormToken> = token => {
const { formCls, formItemCls } = token;
const { componentCls, formItemCls } = token;
return {
[`${formCls}-inline`]: {
[`${componentCls}-inline`]: {
display: 'flex',
flexWrap: 'wrap',
@ -425,7 +417,7 @@ const genInlineStyle: GenerateStyle<FormToken> = token => {
flex: 'none',
},
[`${formCls}-text`]: {
[`${componentCls}-text`]: {
display: 'inline-block',
},
@ -453,13 +445,13 @@ const makeVerticalLayoutLabel = (token: FormToken): CSSObject => ({
});
const makeVerticalLayout = (token: FormToken): CSSObject => {
const { formCls, formItemCls } = token;
const { componentCls, formItemCls } = token;
return {
[`${formItemCls} ${formItemCls}-label`]: {
...makeVerticalLayoutLabel(token),
},
[formCls]: {
[componentCls]: {
[formItemCls]: {
flexWrap: 'wrap',
@ -474,10 +466,10 @@ const makeVerticalLayout = (token: FormToken): CSSObject => {
};
const genVerticalStyle: GenerateStyle<FormToken> = token => {
const { formCls, formItemCls, rootPrefixCls } = token;
const { componentCls, formItemCls, rootPrefixCls } = token;
return {
[`${formCls}-vertical`]: {
[`${componentCls}-vertical`]: {
[formItemCls]: {
flexDirection: 'column',
@ -487,7 +479,7 @@ const genVerticalStyle: GenerateStyle<FormToken> = token => {
},
},
[`${formCls}-vertical ${formItemCls}-label,
[`${componentCls}-vertical ${formItemCls}-label,
.${rootPrefixCls}-col-24${formItemCls}-label,
.${rootPrefixCls}-col-xl-24${formItemCls}-label`]: {
...makeVerticalLayoutLabel(token),
@ -495,7 +487,7 @@ const genVerticalStyle: GenerateStyle<FormToken> = token => {
[`@media (max-width: ${token.screenSMMax}px)`]: {
...makeVerticalLayout(token),
[formCls]: {
[componentCls]: {
[`.${rootPrefixCls}-col-xs-24${formItemCls}-label`]: {
...makeVerticalLayoutLabel(token),
},
@ -503,7 +495,7 @@ const genVerticalStyle: GenerateStyle<FormToken> = token => {
},
[`@media (max-width: ${token.screenSMMax}px)`]: {
[formCls]: {
[componentCls]: {
[`.${rootPrefixCls}-col-sm-24${formItemCls}-label`]: {
...makeVerticalLayoutLabel(token),
},
@ -511,7 +503,7 @@ const genVerticalStyle: GenerateStyle<FormToken> = token => {
},
[`@media (max-width: ${token.screenMDMax}px)`]: {
[formCls]: {
[componentCls]: {
[`.${rootPrefixCls}-col-md-24${formItemCls}-label`]: {
...makeVerticalLayoutLabel(token),
},
@ -519,7 +511,7 @@ const genVerticalStyle: GenerateStyle<FormToken> = token => {
},
[`@media (max-width: ${token.screenLGMax}px)`]: {
[formCls]: {
[componentCls]: {
[`.${rootPrefixCls}-col-lg-24${formItemCls}-label`]: {
...makeVerticalLayoutLabel(token),
},
@ -529,30 +521,19 @@ const genVerticalStyle: GenerateStyle<FormToken> = token => {
};
// ============================== Export ==============================
export default function useStyle(
prefixCls: string,
iconPrefixCls: string,
rootPrefixCls: string,
): UseComponentStyleResult {
const [theme, token, hashId] = useToken();
export default genComponentStyleHook('Form', (token, { rootPrefixCls }) => {
const formToken: FormToken = {
...token,
formCls: `.${prefixCls}`,
formItemCls: `.${prefixCls}-item`,
iconCls: `.${iconPrefixCls}`,
formItemCls: `${token.componentCls}-item`,
rootPrefixCls,
};
return [
useStyleRegister({ theme, token, hashId, path: [prefixCls] }, () => [
genFormStyle(formToken),
genFormItemStyle(formToken),
genFormMotionStyle(formToken),
genHorizontalStyle(formToken),
genInlineStyle(formToken),
genVerticalStyle(formToken),
]),
hashId,
genFormStyle(formToken),
genFormItemStyle(formToken),
genFormMotionStyle(formToken),
genHorizontalStyle(formToken),
genInlineStyle(formToken),
genVerticalStyle(formToken),
];
}
});