рдСрдмреНрдЬрд╝рд░реНрд╡рдмрд▓реНрд╕ рдФрд░ рд░рд┐рдПрдХреНрдЯ рд╣реБрдХ рдХреЗ рд╕рд╛рде Redux рдХреА рдЬрдЧрд╣

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


рд╣рдореЗрдВ Redux рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ?


Redux рдЕрдХреНрд╕рд░ рд░рд┐рдПрдХреНрдЯ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛрддрд╛ рд╣реИ, рдХрдИ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдпрд╣ рд╕реЛрдЪрдиреЗ рдХреЗ рдмрд┐рдирд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ Redux рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИред рд░рд┐рдПрдХреНрдЯ рдПрдХ рдШрдЯрдХ рдФрд░ рдЙрд╕рдХреЗ рд░рд╛рдЬреНрдп рдХреЛ setState() / useState() рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЖрд╕рд╛рди рдмрдирд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рдПрдХ рд╕рд╛рде рдХрдИ рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд░рд╛рдЬреНрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕рдм рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдХрдИ рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рд╛рдЭрд╛ рд╕реНрдерд┐рддрд┐ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╕рдорд╛рдзрд╛рди рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕реЗ (рд░рд╛рдЬреНрдп) рдЕрдкрдиреЗ рдЖрдо рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЗ рдкрд╛рд╕ рд▓реЗ рдЬрд╛рдпрд╛ рдЬрд╛рдПред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ "рд╣реЗрдб-рдСрди" рд╕рдорд╛рдзрд╛рди рдЬрд▓реНрджреА рд╕реЗ рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддреЗ рд╣реИрдВ: рдпрджрд┐ рдШрдЯрдХ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдШрдЯрдХ рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИрдВ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХреЛрдВ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд╣реБрдд рд╕реНрдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рд░рд┐рдПрдХреНрдЯ рдХреЙрдиреНрдЯреЗрдХреНрд╕реНрдЯ рд╕реНрдкрд┐рд▓рд┐рдВрдЧ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдирдП рд╕рдВрджрд░реНрдн рдХреА рдШреЛрд╖рдгрд╛ рдХрд░рддреЗ рд╣реБрдП рд╣рд░ рдмрд╛рд░ рдЬрдм рдХрд┐рд╕реА рд░рд╛рдЬреНрдп рдХреЛ рдПрдХ рдЕрдиреНрдп рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд▓рдЧрддрд╛ рд╣реИ рддреЛ рдЙрд╕реЗ рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА рдФрд░ рдЕрдВрддрддрдГ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдХрд╛рд░рдг рдмрди рд╕рдХрддрд╛ рд╣реИред


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



рдЬрдм рдореИрдВрдиреЗ рдкрд╣рд▓реА рдмрд╛рд░ Redux рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЛ рд╕рдордЭрд╛


Redux рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?


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


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


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



Redux рдХреЗ рд╕рд╛рде рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╕реАрдЦрдиреЗ рдХрд╛ рд░реЛрдорд╛рдВрдЪ


рдЕрд╡рд▓реЛрдХрди рдпреЛрдЧреНрдп рдФрд░ рд╣реБрдХ: рд░рд╛рдЬреНрдп рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рджреГрд╖реНрдЯрд┐рдХреЛрдгред


рд╕реНрдЯреЛрд░ рдХреЛ рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ


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


рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд░, рдРрд╕реА рдХрдХреНрд╖рд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ:


 type Listener<T> = (val: T) => void; type Unsubscriber = () => void; export class Observable<T> { private _listeners: Listener<T>[]; constructor(private _val: T) {} get(): T { return this._val; } set(val: T) { if (this._val !== val) { this._val = val; this._listeners.forEach(l => l(val)); } } subscribe(listener: Listener<T>): Unsubscriber { this._listeners.push(listener); return () => { this._listeners = this._listeners.filter(l => l !== listener); }; } } 

рдпрджрд┐ рдЖрдк Redux Store рд╕рд╛рде рдЗрд╕ рд╡рд░реНрдЧ рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ рдХрд╛рдлреА рд╕рдорд╛рди рд╣реИрдВ: get() getState() рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдФрд░ subscribe() рд╕рдорд╛рди рд╣реИред рдореБрдЦреНрдп рдЕрдВрддрд░ dispatch() рд╡рд┐рдзрд┐ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рд░рд▓ set() рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ Reducer рдкрд░ рднрд░реЛрд╕рд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрд╕рдореЗрдВ рдирд┐рд╣рд┐рдд рдореВрд▓реНрдп рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐, Redux рдХреЗ рд╡рд┐рдкрд░реАрдд, рд╣рдо рд╕рднреА рд░рд╛рдЬреНрдп рд╡рд╛рд▓реЗ рдПрдХрд▓ Store рдмрдЬрд╛рдп рдмрд╣реБрдд рд╕рд╛рд░реЗ Observable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред


Reducer рд╕реЗрд╡рд╛рдПрдВ рдмрджрд▓реЗрдВ


рдЕрдм Observable рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЕрднреА рднреА reducer рдореЗрдВ рдирд┐рд╣рд┐рдд рддрд░реНрдХ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо рд╕реЗрд╡рд╛рдУрдВ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕реЗрд╡рд╛рдПрдБ рдРрд╕реА рдХрдХреНрд╖рд╛рдПрдВ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд╕рдВрдкреВрд░реНрдг рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВред рдЪрд▓рд┐рдП Observable рдЙрдкрдпреЛрдЧ рд╕реЗ Redux Todo рдХреЛ Redux рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ Todo рд╕реЗрд╡рд╛ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ:


 import { Observable } from "./observable"; export interface Todo { readonly text: string; readonly completed: boolean; } export enum VisibilityFilter { SHOW_ALL, SHOW_COMPLETED, SHOW_ACTIVE, } export class TodoService { readonly todos = new Observable<Todo[]>([]); readonly visibilityFilter = new Observable(VisibilityFilter.SHOW_ALL); addTodo(text: string) { this.todos.set([...this.todos.get(), { text, completed: false }]); } toggleTodo(index: number) { this.todos.set(this.todos.get().map( (todo, i) => (i === index ? { text: todo.text, completed: !todo.completed } : todo) )); } setVisibilityFilter(filter: VisibilityFilter) { this.visibilityFilter.set(filter); } } 

Reducer Todo рд╕рд╛рде рдЗрд╕рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдВрддрд░реЛрдВ рдХреЛ рдиреЛрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:


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

рд╕реЗрд╡рд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдФрд░ рдШрдЯрдХреЛрдВ рд╕реЗ рдЕрд╡рд▓реЛрдХрдиреАрдп


