
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЪрд╛рд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдЖрдкрдХреЗ рдЬреАрд╡рди рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛ рджреЗрдВрдЧреЗред рдХрдо рд╕реЗ рдХрдо рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ
1) рдиреИрдиреЛрдЗрдб
рдЬреАрдердм рд▓рд┐рдВрдХрдпрд╣ рдПрдХ рдЫреЛрдЯреА рд╕реА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ - рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп рдЖрдИрдбреА рдЬрдирд░реЗрдЯ рдХрд░рдирд╛ред рдпрд╣ рдХрдИ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдкрд╛рддреНрд░реЛрдВ рдХреЗ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдЬрдирд░реЗрдЯрд░ред рдирд┐рд░реНрд╡рд┐рд╡рд╛рдж рдлрд╛рдпрджреЗ: рд╕рд╛рджрдЧреА рдФрд░ рдЫреЛрдЯреЗ рдЖрдХрд╛рд░ -
143 рдмрд╛рдЗрдЯреНрд╕ ред
рдмреЗрд╢рдХ, рдпрджрд┐ рдЖрдк рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд▓реЙрд╢, рддреЛ рдЖрдк рдпреВрдирд┐рдХрдЖрдИрдб () рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЙрдкрдпреЛрдЧ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд╣реИ:
import nanoid from 'nanoid' size = 8 id = nanoid(size)
рдпреБрдкреАрдбреА:рдХрднреА рднреА рд░рд┐рдПрдХреНрдЯ рд▓рд┐рд╕реНрдЯ рдореЗрдВ
рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╕реВрдЪрд┐рдпреЛрдВ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдиреИрдиреЛрдЗрдб () рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВред рдЪреВрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕реЛрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рддрддреНрд╡ рдирдП рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдкреНрд░рджрд░реНрд╢рди рдкрд░ рдмрд╣реБрдд рдмреБрд░рд╛ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓реЗрдЧрд╛ рдФрд░ рдЖрдо рддреМрд░ рдкрд░ рдХреБрдВрдЬреА рдХрд╛ рдЕрд░реНрде рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХрд░реЗрдЧрд╛ред
рдХреБрдВрдЬреА рдкрд░ рдЕрдзрд┐рдХ:
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)=>{
рдиреИрдиреЛрдЗрдб рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
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')
рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдХрд┐рд╕реА рднреА рд░рд┐рдПрдХреНрдЯ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдмреЗрд╢рдХ, рдЬрдм рддрдХ рдореБрдЭреЗ рдПрдХ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рдирд╣реАрдВ рдорд┐рд▓ рдЬрд╛рддрд╛ред
3) рдлреЙрд░реНрдорд┐рдХ рдФрд░ рдпреВрдк
рдЬреАрдердм (рд▓рд┐рдВрдХ) рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВGithub (Yup) рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВрд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдХреБрдЫ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, рдЖрдк рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рддреЗ рд╣реИрдВред рд╕рдВрднрд╡рддрдГ рд╣рд░ рд╢реБрд░реБрдЖрддреА рд░рд┐рдПрдХреНрдЯрд░-рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдПрдХ рдмрд┐рдВрджреБ рдкрд░ рд╕рдордЭрд╛ рдХрд┐ рд╡рд╣ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдХреИрд╕реЗ рдирдлрд░рдд рдХрд░рддрд╛ рд╣реИред рдЬрдм рдпрд╣ рд╕рдордЭ рдЖрддреА рд╣реИ, рддреЛ рдпрд╣ рддреБрд░рдВрдд рдПрдХ рдмрдЪрдд рдЧреЛрд▓реА рдХреА рддрд▓рд╛рд╢ рдореЗрдВ рд▓рд╛рдпрдХ рд╣реИред
рдореЗрд░реЗ рд▓рд┐рдП, рдпрд╣ рдЧреЛрд▓реА рдлреЙрд░реНрдорд┐рдХ рдФрд░ рдпреВрдк рдереАред
рдлреЙрд░реНрдорд┐рдХ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдкрддреНрд░ рд╕реЗ рдбреЗрдЯрд╛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛, рдбреЗрдЯрд╛ рдХреЛ рдорд╛рдиреНрдп рдХрд░рдирд╛, рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛, рдФрд░ рдмрд╣реБрдд рдХреБрдЫ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред
рдпреВрдк рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬреЛ рдПрдХ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рд╕реНрд╡рдпрдВ рдпреВрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рддреЗ рд╣реИрдВред
рдЗрд╕ рдЧреБрдЪреНрдЫрд╛ рдХреЗ рдХреБрдЫ рд╣рдж рддрдХ рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдПрдХ рдкрдХреНрд╖реА рдХреА рдЖрдВрдЦ рд╕реЗ рджрд┐рдЦрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рд╡реЗ рдХреНрдпрд╛ рд╣реИрдВред
рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛрдб рдпрд╣рд╛рдВ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдЙрджрд╛рд╣рд░рдгрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдЖрд░реЗрдЦ рдмрдирд╛рдПрдВ:
import * as Yup from "yup"; const BasicFormSchema = Yup.object().shape({ email: Yup.string()
рдКрдкрд░ рджрд┐рдП рдЧрдП рдХреЛрдб рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд╕рд░реНрдХрд┐рдЯ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рд╡рд╕реНрддреБ рд╣реИред рдЗрд╕рдХреЗ рддреАрди рдХреНрд╖реЗрддреНрд░ рд╣реИрдВ: рдИрдореЗрд▓, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдбред рд╣рдордиреЗ рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЬрд╛рдБрдЪреЗрдВ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХреА рд╣реИрдВред
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;
рдХреЛрдб рд╕рд░рд▓ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдпрджрд┐ рд╡реЗ рдЙрддреНрдкрдиреНрди рд╣реБрдП рд╣реИрдВ, рддреЛ рдЧрд┐рдЯрд╣рдм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрддреНрдХреГрд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИрдВ, рдЖрдк рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╡рд╛рд▓ рднреА рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред
рдпрд╣ рдЕрдВрдд рд╣реИред рдореБрдЭреЗ рдкрддрд╛ рд╣реИ рдХрд┐ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЙрддреНрдХреГрд╖реНрдЯ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ, рдХреБрдЫ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рд▓рдЧрддреЗ рд╣реИрдВ, рдХреБрдЫ рд╕рдмрд╕реЗ рдЦрд░рд╛рдмред рдореИрдВрдиреЗ рдпрд╣рд╛рдВ рдЕрдкрдиреА рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░рд╛рдп рд╡реНрдпрдХреНрдд рдХреАред
рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд▓реЗрдЦ рдХрд┐рд╕реА рдХреЛ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЖрдк рдЙрдкрдпреЛрдЧреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдЕрдкрдиреЗ рдЙрджрд╛рд╣рд░рдг рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдореБрдЭреЗ рдХреБрдЫ рдирдпрд╛ рд╕реАрдЦрдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред