рд╕рдВрд╕реНрдорд░рдг рднреВрд▓-рднреВрд▓-рдмрдо


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


рдХреБрдЫ рдЧрд╣рди рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдЫреЛрдбрд╝рдирд╛ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдХреВрд▓рди рддрдХрдиреАрдХ рд╣реИред рд╣рд░ рдмрд╛рд░ рдЬрдм рдЖрдк рдХреБрдЫ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - рди рдХрд░реЗрдВред рдХреИрд╢ - memcache , file cache , local cache - рдХрд┐рд╕реА рднреА рдХреИрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ! рдмреИрдХрдПрдВрдб рд╕рд┐рд╕реНрдЯрдо рдФрд░ рдЕрддреАрдд рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреЗ рдХрд┐рд╕реА рднреА рдмреИрдХрдПрдВрдб рд╕рд┐рд╕реНрдЯрдо рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред



рд╕рдВрд╕реНрдорд░рдг рдмрдирд╛рдо рдХреИрд╢рд┐рдВрдЧ


рд╕рдВрд╕реНрдорд░рдг рдХреИрд╢рд┐рдВрдЧ рдХреА рддрд░рд╣ рд╣реИред рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдЕрд▓рдЧ рд╣реИред рдХреИрд╢ рдирд╣реАрдВ, рдЪрд▓реЛ рдЗрд╕реЗ рдХрд╛рд╢ рдХрд╣рддреЗ рд╣реИрдВред

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


рд╕рдорд╕реНрдпрд╛ - рдХреИрд╢ рдХреЛ "рдХреИрд╢ рдХреБрдВрдЬреА" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ


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


рд╕рдВрд╕реНрдорд░рдг рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рдХреИрд╢реЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ


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


рдЬреНрдЮрд╛рдкрди рдФрд░ рдХреИрд╢ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ API INTERFACE рдореЗрдВ рд╣реИ !

рдЖрдорддреМрд░ рдкрд░ * рдХрд╛ рдорддрд▓рдм рд╣рдореЗрд╢рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред Lodash.memoize , рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рддрд░реНрдХреЛрдВ рдХреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреИрд╢ рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП JSON.stringify рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрд╣ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рд╣реИ! рдирд╣реАрдВ!)ред рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рдХрд┐ рд╡реЗ рдЗрд╕ рд╡рд╕реНрддреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рд╕реА рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдПрдХ рдХреИрд╢реНрдб рдореВрд▓реНрдп рдХреЛ рдкрдХрдбрд╝реЗ рд╣реБрдПред рдлрд╛рд╕реНрдЯ-рдореЗрдореЛрдЗрдЬрд╝ , "рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рд╕рдВрднрд╡ рд╕рдВрд╕реНрдорд░рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА", рд╡рд╣реА рдХрд░рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдирд╛рдорд┐рдд рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕рдВрд╕реНрдорд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреИрд╢ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВред


рдпрд╣ рдЙрд▓реНрд▓реЗрдЦ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ - JSON.stringify рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреА рддреБрд▓рдирд╛ рдореЗрдВ 10 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЖрдк рдпрд╛рдж рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд╣реИрдВред

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


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

рдХреИрд╢ рдЖрдХрд╛рд░


рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЗ рдмреАрдЪ рджреВрд╕рд░рд╛ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдХреИрд╢ рдЖрдХрд╛рд░ рдФрд░ рдХреИрд╢ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред


рдХреНрдпрд╛ рдЖрдкрдиреЗ рдХрднреА рд╕реЛрдЪрд╛ рд╣реИ - рдХреНрдпреЛрдВ reselect рдпрд╛ memoize-one рд╣реА рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд░рдЦрддрд╛ рд╣реИ? "рдХреИрд╢ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрд░рд┐рдгрд╛рдо рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ" , рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рд╕реЗ рдЕрдзрд┐рдХ рд╕реНрдЯреЛрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдХрд╛рд░рдг рдирд╣реАрдВ рд╣реИрдВред


... рдпрд╣ рдЕрдзрд┐рдХ рд╣реИ:


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

