Redux: рдЖрд░рдПрдлрд╕реА: рд░реЗрдбрдХреНрд╕ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 1 рдорд╛рд░реНрдЪ 2018  ┬╖  56рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: reduxjs/redux

#2858 рдФрд░ рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ #2295 рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдпрд╣ Redux core + рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рдорд┐рдбрд▓рд╡реЗрдпрд░ + рд╕реНрдЯреЛрд░ рдПрдиреНрд╣рд╛рдВрд╕рд░реНрд╕ + рдЕрдиреНрдп рдЯреВрд▓рд┐рдВрдЧ рдХреА рдкреВрд░реНрд╡-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬреЛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдЖрд░рдВрдн рдХрд░рдиреЗ рдореЗрдВ рдорджрджрдЧрд╛рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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

рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдореИрдВ рдПрдХ рдЪреАрдЬ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: combineReducers рдХреЛ рдЕрдкрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ред рдпрд╣ рдПрдХ рдРрд╕реА рдЪреАрдЬ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░ рдХреА рд╕рдВрд░рдЪрдирд╛ рдФрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд╛рддреНрдордХ рд╣реЛ рдЬрд╛рддреА рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЗрд╕реЗ рдЕрддреАрдд рдореЗрдВ рдирд╣реАрдВ рджреЗрдЦрддреЗ рд╣реИрдВред

рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ, рдореЗрд░реЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рдЫреЛрдЯреА рд╕реВрдЪреА рдореЗрдВ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХрдореА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ (рдпрд╛ рдХреБрдЫ рдЬреЛ рд╣рдо рдмрдирд╛рддреЗ рд╣реИрдВ), рд▓реЛрдХрдкреНрд░рд┐рдп рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреИрд╕реЗ рдердВрдХреНрд╕ рдФрд░ рд╕рд╛рдЧ, рдФрд░ рд╕рд╣рд╛рдпрдХ рджреЗрд╡ рдЯреВрд▓рд┐рдВрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдмрд╕реЗрдЯ рдкреИрдХреЗрдЬ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП

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

discussion ecosystem feedback wanted

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рддреЛ, рдЙрд╣... рдореИрдВ рдЧрдпрд╛ рдФрд░ рдПрдХ рдХрд╛рдо рдХрд┐рдпрд╛:

рдЪреАрдЬреЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ:

  • рдореИрдВрдиреЗ enhancers рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐
  • рдореИрдВ рдЬреЛрдбрд╝рд╛ selectorator рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдирд┐рд░реНрдпрд╛рдд createSelector

рд╡рд┐рдЪрд╛рд░?

рд╕рднреА 56 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдБ рд╣рд╛рдБ рд╣рд╛рдБ! рдореЗрд░реЗ рдкрд╛рд╕ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХрдИ рд░рд╛рдп рдФрд░ рд╢реБрднрдХрд╛рдордирд╛рдПрдВ рд╣реИрдВ! рд▓реЗрдХрд┐рди рдореИрдВ рдЦреБрдж рдХреЛ рд╕рдВрдпрдорд┐рдд рд░рдЦреВрдВрдЧрд╛ рдФрд░ рдкрд╣рд▓реЗ рдЪрд░реНрдЪрд╛ рдХреЛ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рджреВрдВрдЧрд╛ред

рдПрдХ рдЗрдЪреНрдЫрд╛ рд╕реВрдЪреА рдЖрдЗрдЯрдо рдЬреЛ рдореЗрд░реЗ рдкрд╛рд╕ рд╣реЛрдЧрд╛ рд╡рд╣ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕рдВрднрд╡ рд╣реИ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдПрдЪрдПрдордЖрд░ рд░реЗрдбреНрдпреВрд╕рд░ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ createReduxStore() рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╡реЗрдмрдкреИрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореЗрд░рд╛ рдЬреНрдЮрд╛рди рдФрд░ рдХреБрдЫ рдкреНрд░рдпреЛрдЧ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рд╡реЗрдмрдкреИрдХ module.hot.accept() рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рдкрде рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд╛рд░реНрд╕рд▓ рдпрд╛ рдЕрдиреНрдп рдмрдВрдбрд▓рд░ рдЗрд╕реЗ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рддреЗ рд╣реИрдВред

рдЗрд╕рд▓рд┐рдП, рд╕рднреА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрдиреБрд░реЛрдз:

  • рдЗрд╕ рдкреИрдХреЗрдЬ рд╕реЗ рд╣рдо рдХрд┐рди рдкреНрд░рдореБрдЦ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?
  • рдЙрди рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрдк рдХреМрди рд╕реЗ _рдореМрдЬреВрджрд╛_ рдкреИрдХреЗрдЬ рд╕реБрдЭрд╛рдПрдВрдЧреЗ?
  • рдЕрдВрддрд┐рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдЪреАрдЬреЛрдВ рдХреЛ рд╕рд░рд▓ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд╕рд░реНрд╡реЛрддреНрддрдо рддрд░реАрдХреЗ рд╕реЗ рдХреИрд╕реЗ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ?

рдЖрдЗрдП 3 рдкреНрд░рдореБрдЦ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдирд╛рдо рджреЗрдВ, рдЬрд╣рд╛рдВ рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ _isolated_ рд╣реЛрдВрдЧреЗред

  1. рдкрд╣рд▓рд╛ рдмрд┐рдВрджреБред рд░реЗрдбреНрдпреВрд╕рд░ рдкреНрд░рдмрдВрдзрдХ
    1.0 рд╡реЗрдирд┐рд▓рд╛ (рдпрд╣ рдпрд╣рд╛рдБ рдорд╛рдорд▓рд╛ рд╣реИ?)
    рез.рез рдЗрдорд░.рдЬреЗрдПрд╕
    рез.реи рдХреЛрд░реНрдбрдХреНрд╕
    рез.рей резрежрежрелрежреж рдЕрдзрд┐рдХ рдкреИрдХреЗрдЬ

  2. рджреВрд╕рд░рд╛ рдмрд┐рдВрджреБред рдорд┐рдбрд▓рд╡реЗрдпрд░реНрд╕
    2.0 рд╡реЗрдирд┐рд▓рд╛ (рдХреНрдпрд╛ рдпрд╣ рдорд╛рдорд▓рд╛ рд╣реИ?)
    реи.рез рд╕рд╛рдЧ
    реи.реи рдорд╣рд╛рдХрд╛рд╡реНрдп
    2.3 100500 рдЕрдзрд┐рдХ рдкреИрдХреЗрдЬред

  3. рддреАрд╕рд░рд╛ рдмрд┐рдВрджреБред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдПрдХреАрдХрд░рдг
    3.0. рд╡реЗрдирд┐рд▓рд╛ (рдпрд╣ рдпрд╣рд╛рдБ рдорд╛рдорд▓рд╛ рд╣реИ?)
    рей.рез. рдЙрдкрд╕реНрдкреЗрд╕
    рей.реи рдкреБрдирд░реНрд╡рд┐рдХреНрд░рдп
    3.3 100500 рдЕрдзрд┐рдХ рдкреИрдХреЗрдЬред

рдЪреМрдерд╛, рдмреЛрдирд╕, рдмрд┐рдВрджреБ
рек.реж рдПрдХ _рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ_ рдореЗрдВ рдЗрди рд╕рднреА рдЪреАрдЬреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдирд╛ред

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

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрд╛рдВрд╢ рд░реЗрдбрдХреНрд╕ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ __only__ рдЬрд╛рдирддреЗ рд╣реИрдВред рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреА рд░реЗрдбреНрдпреВрд╕рд░ рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░ рд░рд╣рд╛ рд╣реИ (рдареАрдХ рд╣реИ _heard_ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп.рдЬреЗрдПрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ), рдмрд╕ рдХреБрдЫ рд╣реА рд░рд┐рдПрдХреНрдЯ рдПрдХреАрдХрд░рдг рдХреЛ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред

рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рд╢реБрд░реБрдЖрдд рд╕реЗ рд╣реА рдкреВрд░реНрдг рдФрд░ _rich_ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмрдирд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╛ рдХрд┐рд╕реА рдХреЛ рдФрд░ рдЕрдзрд┐рдХ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдПрдХ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯред

рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рд╕реЗрдЯрдЕрдк/рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рджрд░реНрдж рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд╛рдВрдЧреА: https://twitter.com/acemarke/status/969040835508604929

рдЯреНрд╡рд┐рдЯрд░ рдкрд░ рдореЗрд░реА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛:

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

рдЙрд╕ рдЕрдВрдд рддрдХ, create-redux-app рд╕реНрдЯрд╛рдЗрд▓ рд░реЗрдкреЛ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рдПрдХ рдврд╛рдВрдЪреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдзрд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рд░реНрд╡реЛрддреНрддрдо рдФрд░ рдЕрдиреБрд╢рдВрд╕рд┐рдд рдкреНрд░рдерд╛рдУрдВ рдХреЗ Redux рдЕрдиреБрд░рдХреНрд╖рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЛ рдордЬрдмреВрдд рдХрд░рдиреЗ рдФрд░ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рдВрдмрд╛ рд░рд╛рд╕реНрддрд╛ рддрдп рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЙрдЪрд┐рдд Redux рдЙрдкрдпреЛрдЧ рдкрд░ред

рд╣рдо рд░рд┐рдПрдХреНрдЯрд┐рдлреНрд▓рдХреНрд╕ рдкрд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝реА рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕ рдзрд╛рдЧреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫрд╛рдУрдВ рдХреЗ рд╕рдореЗрдХрди рдкрд░ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдЙрди рдмрд┐рдВрджреБрдУрдВ рдХреЗ рд╕рд╛рде рдУрд╡рд░рд▓реИрдк рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИ @timdorr (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрдХ рдЙрддреНрд╕рд╛рд╣реА рдкреБрд╖реНрдЯрд┐ рд╣реИ)ред

  1. рдмреЗрд╣рддрд░ рдбрд┐рдлреЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде createStore рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд░реИрдкрд░, рдпрд╛рдиреА рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдЖрд╕рд╛рди рддрд░реАрдХрд╛, redux dev tools
  2. рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рд╣рд╛рдпрдХ рдореЗрдВ рдирд┐рд░реНрдорд┐рдд (рдЗрдорд░?)
  3. createReducer рдореЗрдВ рдирд┐рд░реНрдорд┐рдд (рдорд╛рдирдХ "reducer рд▓реБрдХрдЕрдк рдЯреЗрдмрд▓" рдЙрдкрдпреЛрдЧрд┐рддрд╛)
  4. рдмрд┐рд▓реНрдЯ-рдЗрди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪреБрдиреЗрдВ
  5. рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░ рдЬреЛ рдПрдлрдПрд╕рдП рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ
  6. async рдПрдХреНрд╢рди рд╕рдкреЛрд░реНрдЯ / рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рд╕рдкреЛрд░реНрдЯ (рдлреНрд▓рдХреНрд╕, рд╕рд╛рдЧрд╛, рд╡реНрд╣рд╛рдЯ?)

рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╣реЗрдирд░рд┐рдХ рдЬреЛрд░реЗрдЯреЗрдЧ рдХреЗ рд░реЗрдбрдХреНрд╕-рдмрдВрдбрд▓рд░ рдХреА рддрд░рд╣ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдХрд╛ рд╕рдорд░реНрдерди рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ?

https://github.com/HenrikJoreeg/redux-bundler

