рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛, рднрд╛рдЧ 1: рдкрд░рд╕реНрдкрд░ рд╡рд┐рд░реЛрдзреА рд╕рд╣рд╛рд░рд╛ рди рдмрдирд╛рдПрдВ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛, рднрд╛рдЧ 2: рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рдирд╛рдо рджреЗрдВ, рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдирд╣реАрдВ
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛, рднрд╛рдЧ 3: рд╕рд╣рд╛рд░рд╛ рдХрд╛ рдХреНрд░рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ
рд░рд┐рдПрдХреНрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛, рднрд╛рдЧ 4: рдПрдкреНрд░реЛрдкреИрдХрд▓рд┐рдкреНрд╕ рд╕реЗ рд╕рд╛рд╡рдзрд╛рди рд░рд╣реЗрдВ!
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛, рднрд╛рдЧ 5: рдмрд╕ рдЙрдкрдпреЛрдЧ рд╕рдВрд░рдЪрдирд╛
рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рднрд╛рдЧ 6: рд╣рдо рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ
рд░реВрдкреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред
рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрдк рд░реВрдкреЛрдВ рдореЗрдВ state
рдкреНрд░рдмрдВрдзрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдкрдврд╝рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдРрд╕реЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдореИрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдлреЙрд░реНрдо рдФрд░ рдЙрдирдХреЗ рдПрдкреАрдЖрдИ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред

рдпрд╣рд╛рдБ рдмрд╣реБрдд рдХреБрдЫ рдЪрд▓ рд░рд╣рд╛ рд╣реИ, рдПрдкреАрдЖрдИ рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ
<Form layout="label-on-left"> <Form.Field label="Name"> <TextInput type="text" placeholder="Enter your name" /> </Form.Field> <Form.Field label="Email"> <TextInput type="email" placeholder="email@domain.com" /> </Form.Field> </Form>
рдЖрдЗрдП рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рджреЗрдЦреЗрдВ рдФрд░ рдЙрдирдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ:
рдпрд╣ рд╕рднреА Form
рдШрдЯрдХ рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдВрд▓рдЧреНрди рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдореВрд▓ рд░реВрдк рддрддреНрд╡ рд╣реИред рдпрд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
function Form(props) { return <form className="form">{props.children}</form> } render(<Form layout="label-on-left">...</Form>)
рдпрд╣ рдкреНрд░реЛрдк layout
рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХрдо рдЬрдЧрд╣ рд╣реЛрдиреЗ рдкрд░ рдЙрдкрдпреЛрдЧреА рд╣реЛрддрд╛ рд╣реИред

