рдПрдХ рд░рд┐рдПрдХреНрдЯрд░ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд▓рд┐рдП рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рд╡рд╛рд▓реЗ 4 рдкреБрд╕реНрддрдХрд╛рд▓рдп

рдЫрд╡рд┐

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЪрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ

1) рдиреИрдиреЛрдЗрдб


рдЬреАрдердм рд▓рд┐рдВрдХ
рдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ - рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ред рдпрд╣ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЬрдирд░реЗрдЯрд░ред рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рдлрд╛рдпрджреЗ: рд╕рд╛рджрдЧреА рдФрд░ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ - 143 рдмрд╛рдЗрдЯреНрд╕ ред

рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрд╢, рддреЛ рдЖрдк рдпреВрдирд┐рдХрдЖрдИрдб () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрдпреЛрдЧ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИ:
import nanoid from 'nanoid' size = 8 id = nanoid(size) //cjF38yYc 

рдпреБрдкреАрдбреА:
рдХрднреА рднреА рд░рд┐рдПрдХреНрдЯ рд▓рд┐рд╕реНрдЯ рдореЗрдВ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдпреЛрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдиреИрдиреЛрдЗрдб () рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рддрддреНрд╡ рдирдП рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдмрд╣реБрдд рдмреБрд░рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓реЗрдЧрд╛ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдХреБрдВрдЬреА рдХрд╛ рдЕрд░реНрде рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХрд░реЗрдЧрд╛ред

рдХреБрдВрдЬреА рдкрд░ рдЕрдзрд┐рдХ: reactjs.org/docs/lists-and-keys.html#keys
рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА: habr.com/company/hh/blog/352150

рдиреИрдиреЛрдЗрдб рдХреЗ рдмрд╣реБрдд рдЦрд░рд╛рдм рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 import nanoid from 'nanoid' import React from 'react' const ListDrinks = props=>{ const drinks = ['rum','bear','vodka'] return( <ul> {drinks.map((values)=>{ //   ! return( <li key={nanoid(8)}>{values}</li> ) })} </ul> ) } export default ListDrinks 

рдиреИрдиреЛрдЗрдб рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
 import React, { Component } from 'react'; import nanoid from 'nanoid' class InputWithLabel extends Component { constructor(props){ super(props) this.id = nanoid() } render() { return ( <div> <label htmlFor={this.id}>My label</label> <input id={this.id} type="text"/> </div> ); } } export default InputWithLabel; 


рдореИрдВрдиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдпрд╣ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЕрдЪреНрдЫреЗ рд▓реЛрдЧреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╡реЗ рдЕрд▓рдЧ рд╣реИрдВ, рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

2) рдХреНрд▓рд╛рд╕рдиреЗрдо


рдЬреАрдердм рд▓рд┐рдВрдХ
рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрдХреНрд╖рд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рдзрд╛рд░рдг рд╕рд╢рд░реНрдд рд╕рдВрдШ рдХреЗ рд▓рд┐рдП рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд┐рдЫрд▓реЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдХрдард┐рди рдирд╣реАрдВ рд╣реИред

рд╕рд░рд▓ рдЙрдкрдпреЛрдЧ рдЙрджрд╛рд╣рд░рдг:

 import cn from 'classnames' cn('menu','active')//'menu active' let isActive = true cn('menu',{'active':isActive})//'menu active' isActive = false cn('menu',{'active':isActive})//'menu' 

рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЬрдм рддрдХ рдореБрдЭреЗ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ред

3) рдлреЙрд░реНрдорд┐рдХ рдФрд░ рдпреВрдк


рдЬреАрдердм (рд▓рд┐рдВрдХ) рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ
Github (Yup) рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ
рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрднрд╡рддрдГ рд╣рд░ рд╢реБрд░реБрдЖрддреА рд░рд┐рдПрдХреНрдЯрд░-рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕рдордЭрд╛ рдХрд┐ рд╡рд╣ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рд╕рдордЭ рдЖрддреА рд╣реИ, рддреЛ рдпрд╣ рддреБрд░рдВрдд рдПрдХ рдмрдЪрдд рдЧреЛрд▓реА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд▓рд╛рдпрдХ рд╣реИред

рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЧреЛрд▓реА рдлреЙрд░реНрдорд┐рдХ рдФрд░ рдпреВрдк рдереАред

рдлреЙрд░реНрдорд┐рдХ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдкрддреНрд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред

рдпреВрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрд╡рдпрдВ рдпреВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВред

рдЗрд╕ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рдХреБрдЫ рд╣рдж рддрдХ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдкрдХреНрд╖реА рдХреА рдЖрдВрдЦ рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдпрд╣рд╛рдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: рдЙрджрд╛рд╣рд░рдг

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЖрд░реЗрдЦ рдмрдирд╛рдПрдВ:

 import * as Yup from "yup"; const BasicFormSchema = Yup.object().shape({ email: Yup.string() //,   . // ,      .email("Invalid email address") // ,     .required("Required"), username: Yup.string() //  - 2  .min(2, "Must be longer than 2 characters") //  - 20  .max(20, "Nice try, nobody has a first name that long") .required("Required"), password: Yup.string() .min(8, "Must be longer than 8 characters") .required("Required") }); export default BasicFormSchema; 

рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╕рд░реНрдХрд┐рдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдЗрд╕рдХреЗ рддреАрди рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ: рдИрдореЗрд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдбред рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рдБрдЪреЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИрдВред

Formik рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ <Formik /> рддрддреНрд╡ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧреБрдг рд╣реИрдВ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рд░реЗрдВрдбрд░ рд╣реИ ред

 import React from "react"; import { Formik, Field, Form } from "formik"; import BasicFormSchema from "./BasicFormShema"; const SignUp = () => ( <div className="container"> <h1>Sign up</h1> <Formik //  input- initialValues={{ email: "", username: "", password: "" }} //  ,    validationSchema={BasicFormSchema} //,      onsubmit onSubmit={values => { setTimeout(() => { alert(JSON.stringify(values, null, 2)); }, 500); }} //,     //errors-   //touched- ,   "", // ,   -  render={({ errors, touched }) => ( <Form className="form-container"> <label htmlFor="email">Email</label> <Field name="email" placeholder="mtarasov777@gmail.com" type="email" /> {//       //   ",    errors.email && touched.email && <div className="field-error">{errors.email}</div>} <label htmlFor="username">Username</label> <Field name="username" placeholder="snapoak" type="text" /> {errors.username && touched.username && ( <div className="field-error">{errors.username}</div> )} <label htmlFor="password">Password</label> <Field name="password" placeholder="123456qwe" type="password" /> {errors.password && touched.password && ( <div className="field-error">{errors.password}</div> )} <button type="submit">Submit</button> </Form> )} /> </div> ); export default SignUp; 

рдХреЛрдб рд╕рд░рд▓ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рд╡реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╣реИрдВ, рддреЛ рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ, рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╡рд╛рд▓ рднреА рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред

рдпрд╣ рдЕрдВрдд рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдХреБрдЫ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рдХреБрдЫ рд╕рдмрд╕реЗ рдЦрд░рд╛рдмред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЕрдкрдиреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рд╡реНрдпрдХреНрдд рдХреАред

рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЖрдк рдЙрдкрдпреЛрдЧреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред

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


All Articles