рдпрд╣ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рд╣реИ, рд░рд╛рдп рд╣реИ (рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ), рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ redux-рд╕рдВрдмрдВрдзрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЕрднреА рднреА async рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рджреЗрддрд╛ рд╣реИред

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

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБ:

  • рдХреЛрдб рдХреА рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдиреНрдпреВрдирддрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ Redux рд╕реНрдЯреЛрд░ рдХреА рд╕реНрдерд╛рдкрдирд╛ рдХрд░рдирд╛ ("рд╢реВрдиреНрдп-рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди JS" рдЯреИрдЧрд▓рд╛рдЗрди рд╡реЗрдмрдкреИрдХ рдФрд░ рдкрд╛рд░реНрд╕рд▓ рдХреЗ Redux рд╕рдорддреБрд▓реНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
  • рд╕реАрдЖрд░рдП рдХреЗ рд╕рдорд╛рди, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕рд╛рдордЧреНрд░реА рдореВрд▓ рд░реВрдк рд╕реЗ рдЫрд┐рдкреА рд╣реБрдИ рд╣реИ, рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдЕрдЪреНрдЫреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд╕рд╛рде
  • рджреЗрд╡ рдЕрдиреБрднрд╡ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдЪрдпрдирд┐рдд рдкреИрдХреЗрдЬреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдФрд░ рд╣рд╛рдВ, "рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛ рдХрдо рдХрд░реЗрдВ"ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдорд░ рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реЛрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реЗрдбреНрдпреВрд╕рд░ рд▓реЙрдЬрд┐рдХ рд▓рд┐рдЦрдиреЗ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИ _and_ рдЖрдкрдХреЗ рд░рд╛рдЬреНрдп рдХреЛ рджреЗрд╡ рдореЗрдВ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИред (рдореЗрд░реА рдПрдХрдорд╛рддреНрд░ рдЭрд┐рдЭрдХ рдпрд╣ рд╣реИ рдХрд┐ "рдореНрдпреВрдЯреЗрдЯрд┐рдВрдЧ" рдХреЛрдб рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рднреНрд░рдорд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╣реЛрдЧреАред)

рдореИрдВ рдЗрд╕ рдкреНрд░рдпрд╛рд╕ рдХреЛ рдХрд╛рдлреА рд╣рдж рддрдХ рд╕реАрдорд┐рдд рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореИрдВ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рдШрдВрдЯреЛрдВ рдореЗрдВ рд░рд┐рдПрдХреНрдЯрд┐рдлреНрд▓рдХреНрд╕ рдореЗрдВ @hswolff рдФрд░ @nickmccurdy рдХреЗ рд╕рд╛рде рдЪреИрдЯ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЬрдмрдХрд┐ рдЪрд░реНрдЪрд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рд░рд╣реА рд╣реИ, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рджрд░реНрдЬрди рдЕрддрд┐рд╡реНрдпрд╛рдкреА рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЛрдВ рдФрд░ рд╡рд┐рдЪрд╛рд░реЛрдВ рд╕реЗ рдЧреБрдЬрд░ рдЪреБрдХреЗ рд╣реИрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪреАрдЬреЛрдВ рдХреЛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

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

рдПрдкреАрдЖрдИ рдХреЗ рдХреБрдЫ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯрд┐рдВрдЧ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдореЗрд░реА рд╕реВрдЪреА рдХреЗ 1-3 рдХреЗ рд▓рд┐рдП рдПрдХ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдКрдкрд░ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ:

// #1
export function createStore({
    // If an object is given it's passed to combineReducers
    // otherwise it's just used directly.
    reducer: Object<String, Function> | Function,
    // Middleware is built-in and accepts an array of middleware functions.
    middleware: Array<MiddlewareFunction>,
    // Built-in support for devtools.
    // Defaults to NODE_ENV !== production
    devTools: boolean,
    // Same as current createStore.
    preloadedState,
    // Same as current createStore.
    enhancer,
}) {};

// Re-exported for easy usage.
export function combineReducers() {}

// #2
// Re-export immer as the built-in immutability helper.
import immer from 'immer';
export const createNextState = immer;

// #3
// Export an already written version of createReducer .
// Same thing as https://redux.js.org/recipes/structuring-reducers/refactoring-reducers-example#reducing-boilerplate
export function createReducer() {}

рд╣рд╛рдБ, рдореИрдВ рдЗрд╕реЗ рдЦреЛрджрддрд╛ рд╣реВрдБред рдореИрдВ рддрдм рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рдпрд╛ рддреЛ рд╣рдореЗрд╢рд╛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реВрдЪреА рдХреЗ рд╕рд╛рдордиреЗ thunk() рдЬреЛрдбрд╝ рджреЗрдЧрд╛, рдпрд╛ рд╕рдВрднрд╡рддрдГ рдХреЗрд╡рд▓ рддрднреА рдЬрдм рдЖрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЛрдИ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЖрдкреВрд░реНрддрд┐ рдирд╣реАрдВ рдХреА рд╣реЛред рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдпрд╣рд╛рдВ рдПрдиреНрд╣рд╛рдВрд╕рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рдирд╣реАрдВ рджреЗрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрджрд┐ рдХреЛрдИ рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╣реИ рддреЛ рд╣рдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ applyMiddleware() рдЬреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ composeWithDevtools рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ redux-devtools-extension рдпрджрд┐ devTools : true ред рдЗрд╕ "рдЖрд╕рд╛рди рд╕реЗрдЯрдЕрдк" рдЪреАрдЬрд╝ рдХреЗ рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдЙрди рдЪреАрдЬрд╝реЛрдВ рд╕реЗ "рдПрдиреНрд╣рд╛рдВрд╕рд░реНрд╕" рдХреЛ рдЦрддреНрдо рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдПрдиреНрд╣рд╛рдВрд╕рд░ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдкрд░ +1ред

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

export function createDefaultMiddleware(...additional) {
    return [thunk(), ...additional],
}

// Within a user's application
createStore({
    // By default it's just createDefaultMiddleware()
    // However if you want to add any other middleware you can.
    middleware: createDefaultMiddleware(any, other, middleware)
})

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

рдореИрдВрдиреЗ рдЖрдЬ рд╢рд╛рдо рдХреЛ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдпрд╣рд╛рдБ рдкрд╣рд▓рд╛ рдХрдЯ рд╣реИред рд╡рд┐рдЪрд╛рд░?

// configureStore.js
import {createStore, compose, applyMiddleware, combineReducers} from "redux";
import { composeWithDevTools } from 'redux-devtools-extension';
import createNextState from "immer";

import isPlainObject from "./isPlainObject";

import thunk from "redux-thunk";


const IS_DEVELOPMENT = process.env.NODE_ENV !== "production";

export function createDefaultMiddleware(...additional) {
    return [thunk, ...additional];
}

export function configureStore(options = {}) {
    const {
        reducer,
        middleware = createDefaultMiddleware(),
        devTools = IS_DEVELOPMENT,
        preloadedState,
    } = options;

    let rootReducer;

    if(typeof reducer === "function") {
        rootReducer = reducer;
    }
    else if(isPlainObject(reducer)) {
        rootReducer = combineReducers(reducer);
    }
    else {
        throw new Error("Reducer argument must be a function or an object of functions that can be passed to combineReducers");
    }

    const middlewareEnhancer = applyMiddleware(...middleware);

    const storeEnhancers = [middlewareEnhancer];

    let finalCompose = devTools ? composeWithDevTools : compose;

    const composedEnhancer = finalCompose(...storeEnhancers);

    const store = createStore(
        rootReducer,
        preloadedState,
        composedEnhancer
    );

    return store;
}

export function createReducer(initialState, actionsMap) {
    return function(state = initialState, action) {
        const {type, payload} = action;

        return createNextState(state, draft => {
            const caseReducer = actionsMap[type];

            if(caseReducer) {
                return caseReducer(draft, payload);
            }

            return draft;
        });
    }
}
export {createNextState, combineReducers};

рдФрд░ рдЕрдирд┐рд╡рд╛рд░реНрдп рдЙрджрд╛рд╣рд░рдг рдЯреВрдбреВ рдРрдк:

import {configureStore, createReducer} from "./configureStore";

const ADD_TODO = "ADD_TODO";
const TOGGLE_TODO = "TOGGLE_TODO";
const SET_VISIBILITY_FILTER = "SET_VISIBILITY_FILTER";

function setVisibility(state, newFilterType) {
    return newFilterType;
}

const visibilityReducer = createReducer("SHOW_ALL", {
    [SET_VISIBILITY_FILTER] : setVisibility
});


function addTodo(state, newTodo) {
    state.push({...newTodo, completed : false});
}

function toggleTodo(state, payload) {
    const {index} = payload;

    const todo = state[index];
    todo.completed = !todo.completed;
}

const todosReducer = createReducer([], {
    [ADD_TODO] : addTodo,
    [TOGGLE_TODO] : toggleTodo
});


const preloadedState = {
    todos: [{
        text: 'Eat food',
        completed: true
    }, {
        text: 'Exercise',
        completed: false
    }],
    visibilityFilter : 'SHOW_COMPLETED'
};


const store = configureStore({
    reducer : {
        todos : todosReducer,
        visibilityFilter : visibilityReducer,
    },
    preloadedState,
});

const exercise1 = store.getState().todos[1];

store.dispatch({type : "TOGGLE_TODO", payload : {index : 1}});

const exercise2 = store.getState().todos[1];

console.log("Same object: ", exercise1 === exercise2);

store.dispatch({type : "SET_VISIBILITY_FILTER", payload : "SHOW_COMPLETED"});

console.log(store.getState());

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдареЛрд╕ рд╢реБрд░реБрдЖрдд рд╣реИ рдФрд░ рдЗрд╕ рд╕реВрддреНрд░ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд░рд╣реА рдкрд░рд┐рд╡рд╛рдж рдХреА рдПрдХ рдЕрдЪреНрдЫреА рд╢реБрд░реБрдЖрдд рд╣реИред рдпрд╣ рдКрдкрд░ рд╡рд╛рдВрдЫрд┐рдд рд╕реБрд╡рд┐рдзрд╛ рдХреА рдореЗрд░реА рд╕реВрдЪреА рд╕реЗ рдЕрдВрдХ

рдЗрд╕рдХреЗ рдКрдкрд░ рдЗрдЯрд░реЗрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдареЛрд╕ рдЖрдзрд╛рд░ рд╣реИред

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

рдЖрд╕рд╛рди рд░реЗрдбреНрдпреВрд╕рд░/рдПрдХреНрд╢рди рдЬреЛрдбрд╝реЗ:

рдЕрдкрдиреЗ рд░реЗрдбреНрдпреВрд╕рд░ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдирдХреЗ рд░рд╛рдЬреНрдп рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдирд╛ рдмреЗрд╣рдж рдЖрд╕рд╛рди рдмрдирд╛рдПрдВред рдпрд╣ рдореЛрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдореВрд▓ рд╡рд┐рдЪрд╛рд░ рд╣реИ:

import { createStore, createActionPack, combineActionPacks } from 'redux/starter'

const counter = createActionPack({
  increment: counter => counter + 1,
  decrement: counter => counter - 1,
  set: (_, value) => value
}, 0)

const posts = createActionPack({
  load: async () => await fetch('/posts'),
  create: async (state, text) => state.push(await fetch('/posts/new', { body: { text } }))
}, [])

const store = createStore(
  combineActionPacks(
    counter,
    posts
  )
)

store.dispatch(counter.increment())
store.dispatch(counter.set(42))

await store.dispatch(posts.load())
await store.dispatch(posts.create('First!'))

рд╕реНрдЯреЛрд░ рд╕рд┐рдВрдЧрд▓рдЯрди

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

import { store, configureStore } from 'redux/starter'

configureStore(reducer, middleware, initialState)

store.dispatch(someAction())
store.getState()

import рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдпреЛрдЧреНрдпрддрд╛

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

import { createStore } from 'redux/starter'
import 'redux/starter/devtools'
import 'redux/starter/logger'
import 'redux/starter/immutable'

// OR!

import { createStore } from 'redux/starter/developer'
import { createStore } from 'redux/starter/production'

рдЙрд╕ рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВ рджреЗрдЦ рд╕рдХрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ рддреЛ рдЙрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдЙрдирдХреЗ рдмрд┐рд▓реНрдб рдЯреВрд▓рд┐рдВрдЧ рдореЗрдВ рдЕрд▓рд┐рдпрд╛рд╕рд┐рдВрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрд╛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░ рд░рд╣реЗ

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

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

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

рдХрд▓ рд░рд╛рдд @hswolff рдХреЗ рд╕рд╛рде рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪрд░реНрдЪрд╛ рд╣реБрдИред рдореИрдВ рдЪрдпрдирдХрд░реНрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдЬреЛрдбрд╝рдиреЗ/рдкреБрдирдГ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬреЛ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЙрдкрдпреЛрдЧреА рд▓рд╛рднреЛрдВ рдХреЗ рд╕рд╛рде рд░реАрд╕реЗрд▓реЗрдХреНрдЯ рдПрдкреАрдЖрдИ рдХрд╛ рд╕реБрдкрд░рд╕реЗрдЯ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ:

import createSelector from 'selectorator';

// selector created with single method call
const getBarBaz = createSelector(['foo.bar', 'baz'], (bar, baz) => {
  return `${bar} ${baz}`;
});

рдпрд╣ рдмрд╣реБрдд рд╕рд╛рд░реЗ рд╣рд╛рде рд╕реЗ рд▓рд┐рдЦреЗ рдЧрдП "рд╕рд░рд▓ рдЗрдирдкреБрдЯ" рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдХрд╛рдЯрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдЬреИрд╕реЗ const selectTodos = state => state.todos ред

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

рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдЖрдВрд╢рд┐рдХ рд░реВрдк рд╕реЗ рд╣реИ рдЗрд╕рд▓рд┐рдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ package.json рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдо рдЖрдЗрдЯрдо рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдЪрдпрдирдХрд░реНрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХрдорд╛рд▓ рд╣реЛрдЧрд╛ред

рдпрд╣ рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ: apollo-boost рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдкрд░ рд╣рд╛рд▓ рдХрд╛ рд▓реЗрдЦ

рдпрджрд┐ рд╣рдо react-redux рдХреЗ connect рдХреЗ рдПрдкреАрдЖрдИ рдХреЛ рд░реАрд╕реЗрд▓реЗрдХреНрдЯ (рдпрд╛ рдПрдХ рд╕рдорд╛рди рдЪрдпрдирдХрд░реНрддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм mapStateToProps рдПрдХ Array , рддреЛ рд╣рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЕрдиреБрдХреВрд▓рддрд╛ рдХреЛ рддреЛрдбрд╝реЗ рдмрд┐рдирд╛ рдЗрд╕реЗ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдПрдВред рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдЗрд╕ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд░рд┐рдПрдХреНрдЯ рдпрд╛ react-redux рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо react-redux рд╡рд┐рдХрд▓реНрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЙрд╕ рд╡рд┐рд╕реНрддрд╛рд░рд╢реАрд▓рддрд╛ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХреЗрдВ рдпрд╛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рдХреЛ react-redux рд╕рд╛рде рд▓рдкреЗрдЯрдХрд░ рдПрдХ рдФрд░ рдкреИрдХреЗрдЬ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВ

рд╣рд╛рдБ, рдореИрдВ рдЗрд╕ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдорд╡реАрдкреА рдХреЗ рд▓рд┐рдП рд░рд┐рдПрдХреНрдЯ-рд░реЗрдбрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЙрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ Redux рд╕реНрддрд░ рдкрд░ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдореВрд░реНрдд рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдпрд╣ рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдХреЗрд╡рд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рд╣реА рдкреНрд░рднрд╛рд╡реА рдврдВрдЧ рд╕реЗ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ? рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реЛ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдпрд╣ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ рддреЛ рд╣рдореЗрдВ рдЕрднреА рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрдм рддрдХ рдпрд╣ рд╕реНрдЯреЛрд░ рдПрдкреАрдЖрдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рддрдм рддрдХ рдпрд╣ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред рд╣рдо рдЙрд╕ рдПрдкреАрдЖрдИ рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреА рддрд▓рд╛рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдмрд╕ рдбреАрдПрдХреНрд╕ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░реЗрдВред

рдпрд╣ рд╕рдордЭ рдЖрддрд╛ рд╣реИред рдореИрдВрдиреЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░реЗрдбрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ рд╡реЗ рдпрд╣рд╛рдВ рд░реЗрдбрдХреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЧреВ рд╣реЛрдВрдЧреЗред

рдЖрд╕рд╛рди рд░реЗрдбреНрдпреВрд╕рд░ /рдПрдХреНрд╢рди рдЬреЛрдбрд╝реЗ рдХреЗ рд╕рд╛рде рд╡реНрдпрдХреНрдд рдХреА рдЧрдИ рдЗрдЪреНрдЫрд╛ рдкрд░

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ @markerikson рдиреЗ рдЕрдкрдиреА рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рдЬреЛ рдмрдирд╛рдпрд╛ рд╣реИ рд╡рд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рд╕реМрджреЗ рдХреЛ рдХрдо рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд╣рд╛рди рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреВрд░реНрд╡-рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрдЧрд╛ред

рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо Redux рдХреЗ рдЕрдиреНрдп рдкрд╣рд▓реБрдУрдВ рд╕реЗ рдирд┐рдкрдЯ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдмреЛрдЭрд┐рд▓ рд╣реИрдВ (redux/рдХреНрд░рд┐рдпрд╛/рдЪрдпрдирдХрд░реНрддрд╛ рдирд┐рд░реНрдорд╛рдг)ред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╕рд╛рдордиреЗ рд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рдареЛрд╕ рдкреНрд░рдЧрддрд┐ рдХреЗ рд░рд╛рд╕реНрддреЗ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред

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

рдЬрд╝рд░реВрд░ред рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рдореБрдЭреЗ рдЖрдЬ рдереЛрдбрд╝реА рджреЗрд░ рдмрд╛рдж рдХреБрдЫ рд╕реЗрдЯ рдЕрдк рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИред

рд╣рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рднрдВрдбрд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдпрд╣ рд╡рд░реНрддрдорд╛рди рдХреЗ рднреАрддрд░ рдореМрдЬреВрдж рд╣реЛрдЧрд╛ред рдХреГрдкрдпрд╛ рдкрд╣рд▓реЗ рдХреБрдЫ рднреА рдкреАрдЖрд░ рдмрдирд╛рдПрдВред

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдЖрдпрд╛рдд рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЦреНрдп redux рдкреИрдХреЗрдЬ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП (рдЗрд╕рд▓рд┐рдП рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИ) рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдХрдИ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдореЛрдиреЛрд░реЗрдкреЛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкреВрд░реНрд╡ рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдЧрд╛, рд╣рдо рд╣рдореЗрд╢рд╛ рдПрдХ рдирдпрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛рдП рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдлрд╝рд╛рдЗрд▓ рдирд┐рд░реНрдпрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдпрд╣ рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд▓рдЧ рд░реЗрдкреЛ/рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

рдЗрд╕ рд░реЗрдкреЛ рдореЗрдВ рдореМрдЬреВрджрд╛ рдЯреВрд▓рд┐рдВрдЧ рд╕реЗрдЯрдЕрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕реЗ рд╡рд╛рдкрд╕ рдорд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рддреНрд░реБрдЯрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред рд╣рдореЗрдВ рд╢рд╛рдпрдж рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд┐рдВрдЯреИрдХреНрд╕ рд╕рдорд░реНрдерди рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЗрд╕ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред

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

рджреЛрдмрд╛рд░рд╛, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рд╣рдореЗрдВ рдореЛрдиреЛрд░реЗрдкреЛ рдЬрд╛рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рд╣рдо рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдирд┐рд░реНрдорд╛рдг рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреИрдХреЗрдЬреНрдб рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдЕрднреА рдХреЗ рд▓рд┐рдП рдмрд╕ рдПрдХ starter рдлреЛрд▓реНрдбрд░ рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ package.json рдХреЗ рд╕рд╛рде рдЪрд╛рд▓ рдЪрд▓рдиреА рдЪрд╛рд╣рд┐рдПред

рдореБрдЭреЗ рдЗрд╕ рд╕реНрдерд╛рдиреАрдп рдХреЛ рдореБрдЦреНрдп рд░реЗрдбрдХреНрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рд░рдЦрдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИ рдпрджрд┐ рдпрд╣ рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рд░реЗрдбрдХреНрд╕ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реИред рдЕрдЧрд░ рд╣рдо рдпрд╣рд╛рдВ рд╡реНрдпрдХреНрдд рд╡рд┐рдЪрд╛рд░реЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдФрд░ рдЭрд┐рдЭрдХ рд╣реЛрддреА рд╣реИред

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рдЬреИрд╕реЗ рдЗрдорд░, рдердВрдХ/рд╡рд╛рджрд╛/рдЧрд╛рдерд╛, рдФрд░ рдкреБрди: рдЪрдпрди рдпрд╣рд╛рдВ рд╣рдорд╛рд░реЗ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдореВрд▓реНрдп рд╣реЛрдВрдЧреЗ рдФрд░ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЗ рд▓рд╛рдпрдХ рд╣реЛрдВрдЧреЗ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдЙрди рдирд┐рд░реНрднрд░рддрд╛рдУрдВ рдХреЛ рдореБрдЦреНрдп redux рдкреИрдХреЗрдЬ рдкрд░ рд╣реА рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ .

рддреЛ, рдЙрд╣... рдореИрдВ рдЧрдпрд╛ рдФрд░ рдПрдХ рдХрд╛рдо рдХрд┐рдпрд╛:

рдЪреАрдЬреЗрдВ рдЬреЛ рдкрд╣рд▓реЗ рдХреЗ рд╕реНрдирд┐рдкреЗрдЯ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ:

  • рдореИрдВрдиреЗ enhancers рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╡рд┐рдХрд▓реНрдк рдореЗрдВ рдлреЗрдВрдХ рджрд┐рдпрд╛, рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐
  • рдореИрдВ рдЬреЛрдбрд╝рд╛ selectorator рдирд┐рд░реНрднрд░рддрд╛ рдФрд░ рдирд┐рд░реНрдпрд╛рдд createSelector

рд╡рд┐рдЪрд╛рд░?

рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд┐рд╕рдиреЗ рдкрд┐рдЫрд▓реЗ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ рдЦреБрдж рдХреЛ Redux (рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛) рд╕рд┐рдЦрд╛рдпрд╛ рд╣реИ, рдореИрдВ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рдж рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЯрди рд╕рд╛рдорд╛рди рд╣реЛрдЧрд╛ред

рдореИрдВ

рдЗрд╕рд▓рд┐рдП, рдЬрдм рддрдХ рд░реЗрдбрдХреНрд╕ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рдореИрдВ 2 рдХреНрд╖рдг рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ:

  1. рдмрд┐рд▓реНрдб-рдЗрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдЪрдореБрдЪ expect(mapStateToProps(state)).toEqual(mapStateToProps(state)) ред рдмрд╕ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдореИрдВрдиреЗ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкрд░реАрдХреНрд╖рдг рдХрднреА рдирд╣реАрдВ рджреЗрдЦреЗ, рд▓реЗрдХрд┐рди _not-very-pure_ mapStateToProps redux рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИред

  2. рдореЗрдореЛрдЗрдЬрд╝-рд╕реНрдЯреЗрдЯ рдЬреИрд╕реЗ рдХреБрдЫ рдЧреЛрдж рд▓реЗрдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдпрд╣ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП Immer.js рдЬреИрд╕рд╛ рд╣реИред рдореБрдЦреНрдп рдмрд┐рдВрджреБ - рдЧреНрд░рд╛рд╣рдХ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд░реВрдк рдореЗрдВ mapStateToProps рдпрд╛ рдЪрдпрдирдХрд░реНрддрд╛ рд▓рд┐рдЦ тАЛтАЛрд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдпрд╛рдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рдмреАрдЪ "рд╕рд╛рдорд╛рдиреНрдп" рд╕рдВрд╕реНрдорд░рдг рдХреЛ рдЦреЛрдП рдмрд┐рдирд╛ "рдПрдХрд╛рдзрд┐рдХ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛" рдХреЗ рд╕рд╛рде рдЗрд╕ рдкреБрдирд░реНрдЪрдпрди рдореБрджреНрджреЗ рдХреЛ рднреА рд╣рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рд╕рд╛рдорд╛рди рдХреЛ рджреЛрдмрд╛рд░рд╛ рдпрд╛рдж рдХрд░реЗрдВ

  1. рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рд╢реБрджреНрдз рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЖрдкрдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрд╢реБрджреНрдз рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЪрдпрдирдХрд░реНрддрд╛ рдЕрднреА рднреА рдЙрд╕ рдкрд░реАрдХреНрд╖рд╛ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдореБрдЭреЗ рджреВрд╕рд░рд╛ рд╕реБрдЭрд╛рд╡ рдЕрдзрд┐рдХ рдкрд╕рдВрдж рд╣реИред
  2. рдпрд╣ рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрд╕реА рддрд░рд╣ рд▓рдкреЗрдЯреЗрдВрдЧреЗ рдЬреИрд╕реЗ рд╣рдо рд░реЗрдбреНрдпреВрд╕рд░ рдХреЛ рдЗрдорд░ рдХреЗ рд▓рд┐рдП рд▓рдкреЗрдЯреЗрдВрдЧреЗ, рд╣реИ рдирд╛?

рдлрд┐рд░ рднреА, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдЪрд░реНрдЪрд╛ рдХреА, рдпрд╣ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд░рд┐рдбрдХреНрд╕ рдЪреАрдЬ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ рдЬреЛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдкреИрдХреЗрдЬ рдореЗрдВ рд╣реЛрдЧреА рдЬреЛ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╣реИред

рдпрд╣ рд╡рд╛рд╕реНрддрд╛рд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реИ!

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдиреБрд░реЛрдз/рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдмрд┐рдЯ рд╣реИ; рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЕрдЧрд░ рдЗрдорд░ рдХреЛ рдирд┐рд╣рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕реНрддреЗрдорд╛рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

рдЗрдорд░ рдмрдврд╝рд┐рдпрд╛ рд╣реИ ред рдпрд╣ рдореЗрд░реА рдкрд╕рдВрджреАрджрд╛ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЧрдпрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рднреА ( produce(baseState, draftState => ... ), рдореБрдЭреЗ рдЗрд╕ рдмрд╛рдд рдХреА рдЪрд┐рдВрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рдЕрдиреНрдп рд▓реЛрдЧ рдЬреЛ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рд╡реЗ рдореЗрд░рд╛ рдХреЛрдб рджреЗрдЦрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдирд╣реАрдВ рд╕рдордЭрддреЗ рдХрд┐ рдореИрдВ рдХреЗрд╡рд▓ рдЗрдорд░ рдорд╣рд╛рд╢рдХреНрддрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрдирд╢реАрд▓ рд╕рд╛рдорд╛рди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВред

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

рдореИрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реВрдВ рдХрд┐ createNextState рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд░реНрдпрд╛рдд рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:

import {createReducer, createNextState} from "@acemarke/redux-starter-kit";

function addTodo(state, newTodo) {
    return createNextState(state, draftState => {
        draftState.push({...newTodo, completed : false});
    });
}

(рдХреНрд╖рдорд╛ рдХрд░реЗрдВ рдпрджрд┐ рдореИрдВрдиреЗ рдЧрд▓рдд рд╕рдордЭрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ createNextState рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд╣реИ! рдЗрд╕рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЦреЛрджрд╛ рдирд╣реАрдВ рдЧрдпрд╛ рд╣реИ)

https://github.com/markerikson/redux-starter-kit/issues/5 рджреЗрдЦреЗрдВ

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

рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рд╣рдореЗрдВ https://github.com/reactjs/redux/issues/2858 рдХреЗ рдХрд╛рд░рдг рдкреВрд░реНрдг рд╣реЛрдиреЗ рдкрд░ рд╕реАрдзреЗ рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ createNextState рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдирд┐рд░реНрдпрд╛рдд рд╣реИ, рддреЛ рдХреНрдпреЛрдВ рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП:

рдПрдХ рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рдирд┐рд╣рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рд╣реИрдВ, рдЦрд╛рд╕рдХрд░ рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рд╕реНрд░реЛрдд рдХреЛрдб рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрдорд░ рдХрд╛ рдЬреЛрдбрд╝ рд╡рд╛рдкрд╕ рд╕рдВрдЧрдд рд╣реИред

рдореИрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ рдХрд┐ рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ libs рдЬреИрд╕реЗ immer.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдореЗрд░реА рд╡рд┐рдирдореНрд░ рд░рд╛рдп рд╕реЗ рдЕрдирдЬрд╛рдиреЗ рдореЗрдВ рд╕реАрдЦрдиреЗ рдХреА рдкреНрд░реЗрд░рдгрд╛ рдХреЛ рд╡рд┐рдЪрд▓рд┐рдд рдХрд░рдиреЗ рдФрд░ store рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рдиреЗ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИред

рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреЛрд░ рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд newState рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЦрд┐рд▓рд╛рдл рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ ( === ) previousState рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд╣реА рдЙрджрд╛рд╣рд░рдг рд╣реИ рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдВред

рдЗрд╕ рддрд░рд╣ рд╕рднреА рдХреЛ store рдХреЗ рдирд┐рдпрдореЛрдВ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

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

рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реБрдЭрд╛рд╡:

logger , devTools рдФрд░ Thunk рдХреЛ Starter рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд╛рдХреА рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдкрд╕рдВрдж рд╣реИред

рд╣рдо рд╕рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдЯреЛрд░ рдХреЛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдорд╛рдиреНрдп рддрдВрддреНрд░ рд╣реЛрдЧрд╛ рдЬрд╣рд╛рдВ рдпрд╣ рдкрд┐рдЫрд▓реЗ рд╕реНрдЯреЗрдЯ ( === ) рдХреЗ рдЦрд┐рд▓рд╛рдл рдиреНрдпреВрд╕реНрдЯреЗрдЯ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ рдпрд╣ рд╡рд╣реА рдЙрджрд╛рд╣рд░рдг рд╣реИ рддреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХ рджреЗрдВред

рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рд░рд╛рдЬреНрдп рдмрджрд▓ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдЧрд▓рдд рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЕрдВрддрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╕реНрдЯреЛрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЧрдП, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Redux рдХреЛрд░ рдореЗрдВ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Immer рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рд╣реИред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╣рдж рддрдХ Redux рд╕реАрдЦрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ Redux рдХреЛ рд╕реАрдЦрдиреЗ рд╡рд╛рд▓реЗ рдмрд╣реБрдд рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рд╢реБрджреНрдз FP рд╕реАрдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

рдЕрдЧрд░ рд╣рдо рдЗрд╕реЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рдвреАрд▓рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрдЯрд┐рд▓рддрд╛ рдХреА рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкрд░рдд рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Immer рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрдкрдбреЗрдЯ рд░рд┐рдбреНрдпреВрд╕рд░ рдХреЗ рдкрд╛рд╕ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдареАрдХ рд╕рдВрддреБрд▓рди рд╣реИред

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

рдХреБрдЫ рдЕрдиреНрдп рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рд╣рдЯрд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░ рдЯреВрд▓реНрд╕ рдкрд░ рд▓реЙрдЧрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝рд╛ рд▓рд╛рдн рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ), https://github.com/markerikson/ рджреЗрдЦреЗрдВ redux-рд╕реНрдЯрд╛рд░реНрдЯрд░-рдХрд┐рдЯ/рдореБрджреНрджреЛрдВ/19. рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдФрд░ рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдЦрд┐рд▓рд╛рдл рдирд╣реАрдВ рд╣реВрдВ рдЕрдЧрд░ рд╡реЗ рд╡рд╛рдкрд╕ рд╕рдВрдЧрдд рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЗрдорд░ рдФрд░ рдердВрдХ рдХреЗ рд╣рдорд╛рд░реЗ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧред

рдРрд╕реЗ рдорд╛рдорд▓реЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЖрдк рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рдХрд┐ рд░рд╛рдЬреНрдп рдмрджрд▓ рдЬрд╛рдП, рдЗрд╕рд▓рд┐рдП рдЖрдк рд╕реНрдореГрддрд┐ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдХрд┐рд╕реА рднреА рдЧрд▓рдд рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЕрдВрддрд░ рдХреЛ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рд╕реНрдЯреЛрд░ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдВрдЧреЗред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдХрд┐ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рдореБрджреНрджреЗ рдХреЗ рдЖрд╕рдкрд╛рд╕ рд╣реЛ рдЧрдП, рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Redux рдХреЛрд░ рдореЗрдВ рдПрдХ рд╕рддреНрдпрд╛рдкрдирдХрд░реНрддрд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рд╣реИ рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ Immer рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реБрд░рдХреНрд╖рд╛ рд╣реИред рдореИрдВ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╣рдж рддрдХ Redux рд╕реАрдЦрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рдХреЛ рд╣рд░рд╛рдиреЗ рдЬреИрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ Redux рдХреЛ рд╕реАрдЦрдиреЗ рд╡рд╛рд▓реЗ рдмрд╣реБрдд рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рджреЗрдЦрддрд╛ рд╣реВрдВ рдЬреЛ рд╢реБрджреНрдз FP рд╕реАрдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВред

@nickmccurdy рдореИрдВ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рдФрд░ рдореИрдВ рдЗрд╕ рдмрд╛рдд рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ рдХрд┐ рдПрдлрдкреА, рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдЖрджрд┐ рдХреА рдХреБрдЫ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рдХрд╛рд░рдг рд╣рдореЗрдВ рд╕реАрдЦрдиреЗ рдореЗрдВ рдмрд╛рдзрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП ... рдЙрдирд╕реЗ рдЬрдЯрд┐рд▓рддрд╛ рдЫрд┐рдкрд╛ рд░рд╣реЗ рд╣реИрдВред рд╡реИрд╕реЗ рднреА, рдпрд╣ рд╕рд┐рд░реНрдл рд╕реНрд╡рд╛рдж рдХреА рдмрд╛рдд рд╣реИ, рдореИрдВ рдПрдХ рд╕рдорд░реНрдердХ рд╕реАрдЦрдиреЗ рдФрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рд╡рд╛рд▓рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рдкреНрд░рд╕реНрддрд╛рд╡ рдХреЛ рджреЗрдЦрдХрд░, рдореЗрд░реА рдкреНрд░рд╡реГрддреНрддрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдореБрдЭреЗ рдмрддрд╛рддреА рд╣реИ рдХрд┐ рд╣рдо рд╕реНрд╡реАрдХреГрддрд┐ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдорд╛рдирдХреЛрдВ рдХреЗ рд╕рд╛рде рдкреАрдЫреЗ рд╣рдЯреЗрдВрдЧреЗред рдмрд╕ рдзреНрдпрд╛рди рджреЗрдВ, рд╡реЗрдм рдХреА рд╕рднреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдЬреЛ рдЕрднреА Redux рдорд╛рдирдХ рд╕рд┐рдЦрд╛ рд░рд╣реА рд╣реИ рдФрд░ рдпрд╣ рдЕрдВрддрддрдГ рдХреИрд╕реЗ рдЙрдард╛ рд░рд╣реА рд╣реИред

рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛтАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ Immer рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдкреНрд░реЙрдХреНрд╕реА рдореЗрдВ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрдкрдбреЗрдЯ рд░рд┐рдбреНрдпреВрд╕рд░ рдХреЗ рдкрд╛рд╕ рдкреНрд░рджрд░реНрд╢рди рдУрд╡рд░рд╣реЗрдб рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдареАрдХ рд╕рдВрддреБрд▓рди рд╣реИред

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

Immer.js - рдСрдЯреЛ рдлреНрд░реАрдЬрд┐рдВрдЧ
рдЗрдорд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рднреА рд░рд╛рдЬреНрдп рдХреЗ рдкреЗрдбрд╝ рдХреЛ рдЬрдорд╛ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЙрдкрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдирд┐рд░реНрдорд╛рддрд╛ рдХреЗ рдмрд╛рд╣рд░ рд░рд╛рдЬреНрдп рд╡реГрдХреНрд╖ рдХреЗ рдЖрдХрд╕реНрдорд┐рдХ рд╕рдВрд╢реЛрдзрдиреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред рдпрд╣ рдПрдХ рдкреНрд░рджрд░реНрд╢рди рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдЗрд╕ рд╡рд┐рдХрд▓реНрдк рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рдпрд╣ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕реЗ рд╕реНрдерд╛рдиреАрдп рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЪрд╛рд▓реВ рдпрд╛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП setAutoFreeze(true / false) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

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

@codedavinci : рдЗрд╕ redux-starter-kit рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп "рдореВрд▓" Redux рд╕реНрдЯреЛрд░ рд╕реЗрдЯрдЕрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдЙрдкрдпреЛрдЧреА рдЯреВрд▓ рдФрд░ рдПрдмреНрд╕реНрдЯреНрд░реИрдХреНрд╢рди рдЬреЛрдбрд╝рдирд╛ рд╣реИред рд╕рд╛рде рд╣реА, рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрд╣ _not_ Redux рдХреЛрд░ рдореЗрдВ рд╣реА рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрд▓рдЧ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо рдЕрдВрддрддрдГ Redux org рдХрд╛ "рдЖрдзрд┐рдХрд╛рд░рд┐рдХ" рд╣рд┐рд╕реНрд╕рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

рдЖрдкрдХрд╛ рд╕рднреА рдореМрдЬреВрджрд╛ Redux рдХреЛрдб рдХрд╛рдо рдХрд░реЗрдЧрд╛ред рд╕рднреА рдореМрдЬреВрджрд╛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЕрднреА рднреА рдареАрдХ рд░рд╣реЗрдВрдЧреЗред рд╣рдо Redux рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рд╕рдорд░реНрдерд┐рдд рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

@markerikson рдореИрдВ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдХрд┐рдЯ рд░рдЦрдиреЗ рдХреЗ рд▓рдХреНрд╖реНрдп рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ рдФрд░ рдореИрдВ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╣рд░ рдЪреАрдЬ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдиреАрдЪреЗ рд╣реВрдВ, рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдмрджрд▓рдиреЗ рд╡рд╛рд▓реЗ Immer.js рдЬреИрд╕реЗ lib рд╣реЛрдиреЗ рдХрд╛ рдереЛрдбрд╝рд╛ рд╕рд╛ рдкреНрд░рддрд┐рд░реЛрдзреА, рд▓реЛрдЧ рдЕрдВрддрддрдГ рд╕реАрдЦреЗрдВрдЧреЗ starter-kit рдкреИрдЯрд░реНрди рдФрд░ рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВред рдХреЛрдИ рд╕реНрдЯреЛрд░ рдореНрдпреВрдЯреЗрд╢рди рдЖрджрд░реНрд╢ рд╡рд╛рдХреНрдп рдирд╣реАрдВ рд╣реИ, Redux рд╣рдореЗрд╢рд╛ рдЗрд╕реЗ рдмреЗрдЪрддрд╛ рд░рд╣рд╛ рд╣реИ, рдпрд╣ рдмреНрд░рд╛рдВрдб рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИред

рдкреБрдирд╢реНрдЪ: рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ Immer.js рдХреБрдЫ рднреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЖрдкрдХреА рдорджрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдореИрдВ рдХреЗрд╡рд▓ рдФрд░ рд╕рд┐рд░реНрдл рд╡рд╛рдХреНрдп рд░рдЪрдирд╛рддреНрдордХ рдорд╛рдирдХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдЬреИрд╕реЗ push , splice ...

рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдЦреБрдж рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рдкреНрд░рддрд┐рд░реЛрдзреА рд╣реЛ :)

@codedavinci : рд╣рд╛рдБ, рдореИрдВ рдЪрд┐рдВрддрд╛рдУрдВ рдХреА рдмрд╛рдд рд╕рдордЭрддрд╛ рд╣реВрдБред рдлрд┐рд░ рднреА, Redux рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдо рд╢рд┐рдХрд╛рдпрддреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдЙрдЪрд┐рдд рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЕрджреНрдпрддрди рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХрд╛ рджрд░реНрдж рд╣реИ, рдФрд░ Immer рдмрд╕ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЙрди рдЕрджреНрдпрддрдиреЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреЗрдЦрд╛ рд╣реИред

@markerikson , рдореИрдВрдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ immer рдореЗрдВ рдХреБрдЫ рдЦреБрджрд╛рдИ рдХреА рдФрд░ рдореИрдВрдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рд╣рд▓реНрдХрд╛, рд╕рд░рд▓ рдФрд░ рдХреБрд╢рд▓ рд╣реИред рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрдЪрд╛ рдЧрдпрд╛ рд╣реВрдБ :)ред

