рд░рд┐рдПрдХреНрдЯ рдлреЙрд░реНрдо рдбреЗрд╡рд▓рдкрдореЗрдВрдЯред KISS, YAGNI, рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╕реВрдЦреА рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ

рдирдорд╕реНрдХрд╛рд░, рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд╣рдо рдХреЛрдб рдХреА рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реБрдП рд░рд┐рдПрдХреНрдЯ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓, рд▓реЗрдХрд┐рди рдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХрд╛ рддрд░реАрдХрд╛ рджреЗрдЦреЗрдВрдЧреЗред

рдЬрдм рд╣рдорд╛рд░реЗ рдлрд╛рд░реНрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо "рдХрд┐рд╕", "YAGNI", "рд╕реВрдЦреА" рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЛ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЖрдзреБрдирд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреА рдПрдХ рдЕрдЪреНрдЫреА рдХрдорд╛рди рд╣реИ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ ред



рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕рдВрд░рдЪрдирд╛:







рдХрд╛рд░рдг рдХреЗ рд▓рд┐рдП! рдЪреБрдВрдмрди рдФрд░ YAGNI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рд╕рд░рд▓ рд░реВрдк рд▓реЗрдЦрди


рддреЛ, рдЖрдЗрдП рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рд╛рдзрд┐рдХрд░рдг рдлрд╝реЙрд░реНрдо рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдХрд╛рд░реНрдп рд╣реИ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
const logInData = {
  nickname: 'Vasya',
  email: 'pupkin@gmail.com',
  password: 'Reac5$$$',
};



рд╣рдо рдЪреБрдВрдмрди рдФрд░ YAGNI рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд╕реНрдерд╛рдпреА рд░реВрдк рд╕реЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдмрд╛рдХреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рддреЗ рд╣реИрдВред

KISS - "рдХреЛрдб рд╕рд░рд▓ рдФрд░ рдЧреВрдВрдЧрд╛ рдЫреЛрдбрд╝ рджреЗрдВред" рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рд╕рд░рд▓ рдХреЛрдб рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВред рд▓реЗрдХрд┐рди "рдЧреВрдВрдЧрд╛" рдХреЛрдб рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рдореЗрд░реА рд╕рдордЭ рдореЗрдВ, рдпрд╣ рдХреЛрдб рд╣реИ рдЬреЛ рдХрдо рд╕реЗ рдХрдо рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╕рд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдЗрди рд╕рд╛рд░ рдХрд╛ рдШреЛрдВрд╕рд▓рд╛ рднреА рдиреНрдпреВрдирддрдо рд╣реИред

YAGNI - "рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ" рдХреЛрдб рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИред рд╣рдо рдХреЛрдИ рдРрд╕реА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреА рдмрд╛рдж рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рдпрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рддреА рд╣реЛред рд╣рдо рдХреЗрд╡рд▓ рд╡рд╣реА рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдХрд╛рд░реНрдп рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

рдЖрдЗрдП рдЗрди рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рд╕рдЦреНрддреА рд╕реЗ рдкрд╛рд▓рди рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рднреА рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

  • initialDataрдФрд░ onSubmitрдХреЗ рд▓рд┐рдП LogInFormрдКрдкрд░ рд╕реЗ рдЖрддрд╛ рд╣реИ (рдпрд╣ рдПрдХ рдЙрдкрдпреЛрдЧреА рддрдХрдиреАрдХ рд╣реИ, рдЦрд╛рд╕рдХрд░ рдЬрдм рдкреНрд░рдкрддреНрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП createрдФрд░ updateрдПрдХ рд╣реА рд╕рдордп рдореЗрдВ)
  • рдкреНрд░рддреНрдпреЗрдХ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП label

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

рдХреГрдкрдпрд╛ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реБрдП, рдлреЙрд░реНрдо рдХреЛ рд╕реНрд╡рдпрдВ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

рдореЗрд░рд╛ рдлрд╛рд░реНрдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
const LogInForm = ({ initialData, onSubmit }) => {
  const [logInData, setLogInData] = useState(initialData);

  const handleSubmit = e => {
    e.preventDefault();
    onSubmit(logInData);
  };

  return (
    <form onSubmit={handleSubmit}>
      <label>
        Enter your nickname
        <input
          value={logInData.nickname}
          onChange={e => setLogInData({ ...logInData, nickname: e.target.value })}
        />
      </label>
      <label>
        Enter your email
        <input
          type="email"
          value={logInData.email}
          onChange={e => setLogInData({ ...logInData, email: e.target.value })}
        />
      </label>
      <label>
        Enter your password
        <input
          type="password"
          value={logInData.password}
          onChange={e => setLogInData({ ...logInData, password: e.target.value })}
        />
      </label>
      <button>Submit</button>
    </form>
  );
};
    






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

рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдиреЗ рддреБрд░рдВрдд рд╕рднреА рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╣реИрдВрдбрд▓рд░ рдлрдВрдХреНрд╢рди рдмрдирд╛рдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдорд╕реНрдпрд╛ рдХрд╛ "рдЧреВрдВрдЧрд╛" рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред рдФрд░ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рд╣рдорд╛рд░рд╛ рд▓рдХреНрд╖реНрдп рд╕рдмрд╕реЗ рд╕рд░рд▓ рдФрд░ рд╕рдмрд╕реЗ "рдбрдВрдм" рдХреЛрдб рдмрдирд╛рдирд╛ рд╣реИ рддрд╛рдХрд┐ рдмрд╛рдж рдореЗрдВ рд╣рдо рдкреВрд░реА рддрд╕реНрд╡реАрд░ рдХреЛ рджреЗрдЦ рд╕рдХреЗрдВ рдФрд░ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдЕрдореВрд░реНрддрддрд╛ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХреЗрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╕рдорд╛рди рдХреЛрдб рд╣реИ, рддреЛ рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╕реЛрдЪ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ!

рдЖрдЧреЗ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗред рдпрд╣ рд╕рд░рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдЖрджрд░реНрд╢ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред




рд░рд┐рдлреИрдХреНрдЯрд░рд┐рдВрдЧ рдФрд░ рдбреАрдЖрд░рд╡рд╛рдИ


рдпрд╣ DRY рд╕рд┐рджреНрдзрд╛рдВрдд рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХрд╛ рд╕рдордп рд╣реИред

DRY, рд╕рд░рд▓реАрдХреГрдд рд╢рдмреНрджрд╛рдВрдХрди - "рдЕрдкрдиреЗ рдХреЛрдб рдХреА рдирдХрд▓ рди рдХрд░реЗрдВред" рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд░рд▓ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдореЗрдВ рдПрдХ рдкрдХрдбрд╝ рд╣реИ: рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рд╛рд░ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрди рдХрдкреЛрд▓-рдХрд▓реНрдкрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рд╣рдо KISS рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рд╣реЛрдЧрд╛ред

рдпрд╣ рд╕рдордЭрдирд╛ рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреЛрдб рдХреЛ рддреЗрдЬреА рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП DRY рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЗрд╕рдХрд╛ рдХрд╛рд░реНрдп рд╣рдорд╛рд░реЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рдкрдврд╝рдиреЗ рдФрд░ рд╕рдорд░реНрдерди рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рддреБрд░рдВрдд рдЧрд░реНрднрдкрд╛рдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд▓реНрджреА рдордд рдХрд░реЛред рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣рд┐рд╕реНрд╕реЗ рдХрд╛ рдПрдХ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ рдХрд┐ рдХреЛрдб рдХреЗ рдкрдврд╝рдиреЗ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдХреНрдпрд╛ рдЕрдореВрд░реНрдд рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЙрдиреНрд╣реЗрдВ рдЬрд╝рд░реВрд░рдд рд╣реЛ рддрдм рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрдо рдХрд░реЗрдВред

рд╕рд╣реА рдЕрдореВрд░реНрддрддрд╛ рдХреА рдЬрд╛рдБрдЪ:
  • рдЕрдореВрд░реНрдд рдХрд╛ рдирд╛рдо рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдкрдиреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ
  • рдЕрдореВрд░реНрдд рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ
  • рдЙрд╕ рдХреЛрдб рдХреЛ рдкрдврд╝рдирд╛ рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЕрдореВрд░реНрдд рдирд┐рдХрд╛рд▓рд╛ рдЧрдпрд╛ рдерд╛ рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ

рддреЛ, рдЖрдЗрдП рд░рд┐рдлреНрд▓реЗрдХреНрдЯрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЗрдВред
рдФрд░ рд╣рдордиреЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рдХрд╛ рдЙрдЪреНрдЪрд╛рд░рдг рдХрд┐рдпрд╛ рд╣реИ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  <label>
    Enter your email
    <input
      type="email"
      value={logInData.email}
      onChange={e => setLogInData({ ...logInData, email: e.target.value })}
    />
  </label>
  <label>
    Enter your password
    <input
      type="password"
      value={logInData.password}
      onChange={e => setLogInData({ ...logInData, password: e.target.value })}
    />
  </label>