<Form layout="label-on-top">...</Form>
рдпрд╣ рдЙрди рддрд░реАрдХреЛрдВ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ рдЬреЛ рд▓реЗрдмрд▓ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрддреЗ рд╣реИрдВ (рджрд╛рдПрдВ рд╕реЗ рдмрд╛рдПрдВ) рдФрд░ рдХреИрд╕реЗ margin
рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдкреНрд░рдкрддреНрд░ рдЗрд╕рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рд╛рдордЧреНрд░реА рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ margin
рдирд┐рдпрдВрддреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдлреЙрд░реНрдо рдХреЗ рдЕрдВрджрд░ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдЪрд┐рдВрддрд╛ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред
рддреЛ Form
рдШрдЯрдХ рдХреЛ рдиреАрдЪреЗ рджреА рдЧрдИ layout
рдЬрд╛рдирдХрд╛рд░реА рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдк layout
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ layout
рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдлрд╝реЙрд░реНрдо рдХреА рд╕рд╛рдордЧреНрд░реА рдЧрддрд┐рд╢реАрд▓ рд╣реИ (рдбреЗрд╡рд▓рдкрд░ рджреНрд╡рд╛рд░рд╛ рдЗрд╕ рдлреЙрд░реНрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдлреЙрд░реНрдо рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рд╕рдВрджрд░реНрдн API рд╣рдорд╛рд░реА рдорджрдж рдХрд░рддрд╛ рд╣реИред
const LayoutContext = React.createContext() function Form(props) { return ( <form className="form"> <LayoutContext.Provider value={{ layout: props.layout }} > {props.children} </LayoutContext.Provider> </form> ) } export default Form export { LayoutContext }
рдЕрдм рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдЗрд╕ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИ рдФрд░ layout
рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреА рд╣реИ
FormField
рдШрдЯрдХ (рдлреЙрд░реНрдо рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб) рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдореЗрдВ рдбрд╛рд▓реА рдЧрдИ рд╣рд░ рдЪреАрдЬрд╝ рдХреЗ рд▓рд┐рдП рдПрдХ label
рдЬреЛрдбрд╝рддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ)ред
function Field(props) { return ( <div className="form-field"> <label {...props}>{props.label}</label> {props.children} </div> ) }
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╣ layout
рд▓рд┐рдП рдПрдХ рд╡рд░реНрдЧ рдЬреЛрдбрд╝рддрд╛ рд╣реИ - рдЬреЛ рдЙрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рдЖрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдордиреЗ Form
рдШрдЯрдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛ред
import { LayoutContext } from './form' function Field(props) { return ( <LayoutContext.Consumer> {context => ( <div className={`form-field ${context.layout}`}> <label {...props}>{props.label}</label> {props.children} </div> )} </LayoutContext.Consumer> ) }
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16.8+ рдЙрдкрдпреЛрдЧрдХрдВрдЯреЗрдХреНрд╕реНрдЯ рд╣реБрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ
import { LayoutContext } from './form' function Field(props) { const context = useContext(LayoutContext) return ( <div className={`form-field ${context.layout}`}> <label {...props}>{props.label}</label> {props.children} </div> ) }
рдпрджрд┐ рдЖрдк рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдБ рд╕реАрдПрд╕рдПрд╕ рдХреЛрдб рд╣реИ:
.form-field.label-on-left { max-width: 625px; display: flex; align-items: center; } .form-field.label-on-left label { text-align: right; width: 175px; margin-right: 25px; } .form-field.label-on-top { width: 100%; display: block; } .form-field.label-on-top label { text-align: left; margin-bottom: 25px; }
рдЕрдВрддрд┐рдо рд╡рд┐рд╕реНрддрд╛рд░ рдЬреЛ рдореИрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЬреАрдм рдмрд┐рдВрджреАрджрд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред
рдЪреВрдВрдХрд┐ Field
(рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб) рд╣рдореЗрд╢рд╛ рдПрдХ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:
import Field from './field' function Form(props) { } export default Form export { Field }
рдФрд░ рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
import Form, { Field } from 'components/form' render( <Form> <Field>...</Field> </Form> )
рдлреЙрд░реНрдо рдХреЗ рдмрд╣реБрдд рдШрдЯрдХ рдХреЛ Field
рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
import Field from './field' function Form(props) { } Form.Field = Field export default Form
рдпрд╣ рдХреЛрдб рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ, рдФрд░ рдЖрдк рдЗрди рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдВрдЬреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╡рд╣ Form
рдЖрдпрд╛рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ рд╕реНрд╡рддрдГ рд╣реА рдПрдХ Field
рдкреНрд░рд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред
import Form from 'components/form' render( <Form> <Form.Field>...</Form.Field> </Form> )
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдПрдкреАрдЖрдИ рдХреЛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ, рдпрд╣ Form
рдФрд░ Form
рдмреАрдЪ рд╕рдВрдмрдВрдз рдмрдирд╛рддрд╛ рд╣реИред рд╕реНрдкрд╖реНрдЯ рд╣реИред
рдиреЛрдЯ: рдЖрдкрдХреЛ рдкрд░рд┐рдкрддреНрд░ рдирд┐рд░реНрднрд░рддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдХреЛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбреЙрдЯреНрд╕ рдФрд░ рд╕рдВрджрд░реНрдн рдХреЗ рд╕рд╛рде рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХрд╛ рд╕рдВрдпреЛрдЬрди рд╣рдорд╛рд░реЗ Form
рдШрдЯрдХ рдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд░рдЪрдирд╛рдУрдВ (рд╕рдордЧреНрд░) рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред