рд╣рдо рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдкреАрдЖрдИ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рднрд╛рдЧ 6: рд╣рдо рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдмрдирд╛рддреЗ рд╣реИрдВ

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреАрдЖрдИ рд▓рд┐рдЦрдирд╛, рднрд╛рдЧ 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) { /*     `Provider`       */ 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 рдШрдЯрдХ рдореЗрдВ рдмрдирд╛рдпрд╛ рдерд╛ред


 /*   layout */ import { LayoutContext } from './form' /*           -     API (Render Prop API)         */ 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+ рдЙрдкрдпреЛрдЧрдХрдВрдЯреЗрдХреНрд╕реНрдЯ рд╣реБрдХ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИ


 /*   layout */ import { LayoutContext } from './form' function Field(props) { /*    useContext          */ 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; /*  flex*/ } .form-field.label-on-top label { text-align: left; /*  right */ margin-bottom: 25px; /*  margin-right */ } 

Form.Field?


рдЕрдВрддрд┐рдо рд╡рд┐рд╕реНрддрд╛рд░ рдЬреЛ рдореИрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рд╡рд╣ рд╣реИ рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдЬреАрдм рдмрд┐рдВрджреАрджрд╛рд░ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ред


рдЪреВрдВрдХрд┐ Field (рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб) рд╣рдореЗрд╢рд╛ рдПрдХ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИ, рдпрд╣ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рд╕рдореВрд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред


рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:


 /* form.js */ import Field from './field' function Form(props) { /* ... */ } export default Form export { Field } 

рдФрд░ рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЙрдиреНрд╣реЗрдВ рдПрдХ рд╕рд╛рде рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 import Form, { Field } from 'components/form' render( <Form> <Field>...</Field> </Form> ) 

рдлреЙрд░реНрдо рдХреЗ рдмрд╣реБрдд рдШрдЯрдХ рдХреЛ Field рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ рд╣рдо рдПрдХ рдЫреЛрдЯрд╛ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


 /* form.js */ 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 рдШрдЯрдХ рдХреЛ рд╕реНрдорд╛рд░реНрдЯ рдмрдирд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рд░рдЪрдирд╛рдУрдВ (рд╕рдордЧреНрд░) рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рд╕рдВрдЪрд╛рд▓рди рдХреНрд╖рдорддрд╛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/hi459422/


All Articles