рдПрдХ рдПрдХрд▓ рдкрд░рд┐рдгрд╛рдо?!


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


рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдПрдХрд▓-рдореВрд▓реНрдп рд╕рдВрд╕реНрдорд░рдг рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЛ BIG рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред


рд╕рдорд╕реНрдпрд╛ 1 - рдпрд╣ "рдирд╛рдЬреБрдХ" рд╣реИ


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


рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХреИрд╢ рдорд┐рд╕ рдПрдХ рдХреИрд╢ рд╣реИ рдЬреЛ рд╣реЗрдбрд╢реЙрдЯ рдорд┐рдЯрд╛ рджреЗрддрд╛ рд╣реИред

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


 const getSomeDataFromState = memoize(state => compute(state.tasks)); 

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


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


 // every time `state` changes, cached value would be rejected const getTasksFromState = createSelector(state => state.tasks); const getSomeDataFromState = createSelector( // `tasks` "without" `state` getTasksFromState, // <---------- // and this operation would be memoized "more often" tasks => compute(state.tasks) ); 

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


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


рдЖрдЗрдбрд┐рдпрд╛ рдЙрд╕ рдбреЗрдЯрд╛ рдкрд░ "рдлреЛрдХрд╕" рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдЖрдк рдирд┐рд░реНрднрд░ рд╣реИрдВ

рдореЗрд░реЗ рдкрд╛рд╕ рджреЛ рдкрд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП - рдЙрд▓реНрд▓реЗрдЦ:


  • lodash.memoize рдФрд░ fast-memoize рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЗ 1 рд╣реИрдВ) рддреЗрдЬ 2 рдирд╣реАрдВ) рд╕реБрд░рдХреНрд╖рд┐рдд 3 рдирд╣реАрдВ) рдЭреВрдареА рд╕рдХрд╛рд░рд╛рддреНрдордХ рдЙрддреНрдкрдиреНрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдХреБрдЫ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдореЗрдВ рд╕рдорд╛рди рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ "рдХреИрд╢ рд╣реЙрдЯ рд░реЗрдЯ" рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рдмрд╣реБрдд рдмреБрд░рд╛ рдХрд╛рдо рд╣реИред
  • ES6 рдкреНрд░реЙрдХреНрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИ, рджрд┐рдП рдЧрдП рдЪрд░ рдХреЗ рд╕рднреА рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдЯреБрдХрдбрд╝реЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдФрд░ рдХреЗрд╡рд▓ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬреЛ рдорд╛рдпрдиреЗ рд░рдЦрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдбреЗрдЯрд╛ рдЪрдпрдирдХрд░реНрддрд╛рдУрдВ рдХреЗ рдЕрд╕рдВрдЦреНрдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ - рдЖрдк рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдкрд╕рдВрдж рдпрд╛ рд╕рдордЭ рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ рдЙрдЪрд┐рдд рд╕рдВрд╕реНрдорд░рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ - рдлрд┐рд░ рдореЗрдореЛрдЗрдЬрд╝-рд╕реНрдЯреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рд╕рдорд╕реНрдпрд╛ 2- рдпрд╣ "рдПрдХ рдХреИрд╢ рд▓рд╛рдЗрди" рд╣реИ


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


 const tasks = getTasks(state); // let's get some data from state1 (function was defined above) getDataFromTask(tasks[0]); // Yep! equal(getDataFromTask(tasks[0]), getDataFromTask(tasks[0])) // Ok! getDataFromTask(tasks[1]); // a different task? What the heck? // oh! That's another argument? How dare you!? // TLDR -> task[0] in the cache got replaced by task[1] you cannot use getDataFromTask to get data from different tasks 

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


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

