рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ + Mobx: рдХреНрдпрд╛ рдмрд╛рдд рд╣реИ?

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

рдЫрд╡рд┐

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

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

рд╣рдорд╛рд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ, рдХрдИ рд╡рд┐рдЬреЗрдЯ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рддрд╛ рд╣реИ, рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рде рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдирд┐рдпрдо рдХреЗ рд░реВрдк рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рдХрдИ рд╕реНрдХреНрд░реАрди рд╣реИрдВред рдПрдХ рдмрд╛рд░, рдпрд╣ рд╕рдм рдЕрдЪреНрдЫреЗ рдкреБрд░рд╛рдиреЗ 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"; //  IE11 require("es6-object-assign").polyfill(); require( "./static/less/main.less"); const stores = { mainStore, optionsStore, ButtonStore : mainStore.ButtonStore, FioStore : mainStore.FioStore, EmailStore : mainStore.EmailStore }; ReactDOM.render(( <Provider {...stores}> <App /> </Provider> ), document.getElementById('reactContainer')); 

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

 // mainStore.js import optionsStore from "./optionsStore"; import ButtonStore from "./ButtonStore"; import FioStore from "./FioStore"; import EmailStore from "./EmailStore"; .... class mainStore { constructor() { /** *    */ this.ButtonStore = new ButtonStore(); this.FioStore = new FioStore(); this.EmailStore = new EmailStore(); ... 


рдЕрдм 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(); //    reactTriggerChange(element); this.params.prevalidated = true; }; } 


рдпрд╣ рджреЛ рдирдИ рд╕рдВрд╕реНрдерд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИред

рдЕрд╡рд▓реЛрдХрдиреАрдп - рдПрдХ рд╡рд╕реНрддреБ, рдЬрд┐рд╕рдХреЗ рдЦреЗрддреЛрдВ рдХрд╛ рдХреЛрдИ рднреА рдкрд░рд┐рд╡рд░реНрддрди 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() { /** *       *  DaData: * data.surname -  * data.name -  * https://dadata.ru/api/suggest/name */ 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"; //    store let value = this.props.value; if (item) value = item.value; return ( <div className="form-group fio"> <label htlmfor={name}>{this.props.label}</label> <input type="text" disabled={this.props.disabled} name={name} id={name} value={value} onChange={(e) => FioStore.bindData(e, name)} /> {(item && item.suggestions && item.suggestions.length > 0) && <div className="hint-container" id={"hint-container-" + item.id}>{item.suggestions.map((suggestion, i) => { return ( <div className={"suggestion-item fs-" + i} key={i} value={suggestion.data[name]} onClick={(e) => FioStore.setSuggestion(e, name)}> <span className="suggestion-text">{suggestion.data[name]}</span> </div>) })}</div>} </div> ); } } 

рдпрд╣рд╛рдВ рдХреБрдЫ рдирдпрд╛ рд╣реИ: рд╣рдо рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реАрдзреЗ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ :
 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(() => { /** *        .         setSuggestion() */ 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 = []; } } }); }) } /** *   items       Fio    */ @observable items = new Map([]); /** *    */ @action registration = (params) => { const nameExists = get(this.items, params.name); if (!blockValidate({params, nameExists, type: "Fio"})) return false; //  items   const value = { value : params.value, disabled : params.disabled, isCorrect : null, isWrong : null, suggestions : [], daData : params.daData, startValidation : true, //      onceValidated : false, //      prevalidated : false }; set(this.items, params.name, value); this.validate(params.name); }; /** *    */ @action unmount = (name) => { this.items.delete(name); }; /** *    *    */ @action bindData = (e, name) => { const value = getTarget(e).value; const item = get(this.items, name); /** *     DaData */ if (item.daData && !item.startValidation) { getDaData({value, type: "fio", name}) .then((result) => { item.suggestions = result.suggestions; }) .catch((error) => {console.log(error)}) } else { item.startValidation = false; item.value = value; } }; /** *   */ @action setSuggestion = (e, name) => { if (e) e.preventDefault(); get(this.items, name).value = getAttrValue(e); //     get(this.items, name).suggestions = []; get(this.items, name).isCorrect = true; get(this.items, name).isWrong = false; }; /** *   */ @action validate = (name) => { const callbacks = { success : (formatedValue) => { get(this.items, name).value = formatedValue; get(this.items, name).isCorrect = true; get(this.items, name).isWrong = false; get(this.items, name).onceValidated = true; }, fail : (formatedValue) => { get(this.items, name).value = formatedValue; get(this.items, name).isCorrect = false; get(this.items, name).isWrong = true; } }; const options = { type : "fio" }; const element = document.getElementById(name); new Validators(element, options, callbacks).init(); //    reactTriggerChange(element); get(this.items, name).prevalidated = true; }; } 

рд╣рдорд╛рд░реЗ рдЬреЗрдиреЗрд░рд┐рдХ рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:

 @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() {} /** *   items       Button    */ @observable items = new Map([]) /** *    */ @action registration = (params) => { const nameExists = get(this.items, params.name); if (!blockValidate({params, nameExists, type: "Button"})) return false; //  items   const value = { disabled : params.disabled, isClicked : false }; set(this.items, params.name, value); }; /** *    */ @action unmount = (name) => { this.items.delete(name); }; /** *    */ @action bindClick = (e, name) => { e.preventDefault(); get(this.items, name).isClicked = true; }; } 


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

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 } }; /** *     * @key -   * @value -      (name, type),          */ componentsMap = { userData : [ ["name", "fio"], ["surname", "fio"], ["email", "email"], ["send_data", "button"] ] }; /** *     listener'  stores */ @observable listenerBlocks = {}; /** *    */ @action fillBlocks = () => { for (let i in this.componentsMap) { const pageBlock = this.componentsMap[i]; //      (key)     (value) const blocks = {}; pageBlock.forEach((item, i) => { const _name = item[0]; const _type = item[1]; if (!blocks[_type]) { blocks[_type] = [_name] } else { blocks[_type].push(_name) } }) this.listenerBlocks[i] = blocks; } }; /** *    */ @action fillData = () => { if (optionsStore.preset) { // ,   undefined,     if (optionsStore.preset.name) this.userData.name = optionsStore.preset.name; if (optionsStore.preset.surname) this.userData.surname = optionsStore.preset.surname; } }; /** * Listener    */ @computed get dataInput() { const mappedResult = { fio : {}, email : { email : {} } }; if (this.FioStore && this.FioStore.items) { this.listenerBlocks.userData.fio.forEach((item) => { const i = get(this.FioStore.items, item); if (i) { mappedResult.fio[item] = { isCorrect : i.isCorrect, value : i.value } } }) } if (this.EmailStore && this.EmailStore.params) { mappedResult.email.email = { isCorrect : this.EmailStore.params.isCorrect, prevalidated : this.EmailStore.params.prevalidated, value : this.EmailStore.params.value } } return mappedResult } /** * Listener     */ @computed get sendDataButton() { let result = {}; const i = get(this.ButtonStore.items, "send_data"); if (i) { result = { isClicked : i.isClicked } } return result } } export default new mainStore(); 


рдХреБрдЫ рдФрд░ рдкреНрд░рдореБрдЦ рдЗрдХрд╛рдЗрдпрд╛рдБред

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

 get(this.ButtonStore.items, "send_data").isClicked = false; 

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

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рдХреНрд░рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИред рдШрдЯрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдирдХреА рд╕реНрдерд┐рддрд┐ рдмрджрд▓рддреЗ рд╣реИрдВред рдЧрдгрдирд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ mainStore рдХреЗрд╡рд▓ рдЙрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдмрджрд▓ рдЧрдП рд╣реИрдВред рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЧрдгрдирд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░рд╛рдЬреНрдпреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡реЛрдВ рдХреА рддрд▓рд╛рд╢ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ , рдЧрдгрдирд╛ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рд╡реЗрдзрд╢рд╛рд▓рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХреНрд░рд┐рдпрд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рднреА рдХрд░рддреЗ рд╣реИрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ AJAX рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ)ред Obsevables рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ, рдЬреЛ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдлрд┐рд░ рд╕реЗ рддреИрдпрд╛рд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХрд╣рд╛рдБ рдФрд░ рдХреНрдпрд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдкреНрд░рддреНрдпрдХреНрд╖ рдбреЗрдЯрд╛ рд╕реНрдЯреНрд░реАрдоред

рдЖрдк рдЙрджрд╛рд╣рд░рдг рдФрд░ рдХреЛрдб рдХреЛ рд╕реНрд╡рдпрдВ рдЖрдЬрд╝рдорд╛ рд╕рдХрддреЗ рд╣реИрдВ ред рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд▓рд┐рдВрдХ: github.com/botyaslonim/mobx-habr
рдлрд┐рд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣: npm i , npm рд╕реНрдерд╛рдиреАрдп рдЪрд▓рд╛рддреЗ рд╣реИрдВ ред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ, index.html рдлрд╝рд╛рдЗрд▓ред рджрд╛рддрд╛ рд╕рдВрдХреЗрдд рдореЗрд░реЗ рдореБрдлреНрдд рдЦрд╛рддреЗ рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП, рд╡реЗ рд╢рд╛рдпрдж рд╣рдмреНрд░ рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░рдг рдХреБрдЫ рдмрд┐рдВрджреБрдУрдВ рдкрд░ рдЧрд┐рд░ рд╕рдХрддреЗ рд╣реИрдВред

рдореБрдЭреЗ Mobx рдкрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рдХрд╛рдо рдкрд░ рдХрд┐рд╕реА рднреА рд░рдЪрдирд╛рддреНрдордХ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдФрд░ рд╕реБрдЭрд╛рд╡реЛрдВ рдкрд░ рдЦреБрд╢реА рд╣реЛрдЧреА !

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

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


All Articles