рдЗрд╕ рдХреЛрдб рдХреЛ 2 рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд░рдЪрдирд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ: label, inputред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рдПрдХ рдирдП рдЕрдореВрд░реНрдд рдореЗрдВ рд╡рд┐рд▓рдп рдХрд░реЗрдВ InputField:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  <label>
    Enter your email
    <input
      type="email"
      value={logInData.email}
      onChange={e => setLogInData({ ...logInData, email: e.target.value })}
    />
  </label>
  <label>
    Enter your password
    <input
      type="password"
      value={logInData.password}
      onChange={e => setLogInData({ ...logInData, password: e.target.value })}
    />
  </label>



рдЕрдм рд╣рдорд╛рд░рд╛ LogInFormрдРрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
const LogInForm = ({ initialData, onSubmit }) => {
  const [logInData, setLogInData] = useState(initialData);

  const handleSubmit = e => {
    e.preventDefault();
    onSubmit(logInData);
  };

  return (
    <form onSubmit={handleSubmit}>
      <InputField
        label="Enter your nickname"
        value={logInData.nickname}
        onChange={e => setLogInData({ ...logInData, nickname: e.target.value })}
      />
      <InputField
        type="email"
        label="Enter your email"
        value={logInData.email}
        onChange={e => setLogInData({ ...logInData, email: e.target.value })}
      />
      <InputField
        type="password"
        label="Enter your password"
        value={logInData.password}
        onChange={e => setLogInData({ ...logInData, password: e.target.value })}
      />
      <button>Submit</button>
    </form>
  );
};



рдкрдврд╝рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЧрдпрд╛ рд╣реИред рдЕрдореВрд░реНрдд рдХрд╛ рдирд╛рдо рдЙрд╕ рдХрд╛рд░реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдШрдЯрдХ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рд╕реНрдкрд╖реНрдЯ рд╣реИред рдХреЛрдб рдХрдо рд╣реЛ рдЧрдпрд╛ рд╣реИред рддреЛ рд╣рдо рд╕рд╣реА рджрд┐рд╢рд╛ рдореЗрдВ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ!

рдЕрдм рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ InputField.onChangeрддрд░реНрдХ рдХреА рдирдХрд▓ рдХреА рдЬрд╛рддреА рд╣реИред
рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рд╡рд╣рд╛рдБ 2 рдЪрд░рдгреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
const stage1 = e => e.target.value;
const stage2 = password => setLogInData({ ...logInData, password });



рдкрд╣рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдШрдЯрдирд╛ рд╕реЗ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд╡рд┐рд╡рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ inputред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 2 рд╕рд╛рд░ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: InputFieldрдФрд░ LogInFormред

рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдореЗрдВ рдЕрдкрдиреЗ рдХреЛрдб рдХреЛ рдХрд┐рд╕ рд╕рд╛рд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдирд╛ рд╣реИ, рд╣рдореЗрдВ DRY рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдкреВрд░реНрдг рд╕реВрддреНрд░реАрдХрд░рдг рдХреА рдУрд░ рдореБрдбрд╝рдирд╛ рд╣реЛрдЧрд╛: "рдЬреНрдЮрд╛рди рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рднрд╛рдЧ рдореЗрдВ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рднреАрддрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп, рд╕реБрд╕рдВрдЧрдд рдФрд░ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред"

рдареЛрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЬреНрдЮрд╛рди рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рдЬрд╛рдирдирд╛ рд╣реИ рдХрд┐ рдШрдЯрдирд╛ рдореЗрдВ рдореВрд▓реНрдп рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдП inputред рдпрджрд┐ рд╣рдо рдЗрд╕ рдЬреНрдЮрд╛рди рдХреЛ рдЕрдкрдиреЗ рдореЗрдВ рд╕рдВрдЧреГрд╣реАрдд рдХрд░реЗрдВрдЧреЗ LogInForm, рддреЛ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпInputFieldрджреВрд╕рд░реЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреА рдирдХрд▓ рдХрд░рдиреА рд╣реЛрдЧреА, рдпрд╛ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рдЕрдореВрд░реНрддрддрд╛ рдореЗрдВ рд▓рд╛рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдФрд░ рдЪреБрдВрдмрди рд╕рд┐рджреНрдзрд╛рдВрдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд╣рдо рдХрдкреЛрд▓-рдХрд▓реНрдкрдирд╛ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдЕрдореВрд░реНрддрддрд╛ рдкреИрджрд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ рдЕрдЧрд░ рд╣рдо рд╕рд┐рд░реНрдл рдЗрд╕ рддрд░реНрдХ рдХреЛ рдЕрдкрдиреЗ рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ InputFieldрдФрд░ рдмрд╛рд╣рд░реА рдХреЛрдб рдХреЛ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдХрд┐ рдЗрдирдкреБрдЯ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ InputFieldред рдпрд╣ рдмрд╕ рдПрдХ рддреИрдпрд╛рд░ рдХрд┐рдП рдЧрдП рдЕрд░реНрде рдкрд░ рд▓реЗ рдЬрд╛рдПрдЧрд╛, рдпрд╣ рднреАрддрд░ рдХреА рддрд░рдл рдЧреБрдЬрд░рддрд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рднреНрд░рдорд┐рдд рд╣реИрдВ рдХрд┐ рдЖрдкрдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдШрдЯрдирд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ YAGNI рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВред рдЖрдк рд╣рдореЗрд╢рд╛ onChangeEventрд╣рдорд╛рд░реЗ рдШрдЯрдХ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░реЛрдк рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ InputFieldред

рддрдм рддрдХ рдРрд╕рд╛ InputFieldрджрд┐рдЦреЗрдЧрд╛:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
const InputField = ({ label, type, value, onChange }) => (
  <label>
    {label}
    <input
      type={type}
      value={value}
      onChange={e => onChange(e.target.value)}
    />
  </label>
);



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

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

рдпрд╣ рд╣реЗрд░рд╛рд╕реНрдЯрд┐рдХ рдЯреНрд░рд┐рдХ рдХрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ v-modelрд╣реИ VueрдЬрд┐рд╕рдореЗрдВ рдХрдИ рд▓реЛрдЧ рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП рдкреНрдпрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рдЪрд▓реЛ рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ LogInFormрдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ InputField:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
const LogInForm = ({ initialData, onSubmit }) => {
  const [logInData, setLogInData] = useState(initialData);

  const handleSubmit = e => {
    e.preventDefault();
    onSubmit(logInData);
  };

  return (
    <form onSubmit={handleSubmit}>
      <InputField
        label="Enter your nickname"
        value={logInData.nickname}
        onChange={nickname => setLogInData({ ...logInData, nickname })}
      />
      <InputField
        type="email"
        label="Enter your email"
        value={logInData.email}
        onChange={email => setLogInData({ ...logInData, email })}
      />
      <InputField
        type="password"
        label="Enter your password"
        value={logInData.password}
        onChange={password => setLogInData({ ...logInData, password })}
      />
      <button>Submit</button>
    </form>
  );
};



рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдФрд░ рднреА рдмреЗрд╣рддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ!

CallbackрдЬреЛ onChangeрд╣рдореЗрд╢рд╛ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ рд╡рд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдХреБрдВрдЬреА рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ: рдкрд╛рд╕рд╡рд░реНрдб, рдИрдореЗрд▓, рдЙрдкрдирд╛рдоред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдХреЙрд▓ рдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ handleChange('password'):ред

рдЖрдЗрдП рдЗрд╕ рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░реЗрдВ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  const handleChange = fieldName => fieldValue => {
    setLogInData({
      ...logInData,
      [fieldName]: fieldValue,
    });
  };



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

рдЖрдЗрдП рдкрд░рд┐рдгрд╛рдореА рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  const LogInForm = ({ initialData, onSubmit }) => {
    const [logInData, setLogInData] = useState(initialData);
  
    const handleSubmit = e => {
      e.preventDefault();
      onSubmit(logInData);
    };
  
    const handleChange = fieldName => fieldValue => {
      setLogInData({
        ...logInData,
        [fieldName]: fieldValue,
      });
    };
  
    return (
      <form onSubmit={handleSubmit}>
        <InputField
          label="Enter your nickname"
          value={logInData.nickname}
          onChange={handleChange('nickname')}
        />
        <InputField
          type="email"
          label="Enter your email"
          value={logInData.email}
          onChange={handleChange('email')}
        />
        <InputField
          type="password"
          label="Enter your password"
          value={logInData.password}
          onChange={handleChange('password')}
        />
        <button>Submit</button>
      </form>
    );
  };
  
  // InputField.js
  const InputField = ({ type, label, value, onChange }) => (
    <label>
      {label}
      <input type={type} value={value} onChange={e => onChange(e.target.value)} />
    </label>
  );