рдЖрдк рдХрд┐рд╕ рд░реЗрдкреЛ рдХрд╛ рдорд╕реМрджрд╛ рддреИрдпрд╛рд░ рдХрд░ рд░рд╣реЗ рд╣реИрдВ? рд╡реЗ:

https://github.com/markerikson/redux-starter-kit
https://www.npmjs.com/package/@acemarke/redux -starter-kit
https://unpkg.com/@acemarke/redux [email protected]/

рд╣рд╛рдБ, рдмрд╕ рдЗрддрдирд╛ рд╣реАред

@nickmccurdy рдХреЗ рдкрд╛рд╕

рд╢рд╛рдирджрд╛рд░ рдкреНрд░рдЧрддрд┐ @nickmccurdy & @markerikson ЁЯСН рдореБрдЭреЗ рдЗрд╕рдХреА рд╕рд╛рджрдЧреА рдФрд░ рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдкрд╕рдВрдж рд╣реИред @nickmccurdy рдиреЗ рджреЗрдЦрд╛ рдХрд┐ рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкрд░ рдмрд╣реБрдд рд╕рдХреНрд░рд┐рдп рд╣реИрдВ, рдореБрдЭреЗ рдЖрдкрдХреЗ рд╕рд╛рде рдХреБрдЫ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рддрдЪреАрдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдЕрдЧрд░ рдЖрдк рдЗрд╕рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ рддреЛ рдореБрдЭреЗ рдмрддрд╛рдПрдВ! :)

рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдзрдиреНрдпрд╡рд╛рдж, рдПрдХ рдирдП рдореБрджреНрджреЗ рдореЗрдВ рдЦреБрд▓реА рдЪрд░реНрдЪрд╛ рд╢реБрд░реВ рдХрд░рдирд╛ рд╢рд╛рдпрдж рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдЖрдк рд╕реАрдзреЗ [email protected] рдпрд╛ рдбрд┐рд╕реНрдХреЙрд░реНрдб рдкрд░ рдореБрдЭ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

combineReducers рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП +1ред рдореИрдВрдиреЗ рдЗрд╕реЗ рд╕рдмрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдЕрдЧрд░ рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдирд╣реАрдВ рд╕реЛрдЪрддрд╛ рдХрд┐ рдореЗрд░рд╛ рд╕реНрдЯреЛрд░ рдХреИрд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИред

рдореИрдВ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрдкрдиреЗ рд░реЗрдбреНрдпреВрд╕рд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдирд┐рдореНрди рдХреА рддрд░реНрдЬ рдкрд░ рд╕реЗрдЯ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реВрдВ:

function reducer(prevState, event, handledNavigation = false) {
  if (event.type === 'NAVIGATION' && !handledNavigation) {
    return reducer(onNavigate(prevState, event), event, true);
  }

  const pageReducer = pageReducers[prevState.activePage];

  const nextSessionState = sessionReducer(prevState.sessionState, event);
  const nextPageState = pageReducer(prevState.pageState, nextSessionState, event);

  return {
    activePage: prevState.activePage,
    pageState: nextPageState,
    sessionState: nextSessionState,
  };
}