3 рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рд╣реИрдВ:


  • redux рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ - mapStateToProps рдХрд╛рд░рдЦрд╛рдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдкреНрд░рддрд┐-рдЖрд╡реГрддреНрддрд┐ рд╕рдВрд╕реНрдорд░рдг рдкреИрджрд╛ рдХрд░реЗрдЧрд╛ред
     const mapStateToProps = () => { const selector = createSelector(...); // ^ you have to define per-instance selectors here // usually that's not possible :) return state => ({ data: selector(data), // a usual mapStateToProps }); } 
  • рджреВрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рдЧрднрдЧ рдПрдХ рд╣реА рд╣реИ (рдФрд░ рд░рд┐рдбрдХреНрд╕ рдХреЗ рд▓рд┐рдП рднреА) - рдпрд╣ рдлрд┐рд░ рд╕реЗ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИред рдпрд╣ рдПрдХ рдЬрдЯрд┐рд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ рдШрдЯрдХреЛрдВ рдХреЛ рднреЗрдж рдХрд░ рджрд┐рди рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдордЭ рд╕рдХрддрд╛ рд╣реИ, рдХрд┐ рдирдпрд╛ рдХреЙрд▓ "рдЕрдиреНрдп" рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдпрд╣ "рдкрд┐рдЫрд▓реЗ" рдХреЗ рд▓рд┐рдП рдХреИрд╢ рд░рдЦ рд╕рдХрддрд╛ рд╣реИред


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


рд╡рд┐рдЪрд╛рд░ рдЖрдпрд╛? рдЕрдм рдЗрд╕реЗ рднреВрд▓ рдЬрд╛рдУ! рдФрд░ рддреАрд╕рд░рд╛ рд╕рдВрд╕реНрдХрд░рдг рдХрд╣рд╛рдБ рд╣реИ ??

рдПрдХ рд╡рд┐рд░рд╛рдо рд▓реЗрддреЗ рд╣реИрдВ


рдмрдВрдж рдХрд░реЛред рд░рд┐рд▓реИрдХреНрд╕ред рдЧрд╣рд░реА рд╕рд╛рдВрд╕ рд▓реЗрдВред рдФрд░ рдПрдХ рд╕рд░рд▓ рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ рджреЗрдВ - рд▓рдХреНрд╖реНрдп рдХреНрдпрд╛ рд╣реИ? рд▓рдХреНрд╖реНрдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛? рдХреНрдпрд╛ рджрд┐рди рдмрдЪрд╛рдирд╛ рд╣реЛрдЧрд╛?


рд╕реБрдЭрд╛рд╡: рд╡рд╣ рдХрд╣рд╛рдБ рд╣реИ *** рдЪ "рдХреИрд╢"!


рд╡рд╣ "рдХреИрд╢" рдХрд╣рд╛рдВ рд╣реИ? рд╣рд╛рдВ - рдпрд╣ рд╕рд╣реА рд╕рд╡рд╛рд▓ рд╣реИред рдпрд╣ рдкреВрдЫрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдФрд░ рдЬрд╡рд╛рдм рд╕рд░рд▓ рд╣реИ - рдпрд╣ рдПрдХ рдмрдВрдж рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИред рдПрдХ рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдерд╛рди рдореЗрдВ * рдПрдХ рдпрд╛рдж рд╕рдорд╛рд░реЛрд╣ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП - рдпрд╣рд╛рдБ memoize-one рдХреЛрдб рд╣реИ:


 function(fn) { let lastArgs; // the last arguments let lastResult;// the last result <--- THIS IS THE CACHE // the memoized function const memoizedCall = function(...newArgs) { if (isEqual(newArgs, lastArgs)) { return lastResult; } lastResult = resultFn.apply(this, newArgs); lastArgs = newArgs; return lastResult; }; return memoizedCall; } 

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


Reselect рдПрдХ рд╣реА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдХ "рдХрд╛рдВрдЯрд╛" рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХрдорд╛рддреНрд░ рддрд░реАрдХрд╛, рдПрдХ рдФрд░ рдХреИрд╢ рдХреЗ рд╕рд╛рде - рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдорд░рдг рдмрдВрдж рдХрд░рдирд╛ред


рд▓реЗрдХрд┐рди (рдПрдХ рдФрд░) рдореБрдЦреНрдп рд╕рд╡рд╛рд▓ - рдЬрдм рдпрд╣ (рдХреИрд╢) "рдЪрд▓рд╛ рдЧрдпрд╛" рд╣реЛрдЧрд╛?


TLDR: рдпрд╣ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде "рдЪрд▓рд╛ рдЧрдпрд╛" рд╣реЛрдЧрд╛, рдЬрдм рдлрд╝рдВрдХреНрд╢рди рдЙрджрд╛рд╣рд░рдг рдЧрд╛рд░рдмреЗрдЬ рдХрд▓реЗрдХреНрдЯрд░ рджреНрд╡рд╛рд░рд╛ рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрджрд╛рд╣рд░рдг? рдЙрджрд╛рд╣рд░рдг! рддреЛ - рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг рдЬреНрдЮрд╛рдкрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ? рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдПрдХ рдкреВрд░рд╛ рд▓реЗрдЦ рд╣реИ


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдпрджрд┐ рдЖрдк рдХрдХреНрд╖рд╛-рдЖрдзрд╛рд░рд┐рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


 import memoize from "memoize-one"; class Example extends Component { filter = memoize( // <-- bound to the instance (list, filterText) => list.filter(...); // ^ that is "per instance" memoization // we are creating "own" memoization function // with the "own" lastResult render() { // Calculate the latest filtered list. // If these arguments haven't changed since the last render, // `memoize-one` will reuse the last return value. const filteredList = this.filter(something, somehow); return <ul>{filteredList.map(item => ...}</ul> } } 

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


рдЗрд╕ рдмрд╛рд░ рдпрд╣ рдПрдХ рд╢реНрд░реЗрдгреА рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде "рдЪрд▓рд╛ рдЧрдпрд╛" рд╣реЛрдЧрд╛ред рдПрдХ рдмрд╛рд░ рдШрдЯрдХ рдЕрдирдорд╛рдЙрдВрдЯ рд╣реЛ рдЧрдпрд╛ - рдпрд╣ рдПрдХ рдЯреНрд░реЗрд╕ рдХреЗ рдмрд┐рдирд╛ рдЪрд▓рд╛ рдЧрдпрд╛ред рдпрд╣ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ "рдкреНрд░рддрд┐ рдЙрджрд╛рд╣рд░рдг" рд╣реИ, рдФрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред this.lastResult рдкрд░рд┐рдгрд╛рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдорд╛рди "рдЬреНрдЮрд╛рдкрди" рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде, рдПрдХ рд▓реМрдХрд┐рдХ рдкрд░рд┐рдгрд╛рдо рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред


React.Hooks рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рд╣реИ


рд╣рдо рдХрд░реАрдм рдЖ рд░рд╣реЗ рд╣реИрдВред Redux рд╣реБрдХ рдореЗрдВ рдХреБрдЫ рд╕рдВрджрд┐рдЧреНрдз рдХрдорд╛рдВрдб рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ, рд╕рдВрднрд╡рддрдГ, рдореЗрдореЛрдПрдЬрд╝реЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИрдВред рдЬреИрд╕реЗ - useMemo , useCallback , useRef



рд▓реЗрдХрд┐рди рд╕рд╡рд╛рд▓ - рдЬрд╣рд╛рдВ рдпрд╣ рдЗрд╕ рдмрд╛рд░ рдПрдХ рдпрд╛рджрдЧрд╛рд░ рдореВрд▓реНрдп рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИ?

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ - рдпрд╣ рдЗрд╕реЗ "рд╣реБрдХ" рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдПрдХ VDOM рддрддреНрд╡ рдХреЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рднрд╛рдЧ рдХреЗ рдЕрдВрджрд░, рдЬрд┐рд╕реЗ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рд╕реЗ рдЬреБрдбрд╝реЗ рдлрд╛рдЗрдмрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рд╕рдорд╛рдирд╛рдВрддрд░ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рднреАрддрд░ред


рдЗрддрдирд╛ рдЫреЛрдЯрд╛ рдирд╣реАрдВ рд╣реИ - рд╣реБрдХ рдЖрдкрдХреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдмрджрд▓ рд░рд╣рд╛ рд╣реИ, рдЖрдкрдХреЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдЕрдВрджрд░ рд▓реЗ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдХреБрдЫ рдЪрд░ рдПрдХ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдмрдВрдж рд╣реЛрдиреЗ рдХреЗ рдЕрдВрджрд░ рдЫрд┐рдкреЗ рд╣реБрдП рд╕реНрдерд╛рди рдкрд░ рд╣реИрдВ ред рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕рдВрджрд┐рдЧреНрдз рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ - рдХреЛрд░рдЯрд╛рдЗрди рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд╡реЗ рдЖрдорддреМрд░ рдкрд░ generators рдпрд╛ async functions рд░реВрдк рдореЗрдВ рдЬрд╛рдиреЗ рдЬрд╛рддреЗ рд╣реИрдВред


рд▓реЗрдХрд┐рди рд╡рд╣ рдереЛрдбрд╝рд╛ рдЪрд░рдо рдкрд░ рд╣реИред рдПрдХ рдмрд╣реБрдд рд╣реА рдХрдо рд╕рдордп рдореЗрдВ рдЙрдкрдпреЛрдЧ рдореЗрдореЛ рдЗрд╕ рдореЗрдВ рд╕рдВрд╕реНрдорд░рдг рдореВрд▓реНрдп рдХрд╛ рднрдВрдбрд╛рд░рдг рдХрд░ рд░рд╣рд╛ рд╣реИред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реИ "рдпрд╣"ред


рдпрджрд┐ рд╣рдо рдПрдХ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдорд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рд╣рдореЗрдВ рдПрдХ рдмреЗрд╣рддрд░ "рдпрд╣" рдЦреЛрдЬрдирд╛ рдЪрд╛рд╣рд┐рдПред

рдЬрд┐рдВрдЧ!


WeakMaps!


рд╣рд╛рдБ! WeakMaps! рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрд╣рд╛рдВ рдХреБрдВрдЬреА рдпрд╣ рд╣реЛрдЧреА, рдЬрдм рддрдХ рдХрд┐ WeakMap рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рд╕реНрд╡реАрдХрд╛рд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЕрд░реНрдерд╛рдд "рдСрдмреНрдЬреЗрдХреНрдЯ"ред


рдЪрд▓реЛ рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ:


 const createHiddenSpot = (fn) => { const map = new WeakMap(); // a hidden "closure" const set = (key, value) => (map.set(key, value), value); return (key) => { return map.get(key) || set(key, fn(key)) } } const weakSelect = createHiddenSpot(selector); weakSelect(todos); // create a new entry weakSelect(todos); // return an existing entry weakSelect(todos[0]); // create a new entry weakSelect(todos[1]); // create a new entry weakSelect(todos[0]); // return an existing entry! weakSelect(todos[1]); // return an existing entry!! weakSelect(todos); // return an existing entry!!! 

рдпрд╣ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╕рд░рд▓ рд╣реИ, рдФрд░ рдХрд╛рдлреА "рд╕рд╣реА" рд╣реИред рддреЛ "рдЬрдм рдпрд╣ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛"?


  • рдХрдордЬреЛрд░ рдХреЛ рднреВрд▓ рдЬрд╛рдУ рдФрд░ рдПрдХ рдкреВрд░рд╛ "рдирдХреНрд╢рд╛" рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛
  • рдЯреЙрдбреЛрд╕ рдХреЛ рднреВрд▓ рдЬрд╛рдУ [0] рдФрд░ рдЙрдирдХреА рдХрдордЬреЛрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рд╣реЛ рдЬрд╛рдПрдЧреА
  • todos рднреВрд▓ рдЬрд╛рдУ - рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ рдбреЗрдЯрд╛ рдЪрд▓рд╛ рдЬрд╛рдПрдЧрд╛!

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЬрдм рдХреБрдЫ "рдЪрд▓рд╛ рдЧрдпрд╛" рд╣реЛрдЧрд╛ - рдХреЗрд╡рд▓ рдЬрдм рдпрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП!

рдЬрд╛рджреБрдИ рд░реВрдк рд╕реЗ - рд╕рднреА reselect рдореБрджреНрджреЗ рдЪрд▓реЗ рдЧрдП рд╣реИрдВред рдЖрдХреНрд░рд╛рдордХ рд╕рдВрд╕реНрдорд░рдг рдХреЗ рдореБрджреНрджреЗ - рдПрдХ рдЧреЛрдВрдирд░ рднреАред


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


рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЯрд┐рдХрддреА рд╣реИ - рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдПрдкреАрдЖрдИ рдмрдирд╛рдПрдВ


рдХрд╛рд╢реЗ - рдПрдХ рдХреИрд╢ рд╣реИ


kashe WeakMap рдЖрдзрд╛рд░рд┐рдд рд╕рдВрд╕реНрдорд░рдг рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ, рдЬреЛ рдЖрдкрдХрд╛ рджрд┐рди рдмрдЪрд╛ рд╕рдХрддрд╛ рд╣реИред


рдпрд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп 4 рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рддрд╛ рд╣реИ


  • kashe -рд╕реЗ- kashe ред
  • box - рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдорд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдВрд╕реНрдорд░рдг рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
  • inbox - рдиреЗрд╕реНрдЯреЗрдб рдЙрдкрд╕рд░реНрдЧ рд╕рдВрд╕реНрдорд░рдг, рд╕рдВрд╕реНрдорд░рдг рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
  • fork - to fork (рдЬрд╛рд╣рд┐рд░ рд╣реИ) рд╕рдВрд╕реНрдорд░рдгред

рдХрд╛рд╢реЗ (fn) => рд╕рдВрд╕реНрдорд░рдг (... args)


рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рдПрдХ createHiddenSpot рд╣реИред рдпрд╣ рдЖрдВрддрд░рд┐рдХ WeakMap рдХреА рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред


 const selector = (state, prop) => ({result: state[prop]}); const memoized = kashe(selector); const old = memoized(state, 'x') memoized(state, 'x') === old memoized(state, 'y') === memoized(state, 'y') // ^^ another argument // but old !== memoized(state, 'x') // 'y' wiped 'x' cache in `state` 

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


рдмреЙрдХреНрд╕ (fn) => рдореЗрдореЛрдлрд╝рд┐рди 2 (рдмреЙрдХреНрд╕, ... рдЖрд░реНрдЧреНрд╕)


рдпрд╣ рдПрдХ рд╣реА рдХрд╛рд░реНрдп рд╣реИ, рдмрд╕ рджреЛ рдмрд╛рд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдПрдХ рдмрд╛рд░ fn рдХреЗ рд▓рд┐рдП, рдПрдХ рдмрд╛рд░ рдЬреНрдЮрд╛рдкрди рдХреЗ рд▓рд┐рдП, рддрд░реНрдХреЛрдВ рдХреА рдПрдХ рдкреНрд░рдореБрдЦ рдХреБрдВрдЬреА рдЬреЛрдбрд╝рдХрд░ред рдпрд╣ рдХрд┐рд╕реА рднреА рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдХрд╛рд╢-рдпрд╛рджрдЧрд╛рд░ рдмрдирд╛ рд╕рдХрддрд╛ рд╣реИред


рдпрд╣ рдХрд╛рдлреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИ - рд╣реЗ рдлрд╝рдВрдХреНрд╢рди! рдореИрдВ рдЗрд╕ рдмреЙрдХреНрд╕ рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реВрдВрдЧрд╛ред

 // could not be "kashe" memoized const addTwo = (a,b) => ({ result: a+b }); const bAddTwo = boxed(addTwo); const cacheKey = {}; // any object bAddTwo(cacheKey, 1, 2) === bAddTwo(cacheKey, 1, 2) === { result: 3} 

рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдВрд╕реНрдорд░рдг рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдмреЙрдХреНрд╕ рдХрд░реЗрдВрдЧреЗ - рддреЛ рдЖрдк рд╕рдВрд╕реНрдорд░рдг рдХреЗ рдЕрд╡рд╕рд░ рдХреЛ рдмрдврд╝рд╛рдПрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрд╕реНрдорд░рдг - рдЖрдк рд╕рдВрд╕реНрдорд░рдг рдХреИрд╕реНрдХреЗрдб рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред


 const selectSomethingFromTodo = (state, prop) => ... const selector = kashe(selectSomethingFromTodo); const boxedSelector = kashe(selector); class Component { render () { const result = boxedSelector(this, todos, this.props.todoId); // 1. try to find result in `this` // 2. try to find result in `todos` // 3. store in `todos` // 4. store in `this` // if multiple `this`(components) are reading from `todos` - // selector is not working (they are wiping each other) // but data stored in `this` - exists. ... } } 

рдЗрдирдмреЙрдХреНрд╕ (fn) => рдореЗрдореЛрдлрд╛рдЗрдирд╛ 2 (рдмреЙрдХреНрд╕, ... рдЖрд░реНрдЧреНрд╕)


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


рдпрд╣ рдХрд╛рдлреА рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИ - рд╣реЗ! рдЕрдВрджрд░ рд╕рдм рд▓реЛрдЧ! рдпрд╣рд╛рдБ рдПрдХ рдмреЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ

 const getAndSet = (task, number) => task.value + number; const memoized = kashe(getAndSet); const inboxed = inbox(getAndSet); const doubleBoxed = inbox(memoized); memoized(task, 1) // ok memoized(task, 2) // previous result wiped inboxed(key1, task, 1) // ok inboxed(key2, task, 2) // ok // inbox also override the cache for any underlaying kashe calls doubleBoxed(key1, task, 1) // ok doubleBoxed(key2, task, 2) // ok 

рдХрд╛рдВрдЯрд╛ (рдХрд╛рд╢-рдореЗрдореЛрдЗрдЬрд╝реНрдб) => рдХрд╛рд╢реЗ-рдореЗрдореЛрдЗрдЬрд╝реНрдб


рдХрд╛рдВрдЯрд╛ рдПрдХ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рдВрдЯрд╛ рд╣реИ - рдпрд╣ рдХрд┐рд╕реА рднреА рдХрд╛рд╢-рдЬреНрдЮрд╛рдкрди рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реА рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдФрд░ рдЖрдВрддрд░рд┐рдХ рдХреИрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдХреЗ рд╕рд╛рдеред Redux mapStateToProps рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдпрд╛рдж рд░рдЦреЗрдВ?


 const mapStateToProps = () => { // const selector = createSelector(...); // const selector = fork(realSelector); // just fork existing selector. Or box it, or don't do anything // kashe is more "stable" than reselect. return state => ({ data: selector(data), }); } 

рдлрд┐рд░ рд╕реЗ рдЪреБрдиреЗрдВ


рдФрд░ рдПрдХ рдФрд░ рдмрд╛рдд рдЬреЛ рдЖрдкрдХреЛ рдкрддрд╛ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП - рдХрд╛рд╢ reselect рдХреА рдЬрдЧрд╣ рд▓реЗ рд╕рдХрддреА рдереАред рд╕рдЪрдореБрдЪред


 import { createSelector } from 'kashe/reselect'; 

рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╣реА reselect рд╣реИ, рдмрд╕ рдПрдХ рд╕рдВрд╕реНрдорд░рдг рд╕рдорд╛рд░реЛрд╣ рдХреЗ рд░реВрдк рдореЗрдВ kashe рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


Codesandbox


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


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

рдмрд╛рдд рд╕рдордЭ рдореЗрдВ рдЖрдИ? рдПрдХ рдЕрдзрд┐рдХ "рдХрдордЬреЛрд░" рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдХреБрдЫ рдпрд╛рдж рд░рдЦрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛, рдФрд░ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рднреВрд▓ рдЬрд╛рдПрдЧрд╛ред


https://github.com/theKashey/kashe


рд╣рд╛рдБ, рдХреБрдЫ рднреВрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ, - рдХреНрдпрд╛ рдЖрдк рдХреГрдкрдпрд╛ рдпрд╣рд╛рдБ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ?


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


All Articles