рдпрд╣ рдХреЛрдб рдХрд╛рд░реНрдп рдХрд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд, рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдФрд░ рдорд╛рдореВрд▓реА рдШреЛрд╖рдгрд╛рддреНрдордХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдХрд╛рд░реНрдп рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред




рдФрд░ рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?



рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрдИ рд░реВрдк рд╣реИрдВ, рддреЛ рдЖрдк рд╣реИрдВрдбрд▓ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╣реБрдХ рдореЗрдВ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ useFieldChange:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  // hooks/useFieldChange.js
  const useFieldChange = setState => fieldName => fieldValue => {
    setState(state => ({
      ...state,
      [fieldName]: fieldValue,
    }));
  };
  // LogInForm.js
  const handleChange = useFieldChange(setLogInData);



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

рдЖрдк рдпрд╣ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ callback-рдЬрдЧрд╣ рдореЗрдВ рд╕рдорд░реНрдерди fieldValueрдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдП setStateрд╕реЗ React:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  const isFunc = val => typeof val === "function";

  const useFieldChange = setState => fieldName => fieldValue => {
    setState(state => ({
      ...state,
      [fieldName]: isFunc(fieldValue) ? fieldValue(state[fieldName]) : fieldValue,
    }));
  };



рд╣рдорд╛рд░реЗ рдлреЙрд░реНрдо рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  const LogInForm = ({ initialData, onSubmit }) => {
    const [logInData, setLogInData] = useState(initialData);
    const handleChange = useFieldChange(setLogInData);
  
    const handleSubmit = e => {
      e.preventDefault();
      onSubmit(logInData);
    };
  
    return (
      <form onSubmit={handleSubmit}>
        <InputField
          label="Enter your nickname"
          value={logInData.nickname}
          onChange={handleChange('nickname')}
        />
        <InputField
          type="email"
          label="Enter your email"
          value={logInData.email}
          onChange={handleChange('email')}
        />
        <InputField
          type="password"
          label="Enter your password"
          value={logInData.password}
          onChange={handleChange('password')}
        />
        <button>Submit</button>
      </form>
    );
  };



рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдлреЙрд░реНрдо рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдпрд╣ рд╕рдм рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ! рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ YAGNI рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЦрдВрдбрди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдиреБрд╕рд░рдг рдореЗрдВ рд╣рдореЗрдВ рд╡рд╣ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдХреЗрд╡рд▓ рдПрдХ рд░реВрдк рд╣реИ, рддреЛ рдРрд╕реЗ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХрд╛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓рд╛рдн рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рдХреЛрдб рдХреЛ рдХреЗрд╡рд▓ 3 рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╕реЗ рдХрдо рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЕрдореВрд░реНрддрддрд╛ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛, рдЬреЛ рдкреНрд░рдкрддреНрд░ рдХреЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рддрд░реНрдХ рдХреЛ рдЫрд┐рдкрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╕рддрд╣ рдкрд░ рд░рдЦрдирд╛ рдмреЗрд╣рддрд░ рд╣реИред




рдЕрд░реЗ рдирд╣реАрдВ! рдХреГрдкрдпрд╛ рдРрд╕рд╛ рди рдХрд░реЗрдВ!



рдЖрдХрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд░реВрдк


рд▓реЙрдХ рдХрд┐рдП рдЧрдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗрд╡рд▓ рдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдмрдкреИрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рддрд░рд╣ рд╣реИрдВред

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдмреЗрд╣рддрд░, рдЗрд╕ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  const Form = () => (
    <form onSubmit={handleSubmit}>
      <InputField
        label="Enter your nickname"
        value={state.nickname}
        onChange={handleChange('nickname')}
      />
      <InputField
        type="email"
        label="Enter your email"
        value={state.email}
        onChange={handleChange('email')}
      />
      <InputField
        type="password"
        label="Enter your password"
        value={state.password}
        onChange={handleChange('password')}
      />
      <button>Submit</button>
    </form>
  );



