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

рдЖрдкрдХреЛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрдзреА рд▓рдбрд╝рд╛рдИ рд╣реИред рдмрд╣реБрдд рд╕реЗ рд▓реЛрдЧ рдЕрдм рдирдИ рддрдХрдиреАрдХреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЗрд╕рд▓рд┐рдП рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдирдП рд╣реИрдВред рд░рд┐рдЬреНрдпреВрдо рдореЗрдВ рдПрдХ рдЕрдЪреНрдЫреА рд▓рд╛рдЗрди, рд╕реЗрд▓реНрдл-рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХреА рд╕рдВрднрд╛рд╡рдирд╛, рдкреНрд░рд╡реГрддреНрддрд┐ рдореЗрдВ рд╣реЛрдирд╛ред рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬрдм рдЖрдк рдмрд╕ рдЖрдЧреЗ рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред
рдФрд░ рдлрд┐рд░ рднреА, рдкреНрд░рддреНрдпреЗрдХ рдЙрдкрдХрд░рдг рдХреЛ рдЕрдкрдиреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЬрдм рд╣рдо рд╡рд╛рдгрд┐рдЬреНрдпрд┐рдХ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХрдИ рд╡рд┐рдЬреЗрдЯ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдХрдИ рд╕реНрдХреНрд░реАрди рд╣реИрдВред рдПрдХ рдмрд╛рд░, рдпрд╣ рд╕рдм рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ MarkoJS + templating рдЗрдВрдЬрди рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ jQuery рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░ рдХрд╛рдо рдХрд┐рдпрд╛ред рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдереА, рдЕрдЧрд░ ... рдФрд░, рдХреЙрд▓рдмреИрдХ рдФрд░ рдпрд╣ рд╕рдм рд╡рд╣реА рд╣реИ рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрддреАрдд рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИред
рдлрд┐рд░
рд░рд┐рдПрдХреНрдЯ рдХрд╛ рд╕рдордп рдЖрдпрд╛ред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╡реНрдпрд╛рд╡рд╕рд╛рдпрд┐рдХ рддрд░реНрдХ рдЕрдзрд┐рдХ рдореЛрдЯрд╛ рд╣реЛ рд░рд╣рд╛ рдерд╛, рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рд╡рд┐рдХрд▓реНрдк рдереЗ, рдЕрдирд┐рд╡рд╛рд░реНрдп рдХреЛрдб рдПрдХ рдЬрдЯрд┐рд▓ рдЧрдбрд╝рдмрдбрд╝ рдореЗрдВ рдмрджрд▓ рдЧрдпрд╛ред рдШреЛрд╖рдгрд╛рддреНрдордХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛрдб рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд┐рдХрд▓рд╛ред рдЕрдВрддрддрдГ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдмрдЬрд╛рдп рддрд░реНрдХ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛, рдШрдЯрдХреЛрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдХрд░реНрдордЪрд╛рд░рд┐рдпреЛрдВ рдХреЗ рдмреАрдЪ рдирдИ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ред
рд▓реЗрдХрд┐рди рд╕рдордп рдХреЗ рд╕рд╛рде рд╢реБрджреНрдз рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдЖрд╡реЗрджрди рдореВрд░реНрдд рд╕реАрдорд╛рдУрдВ рдкрд░ рдЯрд┐рдХреА рд╣реБрдИ рд╣реИред рдмреЗрд╢рдХ, рд╣рдо рдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рд╕рд╛рде рдКрдм рдЪреБрдХреЗ рд╣реИрдВред рд╕рднреА рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рдХрд░реЗрдВ рдФрд░ рдЗрд╕рдХреА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЛ рдШрдЯрдХреЛрдВ рдХреА рдореЛрдЯрд╛рдИ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдлреЗрдВрдХрдирд╛ рдЗрд╕реЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдХрдард┐рди рдмрдирд╛ рджреЗрддрд╛ рд╣реИред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдХреНрд╖рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рд╣реИред рдпрд╣ рдЗрд╕ рдмрд╛рдд рдХрд╛ рдкреНрд░рд╢реНрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╢реБрджреНрдз рдЕрднрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рд╛рдордиреЗ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдлреНрд▓рдХреНрд╕-рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЙрджреНрдпреЛрдЧ рдврд╛рдВрдЪреЗ рдореЗрдВ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рд░рд╣реЗ рд╣реИрдВред
рд░рд┐рдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдФрд░ рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░,
рд░реЗрдбрдХреНрд╕ рд╣рдорд╛рд░реЗ рдмреАрдЪ рд╕рдмрд╕реЗ рдкреНрд░рд╕рд┐рджреНрдз рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЕрдкрдирд╛ рд╣рд╛рде рдЗрд╕реЗ рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдпрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдмрд╣реБрдд рд╣реА рдЕрдВрддрд┐рдо рдХреНрд╖рдг рдореЗрдВ (рдФрд░ рдпрд╣ рд╢рд╛рдмреНрджрд┐рдХ рд╣реИ!) рд╢реИрддрд╛рди рдиреЗ рд╣реИрдмрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреАрдВрдЪ рд▓рд┐рдпрд╛, рдФрд░ рдлрд┐рд░ "рд░реЗрдбрдХреНрд╕ рдпрд╛ рдореЛрдмреЗрдХреНрд╕" рд╡рд┐рд╖рдп рдкрд░ рдЪрд░реНрдЪрд╛ рд╣реБрдИред рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
habr.com/en/post/459706 рдЗрд╕реЗ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд╛рде рд╣реА рд╕рд╛рде рдЗрд╕рдХреЗ рддрд╣рдд рд╕рднреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ, рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдХрд┐ рдореИрдВ рдЕрднреА рднреА
Mobx рдХрд╛ рдЙрдкрдпреЛрдЧ
рдХрд░реВрдВрдЧрд╛ ред
рддреЛ рдлрд┐рд░ рд╕реЗред рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдкреНрд░рд╢реНрди рдХрд╛ рдЙрддреНрддрд░ - рдпрд╣ рд╕рдм рдХреНрдпреЛрдВ? - рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ: рдкреНрд░рд╕реНрддреБрддрд┐ рдФрд░ рдбреЗрдЯрд╛ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдореИрдВ рдбреЗрдЯрд╛ рдкреНрд░рдмрдВрдзрди рдХреЛ рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╢реИрд▓реА (рдЬреИрд╕реЗ рдбреНрд░рд╛рдЗрдВрдЧ), рдХреЙрд▓рдмреИрдХ рдФрд░ рдЕрдЧреНрд░реЗрд╖рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХрд╛ рдХреЛрдИ рдХреНрд░реЙрд╕-рдкрд░рд╛рдЧрдг рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдЕрдм рд╣рдо рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВред
1. рдЖрд╡реЗрджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╣рдореЗрдВ рд╕рд╛рдордиреЗ рд╕реНрдХреНрд░реАрди рдФрд░ рд░реВрдкреЛрдВ рдХреЗ рдПрдХ рдбрд┐рдЬрд╛рдЗрдирд░ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬреЛ рддрдм рдЬрд▓реНрджреА рд╕реЗ рдлреЗрд░рдмрджрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд╡реНрдпрд╛рдкрд╛рд░ рдХреА рдмрджрд▓рддреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдмрд╛рдж рдПрдХ рджреВрд╕рд░реЗ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред рдпрд╣ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдореЗрдВ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ: рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреГрдердХ рдШрдЯрдХреЛрдВ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдЬреЗрдЯ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреЗ рд╣реИрдВ (рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпреЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдПрд╕рдкреАрдП рд╣реИрдВ рдЬреЛ рд╕рд╛рдорд╛рдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдПрдХ рдирдП рд╡реНрдпрд╛рдкрд╛рд░ рдорд╛рдорд▓реЗ рдХреЗ рддрд╣рдд рд╣рд░ рдмрд╛рд░ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ)ред
рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЗрдирдореЗрдВ рд╕реЗ рдПрдХ рдЧреИрдЬреЗрдЯ рдХрд╛ рдЫреЛрдЯрд╛ рд╕рдВрд╕реНрдХрд░рдг рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЛрдб рдХреЛ рдвреЗрд░ рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рддреАрди рдЗрдирдкреБрдЯ рдлрд╝реАрд▓реНрдб рдФрд░ рдмрдЯрди рдХрд╛ рдПрдХ рд░реВрдк рджреЗрдВред
2. рдбреЗрдЯрд╛
Mobx рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдПрдХ рдврд╛рдВрдЪрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИред рдореИрдиреБрдЕрд▓ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рдбреЗрдЯрд╛ рдХреЛ рд╕реАрдзреЗ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рд╕рдВрдЧрдарди рдХреЗ рд╕рд╛рде рдЖрдирд╛ рдЪрд╛рд╣рд┐рдПред рд╡реИрд╕реЗ, рд╣рдо
Mobx 4 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рд╕рдВрд╕реНрдХрд░рдг 5 Sybmol рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рд╕рднреА рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред
рдЗрд╕рд▓рд┐рдП, рд╕рднреА рдбреЗрдЯрд╛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреЛ рдЖрд╡рдВрдЯрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рджреЛ рдлрд╝реЛрд▓реНрдбрд░реЛрдВ рдХреЗ рд╕реЗрдЯ рдкрд░ рд╣реИ:
-
рдШрдЯрдХ рдЬрд╣рд╛рдВ рд╣рдо рд╕рднреА рджреГрд╢реНрдп рдбрд╛рд▓рддреЗ рд╣реИрдВ
-
рд╕реНрдЯреЛрд░ , рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛, рд╕рд╛рде рд╣реА рдЙрдирдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рддрд░реНрдХ рднреА рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдШрдЯрдХ рдореЗрдВ рджреЛ рдлрд╛рдЗрд▓реЗрдВ рд╣реЛрддреА рд╣реИрдВ:
Input.js рдФрд░
InputStore.js ред рдкрд╣рд▓реА рдлрд╝рд╛рдЗрд▓ рдПрдХ рдмреЗрд╡рдХреВрдл рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рд╣реИ рдЬреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдЦреНрддреА рд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рджреВрд╕рд░рд╛ рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдбреЗрдЯрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд┐рдпрдо (
onClick ,
onChange , рдЖрджрд┐ ...)
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╕реАрдзреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдЬрд╛рдПрдВ, рд╣рдореЗрдВ рдПрдХ рдФрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдореБрджреНрджреЗ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
3. рдкреНрд░рдмрдВрдзрди
рдареАрдХ рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡реНрдпреВ-рд╕реНрдЯреЛрд░ рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡рд╛рдпрддреНрдд рдШрдЯрдХ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рдкреВрд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдПрдХ рд╕рд╛рде рдХреИрд╕реЗ рдорд┐рд▓рддреЗ рд╣реИрдВ? рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕
App.js рдХрд╛ рдореВрд▓ рдШрдЯрдХ рд╣реЛрдЧрд╛, рдФрд░ рдбреЗрдЯрд╛ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП, рдореБрдЦреНрдп рднрдВрдбрд╛рд░рдг
mainStore.js рд╣реИ ред рд╕рд┐рджреНрдзрд╛рдВрдд рд╕рд░рд▓ рд╣реИ: рдореЗрдирд╕реНрдЯреЛрд░ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдШрдЯрдХреЛрдВ рдХреЗ рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддрд╛ рд╣реИ (рдпрд╣ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред рдЕрдиреНрдп рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рджреБрдирд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ (рдареАрдХ рд╣реИ, рдПрдХ рдЕрдкрд╡рд╛рдж рд╣реЛрдЧрд╛ - рд╢рдмреНрджрдХреЛрд╢реЛрдВ)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ рдХрд┐ рд╣рдорд╛рд░рд╛ рдбреЗрдЯрд╛ рдХрд╣рд╛рдВ рдЬрд╛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдХрд╣рд╛рдВ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░рдирд╛ рд╣реИред
рдореЗрдирд╕реНрдЯреЙрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ рд░реВрдк рд╕реЗ, рдЕрдкрдиреЗ рд░рд╛рдЬреНрдп рдХреЗ рдмрджрд▓рддреЗ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдмрд╛рдХреА рдШрдЯрдХреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрдХреГрддрд┐ рдореЗрдВ,
рдХреНрд░рд┐рдпрд╛рдПрдБ рдФрд░
рд░рд╛рдЬреНрдп рдШрдЯрдХ рд╕реНрдЯреЛрд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░
рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдорд╛рди рдореЗрдирд╕реНрдЯреЙрд░ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

рдХреЛрдб рд▓рд┐рдЦрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдореБрдЦреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдлрд╝рд╛рдЗрд▓ index.js:
import React from "react"; import ReactDOM from "react-dom"; import {Provider} from "mobx-react"; import App from "./components/App"; import mainStore from "./stores/mainStore"; import optionsStore from "./stores/optionsStore";
рдпрд╣рд╛рдВ рдЖрдк Mobx рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред
рдкреНрд░рджрд╛рддрд╛ рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╣реАрдВ рднреА рдбреЗрдЯрд╛ (рд╕реНрдЯреЛрд░) рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рд╣рдо рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЖрд╡рд╢реНрдпрдХ рднрдВрдбрд╛рд░рдг рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдХреЗ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВред
рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
, mobx- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдореЙрдбреНрдпреВрд▓ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВред рдореБрдЦреНрдп рдирд┐рдпрдВрддреНрд░рдг рд╕реНрдЯреЛрд░
рдореЗрдирд╕реНрдЯреЛрд░ рдХреЗ рд▓рд┐рдП рд╢реБрд░реВ рд╕реЗ рд╣реА рдЕрдиреНрдп рд╕рднреА рдбреЗрдЯрд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╣реИ, рд╣рдо
рдореЗрдирд╕реНрдЯреЛрд░ рдХреЗ рднреАрддрд░ рдмрдЪреНрдЪреЗ рдХреЗ рд╕реНрдЯреЛрд░ рдХреЛ
рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВ :
рдЕрдм
App.js , рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рдХрдВрдХрд╛рд▓
import React from "react"; import {observer, inject} from "mobx-react"; import ButtonArea from "./ButtonArea"; import Email from "./Email"; import Fio from "./Fio"; import l10n from "../../../l10n/localization.js"; @inject("mainStore") @observer export default class App extends React.Component { constructor(props) { super(props); }; render() { const mainStore = this.props.mainStore; return ( <div className="container"> <Fio label={l10n.ru.profile.name} name={"name"} value={mainStore.userData.name} daData={true} /> <Fio label={l10n.ru.profile.surname} name={"surname"} value={mainStore.userData.surname} daData={true} /> <Email label={l10n.ru.profile.email} name={"email"} value={mainStore.userData.email} /> <ButtonArea /> </div> ); } }
рджреЛ рдФрд░ рдмреБрдирд┐рдпрд╛рджреА Mobx рдЕрд╡рдзрд╛рд░рдгрд╛рдПрдВ рд╣реИрдВ -
рдЗрдВрдЬреЗрдХреНрд╢рди рдФрд░
рдкреНрд░реЗрдХреНрд╖рдХ ред
рдЗрдВрдЬреЗрдХреНрд╢рди рдХреЗрд╡рд▓ рдЖрд╡реЗрджрди рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рд╕реНрдЯреЛрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо
рдЗрдВрдЬреЗрдХреНрд╢рди рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рддреЗ рд╣реИрдВ, рдХреЙрдорд╛ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдкреНрд▓рдЧ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╕реНрдЯреЛрд░ рд╢реБрд░реВ рдореЗрдВ
рдкреНрд░рджрд╛рддрд╛ рдореЗрдВ рд╕реВрдЪреАрдмрджреНрдз рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ .props.yourStoreName рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдШрдЯрдХ рдореЗрдВ рднрдВрдбрд╛рд░ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред
рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ - рдбреЗрдХреЛрд░реЗрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рдРрд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ Mobx рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдбреЗрдЯрд╛ рдмрджрд▓ рдЧрдпрд╛ рд╣реИ - рдШрдЯрдХ рдореЗрдВ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдИ рд╣реИ (рдЗрд╕реЗ рдиреАрдЪреЗ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛)ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреЛрдИ рд╡рд┐рд╢реЗрд╖ рд╕рджрд╕реНрдпрддрд╛ рдФрд░ рдХреЙрд▓рдмреИрдХ рдирд╣реАрдВ - Mobx рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ!
рд╣рдо
рдореЗрдирд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╛рдкрд╕ рдЖ
рдЬрд╛рдПрдВрдЧреЗ , рд▓реЗрдХрд┐рди рдЕрднреА рд╣рдо рд╕рднреА рдШрдЯрдХ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдирдХреЗ рддреАрди рдкреНрд░рдХрд╛рд░ рд╣реИрдВ -
рдлрд┐рдпреЛ ,
рдИрдореЗрд▓ ,
рдмрдЯрди ред рдкрд╣рд▓реЗ рдФрд░ рддреАрд╕рд░реЗ рдХреЛ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рд╣реЛрдиреЗ рджреЗрдВ, рдФрд░
рдИрдореЗрд▓ - рдХрд╕реНрдЯрдоред рдЪрд▓реЛ рдЙрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
рдкреНрд░рджрд░реНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рдЧреВрдВрдЧрд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХ рд╣реИ:
Email.js import React from "react"; import {inject, observer} from 'mobx-react'; @inject("EmailStore") @observer export default class Email extends React.Component { constructor(props) { super(props); }; componentDidMount = () => { this.props.EmailStore.validate(this.props.name); }; componentWillUnmount = () => { this.props.EmailStore.unmount(this.props.name); }; render() { const name = this.props.name; const EmailStore = this.props.EmailStore; const params = EmailStore.params; let status = "form-group email "; if (params.isCorrect && params.onceValidated) status += "valid"; if (params.isWrong && params.onceValidated) status += "error"; return ( <div className={status}> <label htmlFor={name}>{this.props.label}</label> <input type="email" disabled={this.props.disabled} name={name} id={name} value={params.value} onChange={(e) => EmailStore.bindData(e, name)} /> </div> ); } }
рд╣рдо рд╕рддреНрдпрд╛рдкрди рдХреЗ рдмрд╛рд╣рд░реА рдШрдЯрдХ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдФрд░ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рддрддреНрд╡ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдРрд╕рд╛ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕реНрдЯреЛрд░ рд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдШрдЯрдХрдбрд╛рдЙрди рдореЗрдВ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╣реА:
EmailStore.js import {action, observable} from 'mobx'; import reactTriggerChange from "react-trigger-change"; import Validators from "../../../helpers/Validators"; import { getTarget } from "../../../helpers/elementaries"; export default class EmailStore { @observable params = { value : "", disabled : null, isCorrect : null, isWrong : null, onceValidated : null, prevalidated : null } @action bindData = (e, name) => { this.params.value = getTarget(e).value; }; @action validate = (name) => { const callbacks = { success : (formatedValue) => { this.params.value = formatedValue; this.params.isCorrect = true; this.params.isWrong = false; this.params.onceValidated = true; }, fail : (formatedValue) => { this.params.value = formatedValue; this.params.isCorrect = false; this.params.isWrong = true; } }; const options = { type : "email" }; const element = document.getElementById(name); new Validators(element, options, callbacks).init();
рдпрд╣ рджреЛ рдирдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдЕрд╡рд▓реЛрдХрдиреАрдп - рдПрдХ рд╡рд╕реНрддреБ, рдЬрд┐рд╕рдХреЗ рдЦреЗрддреЛрдВ рдХрд╛ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди Mobx рджреНрд╡рд╛рд░рд╛ рдореЙрдирд┐рдЯрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░
рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреЛ рд╕рдВрдХреЗрдд рднреЗрдЬрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдпрд╛ рд╣реИ)ред
рдХрд╛рд░реНрд░рд╡рд╛рдИ - рдЗрд╕ рдбреЗрдХреЛрд░реЗрдЯрд░ рдХреЛ рдХрд┐рд╕реА рднреА рд╣реИрдВрдбрд▓рд░ рдХреЛ рд▓рдкреЗрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдЖрд╡реЗрджрди рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИ рдФрд░ / рдпрд╛ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдкреИрджрд╛ рдХрд░рддрд╛ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо
@observable params рдореЗрдВ рдореВрд▓реНрдп рдХреЗ
рдореВрд▓реНрдп рдХреЛ
рдмрджрд▓рддреЗ рд╣реИрдВ ред
рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░рд╛ рд╕рд░рд▓ рдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИ! рд╡рд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реЗ рд░рд┐рдХреЙрд░реНрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрд╛рдж рдореЗрдВ рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐
рдореЗрдирд╕реНрдЯреЛрд░ рд╕реЗрдВрдЯреНрд░рд▓ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдм рдХрд░рддреА рд╣реИред
рдЕрдм рдПрдХ рд╕рд╛рдорд╛рдиреНрдп
рдлрд┐рдпреЛ рдШрдЯрдХред рдкрд┐рдЫрд▓реЗ рдПрдХ рд╕реЗ рдЗрд╕рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо рдПрдХ рдЖрд╡реЗрджрди рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХрд╛ рдЕрд╕реАрдорд┐рдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдШрдЯрдХ рд╕реНрдЯреЛрд░ рдкрд░ рдХреБрдЫ рдЕрддрд┐рд░рд┐рдХреНрдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рдЧрд╛рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдКрдкрд░, рд╣рдо рдЙрддреНрдХреГрд╖реНрдЯ
DaData рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдЗрдирдкреБрдЯ рд╡рд░реНрдгреЛрдВ рдкрд░ рдЕрдзрд┐рдХ рд╕рдВрдХреЗрдд рджреЗрдВрдЧреЗред рджрд┐рдЦрд╛ рд░рд╣реЗ рд╣реИрдВ:
Fio.js import React from "react"; import {inject, observer} from 'mobx-react'; import {get} from 'mobx'; @inject("FioStore") @observer export default class Fio extends React.Component { constructor(props) { super(props); }; componentDidMount = () => { this.props.FioStore.registration(this.props); }; componentWillUnmount = () => { this.props.FioStore.unmount(this.props.name); }; render() { const FioStore = this.props.FioStore; const name = this.props.name; const item = get(FioStore.items, name); if (item && item.isCorrect && item.onceValidated && !item.prevalidated) status = "valid"; if (item && item.isWrong && item.onceValidated) status = "error";
рдпрд╣рд╛рдВ рдХреБрдЫ рдирдпрд╛ рд╣реИ: рд╣рдо рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди
рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ :
get(FioStore.items, name)
рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдШрдЯрдХ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЕрд╕реАрдорд┐рдд рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░ рдПрдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдкрдВрдЬреАрдХрд░рдг рдХреЗ рджреМрд░рд╛рди, рд╣рдо
рдорд╛рдирдЪрд┐рддреНрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рджрд░реНрдЬ рдХрд░рддреЗ рд╣реИрдВ:
FioStore.js import {action, autorun, observable, get, set} from 'mobx'; import reactTriggerChange from "react-trigger-change"; import Validators from "../../../helpers/Validators"; import { getDaData, blockValidate } from "../../../helpers/functions"; import { getAttrValue, scrollToElement, getTarget } from "../../../helpers/elementaries"; export default class FioStore { constructor() { autorun(() => { const self = this; $("body").click((e) => { if (e.target.className !== "suggestion-item" && e.target.className !== "suggestion-text") { const items = self.items.entries(); for (var [key, value] of items) { value.suggestions = []; } } }); }) } @observable items = new Map([]); @action registration = (params) => { const nameExists = get(this.items, params.name); if (!blockValidate({params, nameExists, type: "Fio"})) return false;
рд╣рдорд╛рд░реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
@observable items = new Map([]);
рдПрдХ рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЕрдкрдиреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп "рдЯреИрдк" рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдЬрдм рдирдП рдШрдЯрдХ рдкреГрд╖реНрда рдкрд░ рдЬреЛрдбрд╝реЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рджрд╛рддрд╛ рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣рдо рдЕрд▓рдЧ рд╕реЗ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВред
рдмрдЯрди рдШрдЯрдХ рд╕рдорд╛рди рджрд┐рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕реБрдЭрд╛рд╡ рдирд╣реАрдВ рд╣реИрдВ:
Button.js import React from "react"; import {inject, observer} from 'mobx-react'; @inject("ButtonStore") @observer export default class CustomButton extends React.Component { constructor(props) { super(props); }; componentDidMount = () => { this.props.ButtonStore.registration(this.props); }; componentWillUnmount = () => { this.props.ButtonStore.unmount(this.props.name); }; render() { const name = this.props.name; return ( <div className="form-group button"> <button disabled={this.props.disabled} onClick={(e) => this.props.ButtonStore.bindClick(e, name)} name={name} id={name} >{this.props.text}</button> </div> ); } }
ButtonStore.js import {action, observable, get, set} from 'mobx'; import {blockValidate} from "../../../helpers/functions"; export default class ButtonStore { constructor() {} @observable items = new Map([]) @action registration = (params) => { const nameExists = get(this.items, params.name); if (!blockValidate({params, nameExists, type: "Button"})) return false;
рдмрдЯрди рдХрд╛ рдШрдЯрдХ
рдмрдЯрдирдЖрдпрд░ рдХреЗ рдПрдЪрдУрд╕реА рдШрдЯрдХ рджреНрд╡рд╛рд░рд╛ рд▓рдкреЗрдЯрд╛ рдЧрдпрд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреБрд░рд╛рдиреЗ рдШрдЯрдХ рдореЗрдВ рд╕реНрдЯреЛрд░ рдХрд╛ рдЕрдкрдирд╛ рд╕реЗрдЯ рдФрд░ рд╕рдмрд╕реЗ рдЫреЛрдЯрд╛ рдПрдХ рд╢рд╛рдорд┐рд▓ рд╣реИред рдиреЗрд╕реНрдЯреЗрдб рдШрдЯрдХреЛрдВ рдХреА рд╢реНрд░реГрдВрдЦрд▓рд╛рдУрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЛ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдШрдЯрдХ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣рд░ рдЪреАрдЬ рдХреЛ рд╕реАрдзреЗ рдЗрд╕рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
ButtonArea.js import React from "react"; import {inject, observer} from 'mobx-react'; import l10n from "../../../l10n/localization.js"; import Button from "./Button"; @inject("mainStore", "optionsStore") @observer export default class ButtonArea extends React.Component { constructor(props) { super(props); }; render() { return ( <div className="button-container"> <p>{this.props.optionsStore.dict.buttonsHeading}</p> <Button name={"send_data"} disabled={this.props.mainStore.buttons.sendData.disabled ? true : false} text={l10n.ru.common.continue} /> </div> ); } }
рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рднреА рдШрдЯрдХ рддреИрдпрд╛рд░ рд╣реИрдВред рдорд╛рдорд▓рд╛
рдореЗрдирд╕реНрдЯреЛрд░ рдХреЗ рдореИрдиреЗрдЬрд░ рдкрд░ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ
ред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╕рднреА рднрдВрдбрд╛рд░рдг рдХреЛрдб:
mainStore.js import {observable, computed, autorun, reaction, get, action} from 'mobx'; import optionsStore from "./optionsStore"; import ButtonStore from "./ButtonStore"; import FioStore from "./FioStore"; import EmailStore from "./EmailStore"; import { fetchOrdinary, sendStats } from "../../../helpers/functions"; import l10n from "../../../l10n/localization.js"; class mainStore { constructor() { this.ButtonStore = new ButtonStore(); this.FioStore = new FioStore(); this.EmailStore = new EmailStore(); autorun(() => { this.fillBlocks(); this.fillData(); }); reaction( () => this.dataInput, (result) => { let isIncorrect = false; for (let i in result) { for (let j in result[i]) { const res = result[i][j]; if (!res.isCorrect) isIncorrect = true; this.userData[j] = res.value; } }; if (!isIncorrect) { this.buttons.sendData.disabled = false } else { this.buttons.sendData.disabled = true }; } ); reaction( () => this.sendDataButton, (result) => { if (result) { if (result.isClicked) { get(this.ButtonStore.items, "send_data").isClicked = false; const authRequestSuccess = () => { console.log("request is success!") }; const authRequestFail = () => { console.log("request is fail!") }; const request = { method : "send_userdata", params : { name : this.userData.name, surname : this.userData.surname, email : this.userData.email } }; console.log("Request body is:"); console.log(request); fetchOrdinary( optionsStore.OPTIONS.sendIdentUrl, JSON.stringify(request), { success: authRequestSuccess, fail: authRequestFail } ); } } } ); } @observable userData = { name : "", surname : "", email : "" }; @observable buttons = { sendData : { disabled : true } }; componentsMap = { userData : [ ["name", "fio"], ["surname", "fio"], ["email", "email"], ["send_data", "button"] ] }; @observable listenerBlocks = {}; @action fillBlocks = () => { for (let i in this.componentsMap) { const pageBlock = this.componentsMap[i];
рдХреБрдЫ рдФрд░ рдкреНрд░рдореБрдЦ рдЗрдХрд╛рдЗрдпрд╛рдБред
рдЧрдгрдирд╛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдЬреНрдЬрд╛рдХрд╛рд░ рд╣реИ рдЬреЛ рд╣рдорд╛рд░реЗ
рдЕрд╡рд▓реЛрдХрди рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИред Mobx рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдпрд╣ рдХреЗрд╡рд▓ рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдкред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдФрд░, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ, рд╡рд╛рдпрд░рд▓ рдбреЛрдо рдХрд╛ рдкреБрдирд░реНрд╡рд┐рддрд░рдг рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдиреЗ рдкрд░ рд╣реА рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ - рдПрдХ рдмрджрд▓реЗ рд╣реБрдП рд░рд╛рдЬреНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рджреБрд╖реНрдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рдЖрдпреЛрдЬрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдгред рдпрд╣ рджреЛ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ: рдкрд╣рд▓рд╛ рдЧрдгрдирд╛ рдХреА рдЧрдИ, рдкрд░рд┐рдХрд▓рд┐рдд рд╕реНрдерд┐рддрд┐ рдХреЛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ рдЙрди рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЗ рд╕рд╛рде рдЬреЛ рд░рд╛рдЬреНрдп рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЛ рдмрд╛рд░ рд▓рд╛рдЧреВ
рд╣реЛрддреА рд╣реИред рдкрд╣рд▓реЗ рдореЗрдВ, рд╣рдо рдЦреЗрддреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ рдФрд░ рдпрд╣ рдирд┐рд╖реНрдХрд░реНрд╖ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдкреВрд░рд╛ рдлреЙрд░реНрдо рд╕рд╣реА рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реАрд▓реНрдб рдХрд╛ рдорд╛рди рднреА рд░рд┐рдХреЙрд░реНрдб рдХрд░реЗрдВред рджреВрд╕рд░реЗ рдореЗрдВ, рд╣рдо рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдпрджрд┐ рдХреЛрдИ рд╕рдВрдХреЗрдд "рдмрдЯрди рджрдмрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ"), рд╣рдо рд╕рд░реНрд╡рд░ рдХреЛ рдбреЗрдЯрд╛ рднреЗрдЬрддреЗ рд╣реИрдВред рдбреЗрдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЪреВрдВрдХрд┐
рдореЗрдирд╕реНрдЯреЛрд░ рд╕рднреА рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреЛ рдЬрд╛рдирддрд╛ рд╣реИ, рдПрдХ рдмрдЯрди рдХреЗ рдХреНрд▓рд┐рдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рд╣рдо рдзреНрд╡рдЬ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╢реИрд▓реА рдореЗрдВ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
get(this.ButtonStore.items, "send_data").isClicked = false;
рдЖрдк рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ "рдЕрдирд┐рд╡рд╛рд░реНрдп" рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХрд┐рддрдиреА рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рдпрдВрддреНрд░рдг рдХреЗрд╡рд▓ рдПрдХ рджрд┐рд╢рд╛ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ -
рдореЗрдирд╕реНрдЯреЛрд░ рд╕реЗ
рдмрдЯрдирд╕реНрдЯреЛрд░ рддрдХ ред
рдСрдЯреЛрд░рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рдХреБрдЫ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рд╕реАрдзреЗ рдЪрд▓рд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рди рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд░реВрдк рдореЗрдВред рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдПрдХ рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рд╢рдмреНрджрдХреЛрд╢ рд╕реЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдкреНрд░рдкрддреНрд░ рдлрд╝реАрд▓реНрдб рдХреЛ рдкреНрд░реАрдлрд╝рд┐рд▓рд┐рдВрдЧ рдХрд░рддреЗ рд╣реБрдПред
рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдШрдЯрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╣реИрдВред рдЧрдгрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
mainStore рдХреЗрд╡рд▓ рдЙрди
рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓ рдЧрдП рд╣реИрдВред рдЕрд▓рдЧ-рдЕрд▓рдЧ
рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
, рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░,
рд╣рдо рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рднреА рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ AJAX рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ)ред
Obsevables рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрд╣рд╛рдБ рдФрд░ рдХреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдоред
рдЖрдк рдЙрджрд╛рд╣рд░рдг рдФрд░ рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ
рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд▓рд┐рдВрдХ:
github.com/botyaslonim/mobx-habrрдлрд┐рд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣:
npm i ,
npm рд╕реНрдерд╛рдиреАрдп рдЪрд▓рд╛рддреЗ рд╣реИрдВ ред
рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ,
index.html рдлрд╝рд╛рдЗрд▓ред рджрд╛рддрд╛ рд╕рдВрдХреЗрдд рдореЗрд░реЗ рдореБрдлреНрдд рдЦрд╛рддреЗ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╡реЗ рд╢рд╛рдпрдж рд╣рдмреНрд░ рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЧрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВред
рдореБрдЭреЗ
Mobx рдкрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдкрд░ рдХрд┐рд╕реА рднреА рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреА
!рдЕрдВрдд рдореЗрдВ, рдореИрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдиреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдЫреЛрдЯреЗ рдФрд░ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдШрдЯрдХреЛрдВ рдФрд░ рдХреЙрд▓рдмреИрдХ рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рднреВрд▓ рдЬрд╛рдиреЗ рдФрд░ рд╡реНрдпрд╛рдкрд╛рд░ рддрд░реНрдХ рдкрд░ рд╕реАрдзреЗ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╣реБрдд рд╣реА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЙрдкрдХрд░рдг рд╣реЛрдЧрд╛ред