рдЕрдм рдЬрдм рд╣рдордиреЗ "рдСрдмреНрдЬрд░реНрд╡реЗрдмрд▓ рдФрд░ рд╕реЗрд╡рд╛рдУрдВ" рдХреЗ рд╕рд╛рде "Redux рд╕реЗ рд╕реНрдЯреЛрд░ рдФрд░ рд░реЗрдбреНрдпреВрд╕рд░" рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рд╕рднреА рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХреЛрдВ рд╕реЗ рд╕реЗрд╡рд╛рдПрдВ рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рдХрдИ рддрд░реАрдХреЗ рд╣реИрдВ: рд╣рдо рдЖрдИрдУрд╕реА рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрдиреНрд╡рд░реНрд╕рд╛рдЗрдЬрд╝ рдХрд░реЗрдВ; рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдпрд╛ Store Redux рдореЗрдВ рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд╡рд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрд╢реНрд╡рд┐рдХ рдЙрджрд╛рд╣рд░рдгред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдЕрдВрддрд┐рдо рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ:


 import { TodoService } from "./todoService"; export const todoService = new TodoService(); 

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


 import { useEffect, useState } from "react"; import { Observable } from "./observable"; export function useObservable<T>(observable: Observable<T>): T { const [val, setVal] = useState(observable.get()); useEffect(() => { setVal(observable.get()); //   @mayorovp return observable.subscribe(setVal); }, [observable]); return val; } 

рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦрдирд╛


рд╣рдорд╛рд░рд╛ рдЯреВрд▓рдХрд┐рдЯ рддреИрдпрд╛рд░ рд╣реИред рд╣рдо рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП useObservable рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдШрдЯрдХ рд╣рдореЗрд╢рд╛ рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде useObservable рд░рд╣реЗрдВрдЧреЗред


рдЪрд▓реЛ рдирдП рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ Redux рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╕реЗ рдЯреЛрдбреЛрд▓рд┐рд╕реНрдЯ рдШрдЯрдХ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИ:


 import React from "react"; import { useObservable } from "./observableHook"; import { todoService } from "./services"; import { Todo, VisibilityFilter } from "./todoService"; export const TodoList = () => { const todos = useObservable(todoService.todos); const filter = useObservable(todoService.visibilityFilter); const visibleTodos = getVisibleTodos(todos, filter); return ( <div> <ul> {visibleTodos.map((todo, index) => ( <TodoItem key={index} todo={todo} index={index} /> ))} </ul> <p> Show: <FilterLink filter={VisibilityFilter.SHOW_ALL}>All</FilterLink>, <FilterLink filter={VisibilityFilter.SHOW_ACTIVE}>Active</FilterLink>, <FilterLink filter={VisibilityFilter.SHOW_ALL}>Completed</FilterLink> </p> </div> ); }; const TodoItem = ({ todo: { text, completed }, index }: { todo: Todo; index: number }) => { return ( <li style={{ textDecoration: completed ? "line-through" : "none", }} onClick={() => todoService.toggleTodo(index)} > {text} </li> ); }; const FilterLink = ({ filter, children }: { filter: VisibilityFilter; children: React.ReactNode }) => { const activeFilter = useObservable(todoService.visibilityFilter); const active = filter === activeFilter; return active ? ( <span>{children}</span> ) : ( <a href="" onClick={() => todoService.setVisibilityFilter(filter)}> {children} </a> ); }; function getVisibleTodos(todos: Todo[], filter: VisibilityFilter): Todo[] { switch (filter) { case VisibilityFilter.SHOW_ALL: return todos; case VisibilityFilter.SHOW_COMPLETED: return todos.filter(t => t.completed); case VisibilityFilter.SHOW_ACTIVE: return todos.filter(t => !t.completed); } } 

рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдХрдИ рдШрдЯрдХреЛрдВ рдХреЛ рд▓рд┐рдЦрд╛ рд╣реИ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рд░рд╛рдЬреНрдп рдореВрд▓реНрдпреЛрдВ ( todos рдФрд░ visibilityFilter ) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдпреЗ рдорд╛рди рдмрд╕ todoService рд╕реЗ рдХреЙрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрджрд▓реЗ todoService ред рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдУрдмреНрд╕реЗрд░реНрд╡реЗрдмрд▓, рдЬреЛ рдореВрд▓реНрдп рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддрд╛ рд╣реИ, рдпреЗ рдШрдЯрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрдиреЗ рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред


рдирд┐рд╖реНрдХрд░реНрд╖


рдпрджрд┐ рд╣рдо рдЗрд╕ рдХреЛрдб рдХреА рддреБрд▓рдирд╛ Redux рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрдИ рдлрд╛рдпрджреЗ рджрд┐рдЦрд╛рдИ рджреЗрдВрдЧреЗ:


  • рдЪрд┐рдВрддрд╛: рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рд╡рд╣ рд╣реИ рдХрд┐ рд╡реЗ useObservable рдореЗрдВ рд░рд╛рдЬреНрдп рдорд╛рдиреЛрдВ рдХреЛ рд▓рдкреЗрдЯреЗрдВ рдФрд░ рдШрдЯрдХреЛрдВ рд╕реЗ рдЗрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рддреЗ рд╕рдордп рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдПрдХреНрд╢рди, рдПрдХреНрд╢рди рдХреНрд░рд┐рдПрдЯрд░, mapStateToProps рдХреЛ рд▓рд┐рдЦрдиреЗ рдпрд╛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ, рдпрд╛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╣рдорд╛рд░реЗ рдШрдЯрдХреЛрдВ рдХреЛ mapStateToProps рдФрд░ mapDispatchToProps ред
  • рд╕рд░рд▓рддрд╛: рдЕрдм рдХреЛрдб рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдмрд╣реБрдд рдЖрд╕рд╛рди рд╣реИред рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рдПрдХ рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХрд╛ рдорд╛рдорд▓рд╛ рд╣реИред рдбрд┐рдмрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдирд┐рд╖реНрдкрд╛рджрди рдореЗрдВ рднреА рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХреЛрдВ рдФрд░ рд╣рдорд╛рд░реА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХреЛрдИ рдордзреНрдпрд╡рд░реНрддреА рд╕реНрддрд░ рдирд╣реАрдВ рд╣реИред
  • рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдХреА рд╕реБрд░рдХреНрд╖рд╛: рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдП рдЧрдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреАред рд░рд╛рдЬреНрдп рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рдкреНрд░рдХрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред
  • Async / рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди: рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдпрд╣рд╛рдБ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╕рдорд╛рдзрд╛рди рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╢рд╛рдирджрд╛рд░ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддрд╛ рд╣реИред рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рд░реЗрдбрдХреНрд╕-рдердВрдХ, рдЬрд┐рд╕реЗ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреЗ рдЧрд╣рди рдЬреНрдЮрд╛рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

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


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


рдиреЛрдЯ


рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд Observable рдХрдХреНрд╖рд╛ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рдЗрд╕реЗ рдФрд░ рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЬреИрд╕реЗ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛ-рдСрдмреНрдЬрд░реНрд╡рдмрд▓реНрд╕ (рд╣рдорд╛рд░реЗ рдЕрдкрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп) рдпрд╛ RxJS рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


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


рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ: рдпрд╣ рдкреНрд░рдХрд╛рд╢рди, рдЬрд┐рд╕реЗ рдСрдмреНрдЬрд╝рд░реНрд╡реЗрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, RxJS / Immer рдХреЗ рд╕рд╛рде RxJS / Immer рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрдЦ рдкреНрд░рдмрдВрдз рд░рд╛рдЬреНрдп рдореЗрдВ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд╡рд┐рд╖рдп рдХреА рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

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


All Articles