рдпрд╣ рдХреБрдЫ рдХреЛ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣рд╛рдВ рдХреЛрдб рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдПрдХ рд╣реА рдЗрдирдкреБрдЯрдлрд┐рд▓реНрдб рдШрдЯрдХ рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рд╣реА рд▓реЗрдмрд▓, рдореВрд▓реНрдп рдФрд░ рдСрдирдХрдЪреЗрдВрдЬ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рд╡реЗ рдХрд╛рд▓реНрдкрдирд┐рдХ рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП DRY-yav рдЕрдкрдирд╛ рдХреЛрдб рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдЕрдХреНрд╕рд░ рд╡реЗ рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
const fields = [
  {
    name: 'nickname',
    label: 'Enter your nickname',
  },
  {
    type: 'email',
    name: 'email',
    label: 'Enter your email',
  },
  {
    type: 'password',
    name: 'password',
    label: 'Enter your password',
  },
];

const Form = () => (
  <form onSubmit={handleSubmit}>
    {fields.map(({ type, name, label }) => (
      <InputField
        type={type}
        label={label}
        value={state[name]}
        onChange={handleChange(name)}
      />
    ))}
    <button>Submit</button>
  </form>
);



рдирддреАрдЬрддрди, рдЬреЗрдПрд╕рдПрдХреНрд╕ рдХреЛрдб рдХреА 17 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рд╕рд╛рде рд╣рдореЗрдВ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдХреА 16 рд▓рд╛рдЗрдиреЗрдВ рдорд┐рд▓рддреА рд╣реИрдВред рд╡рд╛рд╣рд╡рд╛рд╣реА! рдпрд╣ рд╡рд╣реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ DRY рд╕рдордЭрддрд╛ рд╣реВрдВред рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрдирдореЗрдВ рд╕реЗ 100 рдЗрдирдкреБрдЯ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХреНрд░рдорд╢рдГ 605 рдФрд░ 506 рд▓рд╛рдЗрдиреЗрдВ рдорд┐рд▓рддреА рд╣реИрдВред

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

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

рдЗрд╕ рд╕реВрдЪреА рдХреЛ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЬрд╛рд░реА рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ ...

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

рдШрдЯрдХреЛрдВ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬреЛ рдХреЛрдб рдкрд╣рд▓реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛, рд╡рд╣ рдЪреБрдкрдЪрд╛рдк рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдЖрдк рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реИрд╕реЗ рд╣реА рдмрджрд▓рдирд╛, рдЬрдмрдХрд┐ рдордзреНрдпрд╡рд░реНрддреА рдЕрдореВрд░реНрддрддрд╛ рдХреА рдХрдореА рдХреЗ рдХрд╛рд░рдг рдмрд╣реБрдд рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ - рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдЬреЛ рд╣рдорд╛рд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рдкреЗрдбрд╝ рдмрдирд╛рддрд╛ рд╣реИред рдпрд╣ рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдбрд┐рдЬрд╛рдЗрди рдкреИрдЯрд░реНрди рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдпрд╣ "рдкреИрдЯрд░реНрдирдпреБрдХреНрдд" рджрд┐рдЦрддрд╛ рд╣реИред

рдмреЗрдХрд╛рд░ рдЕрдиреБрдХреВрд▓рди


рд╣реБрдХ рдХреЗ рдмрд╛рдж рдореЗрдВ рдЫрдкреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛, рд╡рд╣рд╛рдБ рдореЗрдВ рдЕрдВрдзрд╛рдзреБрдВрдз рд╕рднреА рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдФрд░ рдШрдЯрдХреЛрдВ рд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╡реГрддреНрддрд┐ рдереА useCallbackрдФрд░ memoред рдХреГрдкрдпрд╛ рд╡рд╣ рдирд╛ рдХрд░реЗрдВ! рдпреЗ рд╣реБрдХ рд░рд┐рдПрдХреНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд┐рдП рдЧрдП рдереЗ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдПрдХреНрдЯ рдзреАрдорд╛ рд╣реИ рдФрд░ рд╕рдм рдХреБрдЫ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рднрд╛рдЧ рд▓реЗрддреЗ рд╣реИрдВ рддреЛ рд╡реЗ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдЕрдЧрд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рд╣реИ, рддреЛ рдЖрдк рдореЗрдВ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ memoрдФрд░ useCallbackред рдЙрдкрдпреЛрдЧ рдкреНрд░реЛрдлрд╛рдЗрд▓рд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рд╕рд╣реА рдЬрдЧрд╣ рдореЗрдВ memoizeред