рдЬреЛ рдХреБрдЫ рд╣реИ CombReducers рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдореБрдЭреЗ рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░рдиреЗ рджреЗрддрд╛ рд╣реИред

@ abradley2 : рдпрджрд┐ рдЖрдк рдпрд╣реА рдкреВрдЫ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рд╣рдо Redux рдХреЛрд░ рд╕реЗ combineReducers рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдирд╣реАрдВ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рд╛рдВ, рд╣рдордиреЗ рд╣рдореЗрд╢рд╛ рдХрд╣рд╛ рд╣реИ рдХрд┐ combineReducers рд╕рдмрд╕реЗ рдЖрдо рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдХрд╕реНрдЯрдо рд░реЗрдбреНрдпреВрд╕рд░ рддрд░реНрдХ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╣рдореЗрдВ redux-starter-kit рдкреИрдХреЗрдЬ рдирд╛рдо рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ, рдФрд░ рд░реЗрдкреЛ рдХреЛ https://github.com/reduxjs/redux-starter-kit рдкрд░ рд╕рдВрдЧрдарди рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдзрд╛рдЧреЗ рдХреЛ рдмрдВрдж рдХрд░ рджреЗрдВрдЧреЗред рдЙрд╕ рд░реЗрдкреЛ рдореЗрдВ рдХреЛрдИ рдФрд░ рдЪрд░реНрдЪрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИред

рд╕рд╛рде рд╣реА, рдореИрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдФрд░ рдХреНрд░рдорд┐рдХрддрд╛ рдЬрд╛рдВрдЪ рдЬреЛрдбрд╝рдиреЗ рдкрд░ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