рдпрд╛рдж рд░рдЦрдирд╛ рд╣рдореЗрд╢рд╛ рдЖрдкрдХреЗ рдХреЛрдб рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдмрдирд╛ рджреЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рдореЗрд╢рд╛ рдЕрдзрд┐рдХ рдЙрддреНрдкрд╛рджрдХ рдирд╣реАрдВред

рдЖрдЗрдП рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рдХреЛрдб рдХреЛ рджреЗрдЦреЗрдВред рддреБрд▓рдирд╛ рдХрд░реЗрдВ рдХрд┐ рдлрдВрдХреНрд╢рди рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ useCallbackрдФрд░ рдЗрд╕рдХреЗ рдмрд┐рдирд╛:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  const applyFilters = useCallback(() => {
    const newSelectedMetrics = Object.keys(selectedMetricsStatus).filter(
      metric => selectedMetricsStatus[metric],
    );
    onApplyFilterClick(newSelectedMetrics);
  }, [selectedMetricsStatus, onApplyFilterClick]);

  const applyFilters = () => {
    const newSelectedMetrics = Object.keys(selectedMetricsStatus).filter(
      metric => selectedMetricsStatus[metric],
    );
    onApplyFilterClick(newSelectedMetrics);
  };



рдЖрд╡рд░рдг рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд╛рдж рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдврд╝ рдЧрдИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрджрд░реНрд╢ рдХреЛрдб рдЗрд╕рдХреА рдХрдореА рд╣реИред

рдЗрд╕ рдХреЛрдб рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдирд╣реАрдВ рдмрдврд╝рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрд╕ рддрд░рд╣ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
рдХреЛрдб рдХреЛ рдХреЙрдкреА рдХрд░реЗрдВ
  <RightFooterButton onClick={applyFilters}>APPLY</RightFooterButton>



рдХрд╣рд╛рдВ RightFooterButton- рдпрд╣ рд╕рд┐рд░реНрдл styled.buttonрд╕реЗ рд╣реИ styled-components, рдЬреЛ рдмрд╣реБрдд рдЬрд▓реНрджреА рдЕрдкрдбреЗрдЯ рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдореЗрдореЛрд░реА рдЦрдкрдд рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЛ рдмрдврд╝рд╛рддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд░рд┐рдПрдХреНрдЯ рд╣рдореЗрд╢рд╛ рдореЗрдореЛрд░реА рдореЗрдВ selectedMetricsStatus, onApplyFilterClickрдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг applyFilters, рдЗрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд░рд╣реЗрдЧрд╛ ред

рдпрджрд┐ рдпреЗ рддрд░реНрдХ рдЖрдкрдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЙрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝реЗрдВ рдЬреЛ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдЕрдзрд┐рдХ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред




рдЬрд╛рдБрдЪ - рдкрд░рд┐рдгрд╛рдо


  • рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдЖрд╕рд╛рди рд╣реИрдВред рдбреЗрд╡рд▓рдкрд░реНрд╕ рдФрд░ рд╕реНрд╡рдпрдВ рд░рд┐рдПрдХреНрдЯ рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдХрд╛рд░рдг рдЙрдирдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛рдПрдВ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдХрд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЦреБрд▓рд╛рд╕рд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
  • aka value onChange . useFieldChange, , , v-model Vue .
  • KISS YAGNI. DRY, , .
  • , , React- .
  • , .




P.S.


рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рдЬрдЯрд┐рд▓ рдиреЗрд╕реНрдЯреЗрдб рд░реВрдкреЛрдВ рдХреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред рд▓реЗрдХрд┐рди, рдЕрдВрдд рдореЗрдВ, рдореИрдВрдиреЗ рджрд░реНрд╢рдХреЛрдВ рдХреЛ рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛, рддрд╛рдХрд┐ рддрд╕реНрд╡реАрд░ рдпрдерд╛рд╕рдВрднрд╡ рдкреВрд░реА рд╣реЛ рд╕рдХреЗред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдореЗрдВ рд▓рд╛рдЧреВ рд╕рд░рд▓ рдлреЙрд░реНрдо рдХреЛ рдорд╛рдиреНрдп рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ред
рдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рднреА рдХреЛ рдмрд╣реБрдд-рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рдж!

рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдк рдХреЛрдб рдХреИрд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдпрд╛ рдЖрдк рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВред

All Articles