Mrr рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ (рдореИрдВ рдХрд╛рд▓реНрдкрдирд┐рдХ рдЯреЙрдЯреЛрд▓реЙрдЬреА рдХреЗ рд▓рд┐рдП рдорд╛рдлреА рдЪрд╛рд╣рддрд╛ рд╣реВрдВ)ред
рд╢рдмреНрдж "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛" рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╕рдВрджрд░реНрдн FRP рдХреЗ рд░реВрдк рдореЗрдВ
Rx.js рдХреЛ
рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддрд╛ рд╣реИ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рд╣рд╛рд▓ рдХреЗ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рд╣реИрдмреЗ (
[1] ,
[2] ,
[3] ) рдиреЗ рдЖрд░рдПрдХреНрд╕ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдмреЛрдЭрд┐рд▓рддрд╛ рджрд┐рдЦрд╛рдИ, рдЬреЛ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдФрд░ рд╕рд░рд▓рддрд╛ рдореЗрдВ рд▓рдЧрднрдЧ рдХрд┐рд╕реА рдЕрдиреНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕реЗ рд╣рд╛рд░ рдЧрдПред рдЖрд░рдПрдХреНрд╕ рдмрдбрд╝реА рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рдФрд░ рдЙрди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рдЕрдореВрд░реНрдд рдЦреБрдж рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ (рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рд╕рдордиреНрд╡рдп рд╣реИ)ред рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рдЖрдк рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Rx рдкрд░ рдПрдХ рд╕рд░рд▓ рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд░реВрдк рд╕рддреНрдпрд╛рдкрди? рдХреНрдпрд╛ рд╡рд╣ рд╕рд╛рдорд╛рдиреНрдп рдЕрдирд┐рд╡рд╛рд░реНрдпрддрд╛ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрдкрдХреЗ рд╕рдордп рдХреА рдмрдЪрдд рдХрд░реЗрдЧрд╛?
mrr рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рд╣реИ рдХрд┐ рдПрдлрдЖрд░рдПрдл рди рдХреЗрд╡рд▓ рд╡рд┐рд╢рд┐рд╖реНрдЯ "рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ" рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рдПрдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╕рдорд╛рдзрд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рд╕рдмрд╕реЗ рдЖрдо рд░реВрдЯреАрди рдлреНрд░рдВрдЯ-рдПрдВрдб рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЕрдореВрд░реНрддрддрд╛ рд╣реИ, рдлрд┐рд▓рд╣рд╛рд▓ рдЗрд╕ рджреГрд╢реНрдп рдкрд░ рджреЛ рддрд░реАрдХреЛрдВ рд╕реЗ рдореМрдЬреВрдж рд╣реИ:
- рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдЪрд░ (рдЧрдгрдирд╛ рдХрд┐рдП рдЧрдП рдЪрд░): рд╕рд░рд▓, рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп, рд╕рд╣рдЬ рдЬреНрдЮрд╛рди рдпреБрдХреНрдд, рд▓реЗрдХрд┐рди рдЖрд░рдкреА рдХреА рдХреНрд╖рдорддрд╛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреНрд░рдХрдЯ рд╕реЗ рджреВрд░ рд╣реИ
- рдЖрд░рдПрдХреНрд╕, рдмреЗрдХрди, рдЖрджрд┐ рдЬреИрд╕реЗ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреБрд╕реНрддрдХрд╛рд▓рдп: рд╢рдХреНрддрд┐рд╢рд╛рд▓реА, рдмрд▓реНрдХрд┐ рдЬрдЯрд┐рд▓, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреА рдЧреБрдВрдЬрд╛рдЗрд╢ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рддрдХ рд╕реАрдорд┐рдд рд╣реИред
Mrr рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддреА рд╣реИред Rx.js рдХреЗ рд╡рд┐рдкрд░реАрдд, mrr рдореЗрдВ рдПрдХ рдЫреЛрдЯрд╛ рдПрдкреАрдЖрдИ рд╣реИ, рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрдзрди рдХреЗ рд╕рд╛рде рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИред рджрд░реНрдЬрдиреЛрдВ рддрд░реАрдХреЛрдВ рдФрд░ рд╕рдВрдЪрд╛рд▓рдХреЛрдВ рдХреЗ рдмрдЬрд╛рдп - рдЪрд╛рд░ рдмреБрдирд┐рдпрд╛рджреА рдСрдкрд░реЗрдЯрд░реЛрдВ, рд╡реЗрдзрд╢рд╛рд▓рд╛ (рдЧрд░реНрдо рдФрд░ рдардВрдбреЗ), рд╡рд┐рд╖рдп, рдЖрджрд┐ рдХреЗ рдмрдЬрд╛рдпред - рдПрдХ рдЕрдореВрд░реНрдд: рдзрд╛рд░рд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, mrr рдореЗрдВ рдХреБрдЫ рдЬрдЯрд┐рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИ рдЬреЛ рдХреЛрдб рдХреА рдкрдардиреАрдпрддрд╛ рдХреЛ рдХрд╛рдлреА рдЬрдЯрд┐рд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрдЯрд╛рд╕реНрдЯреНрд░реАрдоред
рд╣рд╛рд▓рд╛рдВрдХрд┐, mrr рдПрдХ рдирдП рддрд░реАрдХреЗ рд╕реЗ "рд╕рд░рд▓реАрдХреГрдд Rx" рдирд╣реАрдВ рд╣реИред Rx рдХреЗ рд╕рдорд╛рди рдореВрд▓ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, mrr рдПрдХ рдмрдбрд╝рд╛ рдЖрд▓рд╛ рд╣реЛрдиреЗ рдХрд╛ рджрд╛рд╡рд╛ рдХрд░рддрд╛ рд╣реИ: рд╡реИрд╢реНрд╡рд┐рдХ рдФрд░ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдмрдВрдзрди (рдШрдЯрдХ рд╕реНрддрд░ рдкрд░) рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реНрдерд┐рддрд┐ред рдпрджреНрдпрдкрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдХреА рдореВрд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдерд╛, mrr рдиреЗ рд╕рд╛рдзрд╛рд░рдг, рддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ "рдХреБрд▓ рдПрдлрдЖрд░рдкреА" рдХрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд рд╣реИред
рдЕрдХреНрд╕рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрд░ рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдШрдЯрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рдкреБрди: рдкреНрд░рд╕реНрддрд╛рд╡ (рдпрд╛ рдЬрд▓реНрдж рд╣реА - рд╣реБрдХ), рд╡реИрд╢реНрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП Redux / mobx, рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП Redux-observable (рдпрд╛ рдердВрдХ / рдЧрд╛рдерд╛) рдХреЗ рд╕рд╛рде Rx рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╕рдордиреНрд╡рдпред рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдХрд╛рд░реНрдпред рдПрдХ рд╣реА рдЖрд╡реЗрджрди рдХреЗ рднреАрддрд░ рд╡рд┐рднрд┐рдиреНрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдФрд░ рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХрд┐рдпреЛрдВ рдХреЗ рдРрд╕реЗ "рд╕рд▓рд╛рдж" рдХреЗ рдмрдЬрд╛рдп, рд╢реНрд░реА рдХреЗ рд╕рд╛рде рдЖрдк рдПрдХ рд╣реА рддрдХрдиреАрдХ рдФрд░ рдкреНрд░рддрд┐рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
Mrr рдЗрдВрдЯрд░рдлрд╝реЗрд╕ Rx рдФрд░ рд╕рдорд╛рди рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рд╕реЗ рднреА рдХрд╛рдлреА рдЕрд▓рдЧ рд╣реИ - рдпрд╣ рдЕрдзрд┐рдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдЕрдореВрд░реНрддрддрд╛ рдФрд░ рдШреЛрд╖рдгрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, mrr рдЖрдкрдХреЛ рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
mrr рдкрд░
рдорд╛рдирдХ TodoMVC рдХреЛрдб рдХреА 50 рдкрдВрдХреНрддрд┐рдпреЛрдВ (JSX рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреА рдЧрд┐рдирддреА рдирд╣реАрдВ) рд╕реЗ рдХрдо рд▓реЗрддрд╛ рд╣реИред
рд▓реЗрдХрд┐рди рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдЬреНрдЮрд╛рдкрдиред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдПрдХ рдмреЛрддрд▓ рдореЗрдВ "рдкреНрд░рдХрд╛рд╢" рдФрд░ "рднрд╛рд░реА" рдЖрд░рдкреА рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд┐рдпрд╛ рдерд╛ - рдЖрдкрдХреЛ рдиреНрдпрд╛рдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдХреГрдкрдпрд╛ рдХреЛрдб рдЙрджрд╛рд╣рд░рдг рдкрдврд╝реЗрдВред
рдЯреЛрдбреЛрдПрдорд╡реАрд╕реА рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмрд╣реБрдд рдЦрд░рд╛рдм рд╣реИ, рдФрд░ рдЧрд┐рддреБрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдЗрд╕ рдкрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЖрджрд┐рдо рд╣реИред рд╣рдо mrr рдХреЛ рдЯреНрд░реЗрди рдЯрд┐рдХрдЯ рдЦрд░реАрджрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╢рд░реНрдд рдЖрд╡реЗрджрди рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдиреЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ рдпреВрдЖрдИ рдореЗрдВ рд╢реБрд░реБрдЖрддреА рдФрд░ рд╕рдорд╛рдкреНрддрд┐ рд╕реНрдЯреЗрд╢рдиреЛрдВ, рддрд┐рдерд┐рдпреЛрдВ рдХреЛ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рдХреНрд╖реЗрддреНрд░ рд╣реЛрдВрдЧреЗред рдлрд┐рд░, рдбреЗрдЯрд╛ рднреЗрдЬрдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрд▓рдмреНрдз рдЯреНрд░реЗрдиреЛрдВ рдХреА рд╕реВрдЪреА рдФрд░ рдЙрдирдореЗрдВ рдореМрдЬреВрдж рд╕реНрдерд╛рдиреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЯреНрд░реЗрди рдФрд░ рдХрд╛рд░ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛рддреНрд░реА рдбреЗрдЯрд╛ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░реЗрдЧрд╛, рдФрд░ рдлрд┐рд░ рдЯреЛрдХрд░реА рдореЗрдВ рдЯрд┐рдХрдЯ рдЬреЛрдбрд╝ рджреЗрдЧрд╛ред рдЪрд▓реЛ рдЪрд▓рддреЗ рд╣реИрдВред
рд╣рдореЗрдВ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдФрд░ рддрд╛рд░реАрдЦреЛрдВ рдХреЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдПрдХ рдлреЙрд░реНрдо рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдкреНрд░рд╡реЗрд╢ рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдд: рдкреВрд░реНрдг рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рдлрд╝реАрд▓реНрдб рдмрдирд╛рдПрдВред
import { withMrr } from 'mrr'; const stations = [ '', '', '', ' ', ... ] const Tickets = withMrr({
mrr рдШрдЯрдХреЛрдВ рдХреЛ withMrr рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд▓рд┐рдВрдХ рдЖрд░реЗрдЦ (рдкреНрд░рд╡рд╛рд╣ рдХрд╛ рд╡рд┐рд╡рд░рдг) рдФрд░ рдПрдХ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдШрдЯрдХ рдХреЗ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЕрдм рдкреВрд░реА рддрд░рд╣ рд╕реЗ mrr рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдореЗрдВ рдкреНрд░рд╛рд░рдВрднрд┐рдХ (рдмреНрд▓реЙрдХ $ рдЗрдирд┐рдЯ) рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕реВрддреНрд░ рдореВрд▓реНрдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЧрдгрдирд╛ рдХреА рдЬрд╛рдПрдЧреАред
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рд╕реЗрд▓ (рдпрд╛ рджреЛ рдзрд╛рд░рд╛рдПрдБ рд╣реИрдВ, рдЬреЛ рдПрдХ рд╣реА рдмрд╛рдд рд╣реИ):
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЙрдордЗрдиреНрдкреБрдЯ , рд╡реЗ рдорд╛рди, рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ рд╕реЗ
$ рд╣реЗрд▓реНрдкрд░ (рдбреЗрдЯрд╛ рдЗрдирдкреБрдЯ рдПрд▓рд┐рдореЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд╕
рд╣реЛрдХрд░ ) рдФрд░ рдПрдХ рд╕реЗрд▓ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЗрдо , рдирд╛рдо рд╕реЗ рдорд┐рд▓рд╛рди рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдпреБрдХреНрддред
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЙрдордСрдХреНрд╢рдВрд╕ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд░ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдПрдХ рдкреИрд░реЗрдВрдЯ рд╕реЗрд▓ рдПрдХ рдлрд╝рдВрдХреНрд╢рди ("
рд╕реВрддреНрд░ " рдирд╛рдордХ рдПрдХреНрд╕реЗрд▓ рдлреЙрд░реНрдореВрд▓рд╛ рдХреЗ рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛) рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред Mrr рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕рд░рд▓ рд╣реИ: рдкрд╣рд▓реЗ рд╕реНрдерд╛рди рдкрд░ рдлрд╝рдВрдХреНрд╢рди (рдпрд╛ рдСрдкрд░реЗрдЯрд░) рд╣реИ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реЗрд▓ рдХреЗ рдореВрд▓реНрдп рдХреА рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИ, рдлрд┐рд░ рдЙрди рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реЛрддреА рд╣реИ, рдЬрд┐рди рдкрд░ рдпрд╣ рд╕реЗрд▓ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ: рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдирдХреЗ рдорд╛рди рджрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрдЬреАрдм, рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ, рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рдХреЗ рдХрдИ рдлрд╛рдпрджреЗ рд╣реИрдВ, рдЬрд┐рд╕ рдкрд░ рд╣рдо рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗред рдЕрдм рддрдХ, рдореГрдж рддрд░реНрдХ рдпрд╣рд╛рдБ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ Vue, Svelte рдФрд░ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЧрдгрдиреАрдп рдЪрд░ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЖрдк рд╢реБрджреНрдз рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рд╣рдо рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕реВрдЪреА рд╕реЗ рдЪрдпрдирд┐рдд рд╕реНрдЯреЗрд╢рди рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЫрд┐рдкрд╛рдирд╛ рднреА рдЖрд╡рд╢реНрдпрдХ рд╣реИред
const Tickets = withMrr({ $init: { stationFromOptions: [], stationFromInput: '', }, stationFromOptions: [str => stations.filter(s => str.indexOf(a) === 0), 'stationFromInput'], stationFrom: ['merge', 'stationFromInput', 'selectStationFrom'], optionsShown: ['toggle', 'stationFromInput', 'selectStationFrom'], }, (state, props, $) => { return (<div> <div> : <input onChange={ $('stationFromInput') } value={ state.stationFrom }/> </div> { state.optionsShown && <ul className="stationFromOptions"> { state.stationFromOptions.map(s => <li onClick={ $('selectStationFrom', s) }>{ s }</li>) } </ul> } </div>); });
рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреА рд╕реВрдЪреА рдореЗрдВ $ рд╕рд╣рд╛рдпрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдПрдХ рдИрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХрд╛ рдЙрддреНрд╕рд░реНрдЬрди рдХрд░реЗрдЧрд╛ред
mrr рдЕрдкрдиреЗ рдШреЛрд╖рдгрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг, рдХрд┐рд╕реА рднреА рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП рд╡рд┐рджреЗрд╢реА рд╣реИред рд╕реНрдЯреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рд╕реЗрд▓ рд╡реИрд▓реНрдпреВ рдХреЛ "рдлреЛрд░реНрд╕" рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдПрдХ рдирдпрд╛
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЗрдо рд╕реЗрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдорд░реНрдЬ рд╕реНрдЯреНрд░реАрдо
рдорд░реНрдЬ рдСрдкрд░реЗрдЯрд░ (Rx рдкрд░ рдПрдХ рд╕рдорддреБрд▓реНрдп рд╕рдорддреБрд▓реНрдп рд╣реИ, рдЧрдардмрдВрдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ), рджреЛ рдзрд╛рд░рд╛рдУрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдирдкреБрдЯ (
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЗрдордЗрдирдкреНрдпреВрдЯ ) рдФрд░ рд╕реНрдЯреЗрд╢рди рдЪрдпрди (
рд╕рд┐рд▓реЗрдХреНрд╢рдирдлреНрд░реЗрдорд░реЛрдо )ред
рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдХрд┐рд╕реА рдЪреАрдЬрд╝ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рджрд┐рдЦрд╛рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдПрдХ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирдиреЗ рдХреЗ рдмрд╛рдж рдЙрд╕реЗ рдЫрд┐рдкрд╛рдПрдВред
рд╡рд┐рдХрд▓реНрдкрд╢реЛ рд╕реЗрд▓ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рд╕реВрдЪреА рдХреА рджреГрд╢реНрдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧреА, рдЬреЛ рдЕрдиреНрдп рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмреВрд▓рд┐рдпрди рдорд╛рди рд▓реЗрдЧреАред рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдкреИрдЯрд░реНрди рд╣реИ рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рд╢реБрдЧрд░ рдореМрдЬреВрдж рд╣реИ -
рдЯреЙрдЧрд▓ рдСрдкрд░реЗрдЯрд░ред рдпрд╣ рдкрд╣рд▓реЗ рддрд░реНрдХ (рдзрд╛рд░рд╛) рдХреЗ рдХрд┐рд╕реА рднреА рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд╕реЗрд▓ рдХреЗ рдореВрд▓реНрдп рдХреЛ
рд╕рд╣реА рдХрд░рддрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ
рдЧрд▓рдд - рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдкрд╛рда рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝реЗрдВред
const Tickets = withMrr({ $init: { stationFromOptions: [], stationFromInput: '', }, stationFromOptions: [str => stations.filter(s => str.indexOf(a) === 0), 'stationFromInput'], clearVal: [a => '', 'clear'], stationFrom: ['merge', 'stationFromInput', 'selectStationFrom', 'clearVal'], optionsShown: ['toggle', 'stationFromInput', 'selectStationFrom'], }, (state, props, $) => { return (<div> <div> : <input onChange={ $('stationFromInput') } value={ state.stationFrom }/> { state.stationFrom && <button onClick={ $('clear') }></button> } </div> { state.optionsShown && <ul className="stationFromOptions"> { state.stationFromOptions.map(s => <li onClick={ $('selectStationFrom', s) }>{ s }</li>) } </ul> } </div>); });
рдЕрдм рд╣рдорд╛рд░рд╛
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЙрдо рд╕реЗрд▓, рдЬреЛ рдЗрдирдкреБрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдкрд╛рда рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЛ рд╕реЗ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рддреАрди рдзрд╛рд░рд╛рдУрдВ рд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдлреЙрд░реНрдо рдХрд╛ mrr рдирд┐рд░реНрдорд╛рдг [* рд╕реВрддреНрд░ *, * ... рд╕реЗрд▓ рддрд░реНрдХ *] рд▓рд┐рд╕реНрдк рдореЗрдВ рдПрд╕-рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдФрд░ рд▓рд┐рд╕реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрдк рдордирдорд╛рдиреЗ рдврдВрдЧ рд╕реЗ рдРрд╕реЗ рдирд┐рд░реНрдорд╛рдгреЛрдВ рдХреЛ рдПрдХ рджреВрд╕рд░реЗ рдореЗрдВ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдЪрд▓реЛ рдмреЗрдХрд╛рд░ рд╕рдорд╛рд╢реЛрдзрди рд╕реЗрд▓ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдПрдВ рдФрд░ рдХреЛрдб рдХреЛ рдЫреЛрдЯрд╛ рдХрд░реЗрдВ:
stationFrom: ['merge', 'stationFromInput', 'selectStationFrom', [a => '', 'clear']],
рдПрдХ рдЕрдирд┐рд╡рд╛рд░реНрдп рд╢реИрд▓реА рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреА рддреБрд▓рдирд╛ рдПрдХ рдЦрд░рд╛рдм рд╕рдВрдЧрдард┐рдд рдЯреАрдо рдХреЗ рд╕рд╛рде рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ, рдЬрд╣рд╛рдВ рд╣рд░ рдХреЛрдИ рд▓рдЧрд╛рддрд╛рд░ рдПрдХ-рджреВрд╕рд░реЗ рдХреЛ рдХреБрдЫ рдЖрджреЗрд╢ рджреЗрддрд╛ рд╣реИ (рдореИрдВ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдФрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реВрдВ), рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рджреЛрдиреЛрдВ рдкреНрд░рдмрдВрдзрдХ рдЕрдзреАрдирд╕реНрде рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрддред рдШреЛрд╖рдгрд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╡рд┐рдкрд░реАрдд рдпреВрдЯреЛрдкрд┐рдпрди рдЪрд┐рддреНрд░ рдХреЗ рд╕рдорд╛рди рд╣реИрдВ: рдПрдХ рд╕рд╛рдореВрд╣рд┐рдХ рдЬрд╣рд╛рдВ рд╣рд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЙрд╕реЗ рдХрд┐рд╕реА рднреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдРрд╕реА рдЯреАрдо рдореЗрдВ рдЖрджреЗрд╢реЛрдВ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рд░ рдХреЛрдИ рдмрд╕ рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рд╣реИ рдФрд░ рдЬреЛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЙрд╕рдХреЗ рдЬрд╡рд╛рдм рдореЗрдВ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред
рдХрд┐рд╕реА рдШрдЯрдирд╛ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп (рдкрдврд╝реЗрдВ - рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП), рд╣рдо рдЙрди рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рдирдореЗрдВ рдпрд╣ рдШрдЯрдирд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЕрд░реНрдерд╛рддреНред рд╕реЗрд▓ рдЕрдиреНрдп рд╕реЗрд▓ рдореЗрдВ рдХрд┐рд╕реА рднреА рдмрджрд▓рд╛рд╡ рдкрд░ рдХреНрдпрд╛ рдореВрд▓реНрдп рд▓реЗрдЧрд╛ред рдЕрдм рддрдХ рдХреЗ рд╣рдорд╛рд░реЗ рдЫреЛрдЯреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдЯреЗрд╢рдирдлреНрд░реЙрдо рд╕реЗрд▓ рдФрд░ рддреАрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдореВрд▓реНрдп рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдирд┐рд╡рд╛рд░реНрдп рдХреЛрдб рдХреЗ рдЖрджреА рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЕрд╕рд╛рдорд╛рдиреНрдп (рдпрд╛ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ "рдмреИрд╕рд╛рдЦреА", "рд╡рд┐рдХреГрдд") рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЖрдкрдХреЛ рдХреЛрдб рдХреА рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ (рдФрд░ рд╕реНрдерд┐рд░рддрд╛) рдХреЗ рдХрд╛рд░рдг рдкреНрд░рдпрд╛рд╕ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛? рдХреНрдпрд╛ рдЕрдЬрд╛рдХреНрд╕ рдХреЗ рд╕рд╛рде рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕реНрдЯреЗрд╢рдиреЛрдВ рдХреА рд╕реВрдЪреА рдХреЛ рдЦреАрдВрдЪрдирд╛ рд╕рдВрднрд╡ рд╣реИ? рдХреЛрдИ рдмрд╛рдд рдирд╣реАрдВ! рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ mrr рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ рдХрд┐ рдлрд╝рдВрдХреНрд╢рди рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рд╡рд╛рджрд╛ рдХрд░рддрд╛ рд╣реИред рдЬрдм mrr рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡рд╣ рдЕрдкрдиреЗ рд░рд┐рд╕реЛрд▓реНрд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдбреЗрдЯрд╛ рдХреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ "рдкреБрд╢" рдХрд░реЗрдЧрд╛ред
stationFromOptions: [str => fetch('/get_stations?str=' + str).then(res => res.toJSON()), 'stationFromInput'],
рдЗрд╕рдХрд╛ рдЕрд░реНрде рдпрд╣ рднреА рд╣реИ рдХрд┐ рдЖрдк рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдорд╛рдорд▓реЛрдВ (рддреНрд░реБрдЯрд┐ рд╕реЗ рдирд┐рдкрдЯрдиреЗ, рд╡рд╛рджреЗ рдХреА рд╕реНрдерд┐рддрд┐) рдкрд░ рдмрд╛рдж рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред
рдкреНрд░рд╕реНрдерд╛рди рд╕реНрдЯреЗрд╢рди рдЪреБрдирдиреЗ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддреИрдпрд╛рд░ рд╣реИред рдЖрдЧрдорди рд╕реНрдЯреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рдШрдЯрдХ рдореЗрдВ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ рдЬрд┐рд╕реЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдСрдЯреЛ-рдкреВрд░реНрдгрддрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЗрдирдкреБрдЯ рдШрдЯрдХ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╣рдо рдлрд╝реАрд▓реНрдбреНрд╕ рдХрд╛ рдирд╛рдо рдмрджрд▓реЗрдВрдЧреЗ рдФрд░ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдЙрдкрдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдк рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХрд░реЗрдВрдЧреЗред
const OptionsInput = withMrr(props => ({ $init: { options: [], }, val: ['merge', 'valInput', 'selectOption', [a => '', 'clear']], options: [props.getOptions, 'val'], optionsShown: ['toggle', 'valInput', 'selectOption'], }), (state, props, $) => <div> <div> <input onChange={ $('valInput') } value={ state.val } /> </div> { state.optionsShown && <ul className="options"> { state.options.map(s => <li onClick={ $('selectOption', s) }>{ s }</li>) } </ul> } { state.val && <div className="clear" onClick={ $('clear') }> X </div> } </div>)
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдк рдкреНрд░реЙрдкрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдПрдХ рдлрдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ mrr рд╕реЗрд▓реНрд╕ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдХреНрд░рд┐рдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ - рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдкрд░, рдФрд░ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗрдВрдЧреЗ)ред
рдШрдЯрдХреЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░
рдЕрдм рдЗрд╕ рдШрдЯрдХ рдХреЛ рдореВрд▓ рдШрдЯрдХ рд╕реЗ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдХреИрд╕реЗ mrr рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдХреЛ рдбреЗрдЯрд╛ рдХрд╛ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
const getMatchedStations = str => fetch('/get_stations?str=' + str).then(res => res.toJSON()); const Tickets = withMrr({ stationTo: 'selectStationFrom/val', stationFrom: 'selectStationTo/val', }, (state, props, $, connectAs) => { return (<div> <OptionsInput { ...connectAs('selectStationFrom') } getOptions={ getMatchedStations } /> - <OptionsInput { ...connectAs('selectStationTo') } getOptions={ getMatchedStations } /> <input type="date" onChange={ $('date') } /> <button onClick={ $('searchTrains') }></button> </div>); });
рдореВрд▓ рдШрдЯрдХ рдХреЛ рдмрд╛рд▓ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ
рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдлрд╝рдВрдХреНрд╢рди (рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЪреМрдереЗ рддрд░реНрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЙрд╕ рдирд╛рдо рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рд╣рдо рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдШрдЯрдХ рд╕рдВрд▓рдЧреНрди рдХрд░рдХреЗ, рдЗрд╕ рдирд╛рдо рд╕реЗ рд╣рдо рдЗрд╕рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡реИрд▓ рд╕реЗрд▓реНрд╕ рдХреЛ рд╕реБрди рд░рд╣реЗ рд╣реИрдВред рд░рд┐рд╡рд░реНрд╕ рднреА рд╕рдВрднрд╡ рд╣реИ - рдореВрд▓ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдмрдЪреНрдЪреЗ рдХреЗ рдШрдЯрдХ рд╕реЗ рд╕реБрдиреЛред
рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣рд╛рдБ mrr рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ: рдХреЛрдИ onChange рдХреЙрд▓рдмреИрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╣рдореЗрдВ рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЪрд╛рдЗрд▓реНрдб рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╣рдореЗрдВ рдЗрд╕рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рддрдХ рдкрд╣реБрдВрдЪ рдорд┐рд▓рддреА рд╣реИ! рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдлрд┐рд░ рд╕реЗ рдШреЛрд╖рдгрд╛ рдХреА рд╡рдЬрд╣ рд╕реЗ, рдХрд┐рд╕реА рдЕрдиреНрдп рдШрдЯрдХ рдХреЗ рдХрд╛рдо рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдХрд╛ рдХреЛрдИ рдЦрддрд░рд╛ рдирд╣реАрдВ рд╣реИ - рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЗрд╕рдореЗрдВ рдХреБрдЫ рднреА "рдмрджрд▓рдиреЗ" рдХреА рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИ, рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд, рд╣рдо рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреЛ "рд╕реБрди" рд╕рдХрддреЗ рд╣реИрдВред
рд╕рдВрдХреЗрдд рдФрд░ рдореВрд▓реНрдп
рдЕрдЧрд▓рд╛ рдЪрд░рдг рдЪрдпрдирд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдЯреНрд░реЗрдиреЛрдВ рдХреА рдЦреЛрдЬ рд╣реИред рдЕрдирд┐рд╡рд╛рд░реНрдп рджреГрд╖реНрдЯрд┐рдХреЛрдг рдореЗрдВ, рд╣рдо рд╕рдВрднрд╡рддрдГ рдСрдирд╕реНрдорд┐рдЯ рдлреЙрд░реНрдо рд╕рдмрдорд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдкреНрд░реЛрд╕реЗрд╕рд░ рд▓рд┐рдЦреЗрдВрдЧреЗ, рдЬреЛ рдЖрдЧреЗ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рд╢реБрд░реВ рдХрд░реЗрдЧрд╛ - рдПрдХ рдЕрдЬрд╛рдХреНрд╕ рдЕрдиреБрд░реЛрдз рдФрд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рдиред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдпрд╛рдж рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдХреБрдЫ рднреА "рдЖрджреЗрд╢" рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рд╣рдо рдХреЗрд╡рд▓ рдлреЙрд░реНрдо рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдПрдХ рдФрд░ рд╕реЗрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдПрдХ рдФрд░ рдирд┐рд╡реЗрджрди рд▓рд┐рдЦреВрдБред
const getTrains = (from, to, date) => fetch('/get_trains?from=' + from + '&to=' + to + '&date=' + date).then(res => res.toJSON()); const Tickets = withMrr({ stationFrom: 'selectStationFrom/val', stationTo: 'selectStationTo/val', results: [getTrains, 'stationFrom', 'stationTo', 'date', 'searchTrains'], }, (state, props, $, connectAs) => { return (<div> <OptionsInput { ...connectAs('selectStationFrom') } getOptions={ getMatchedStations } /> - <OptionsInput { ...connectAs('selectStationTo') } getOptions={ getMatchedStations } /> <input type="date" onChange={ $('date') } /> <button onClick={ $('searchTrains') }></button> </div>); });
рд╣рд╛рд▓рд╛рдБрдХрд┐, рдРрд╕рд╛ рдХреЛрдб рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдЧрдгрдирд╛ (рд╕реЗрд▓ рд╡реИрд▓реНрдпреВ рдХрд╛ рдкреБрдирд░реНрдЧрдгрдирд╛) рддрдм рд╢реБрд░реВ рдХреА рдЬрд╛рддреА рд╣реИ рдЬрдм рдХреЛрдИ рднреА рддрд░реНрдХ рдмрджрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рднреЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╕реНрдЯреЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдФрд░ рди рдХреЗрд╡рд▓ "рдЦреЛрдЬ" рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗред рд╣рдореЗрдВ рдПрдХ рддрд░рдл, рд╕реНрдЯреЗрд╢рди рдФрд░ рддрд╛рд░реАрдЦ рдХреЛ рд╕реВрддреНрд░ рдХреЗ рддрд░реНрдХреЛрдВ рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рддрд░рдл, рдЙрдирдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВред Mrr рдореЗрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рддрдВрддреНрд░ рд╣реИ рдЬрд┐рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╢реНрд░рд╡рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
results: [getTrains, '-stationFrom', '-stationTo', '-date', 'searchTrains'],
рд╕реЗрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рдордиреЗ рдХреЗрд╡рд▓ рдПрдХ рдорд╛рдЗрдирд╕ рдЬреЛрдбрд╝реЗрдВ, рдФрд░ рд╡реЛрдЗрд▓рд╛! рдЕрдм,
рдкрд░рд┐рдгрд╛рдо рдХреЗрд╡рд▓
searchTrains рд╕реЗрд▓ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред
рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
searchTrains рд╕реЗрд▓ "рд╕реЗрд▓-рд╕рд┐рдЧреНрдирд▓" рдФрд░
рд╕реНрдЯреЗрд╢рдирдлреНрд░реЙрдо рдФрд░ рдЕрдиреНрдп рдХреА рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ "рд╕реЗрд▓-рд╡реИрд▓реНрдпреВ" рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╕рд┐рдЧреНрдирд▓ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ рд╡рд╣ рдХреНрд╖рдг рдЬрдм рдореВрд▓реНрдпреЛрдВ "рдкреНрд░рд╡рд╛рд╣" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдФрд░ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдбреЗрдЯрд╛ рд╣реЛрдЧрд╛ - рд╡реИрд╕реЗ рднреА: рдпрд╣ рд╕рд┐рд░реНрдл рд╕рдЪ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, "1" рдпрд╛ рдЬреЛ рднреА (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпреЗ рдбреЛрдо рдЗрд╡реЗрдВрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛрдВрдЧреЗ) )ред рдПрдХ рд╡реИрд▓реНрдпреВ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЙрд╕рдХрд╛ рдореВрд▓реНрдп рд╣реИ рдЬреЛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдХреНрд╖рдг рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИрдВред рдпреЗ рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдБ рдкрд░рд╕реНрдкрд░ рдЕрдирдиреНрдп рдирд╣реАрдВ рд╣реИрдВ: рдХрдИ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рд╕рдВрдХреЗрдд рдФрд░ рдорд╛рди рджреЛрдиреЛрдВ рд╣реИрдВред Mrr рдореЗрдВ рд╡рд╛рдХреНрдпрд╡рд┐рдиреНрдпрд╛рд╕ рд╕реНрддрд░ рдкрд░, рдЗрди рджреЛ рдкреНрд░рдХрд╛рд░ рдХреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рд╕реЗ рднрд┐рдиреНрди рдирд╣реАрдВ рд╣реЛрддреА рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╕рдордп рдЗрд╕ рддрд░рд╣ рдХреЗ рдЕрдВрддрд░ рдХреА рд╡реИрдЪрд╛рд░рд┐рдХ рд╕рдордЭ рдмрд╣реБрдд рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
рдмрдВрдЯрддреА рдзрд╛рд░рд╛рдПрдБ
рдЯреНрд░реЗрди рдореЗрдВ рд╕реАрдЯреЗрдВ рдЦреЛрдЬрдиреЗ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рд▓реЛрдбрд░ рджрд┐рдЦрд╛рдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреА рдЬрд╡рд╛рдм рджреЗрдирд╛ рд╣реЛрдЧрд╛ред рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреБрдЫ рд╡рд╛рджреЗ рд╣реИрдВред
const Tickets = withMrr({ $init: { results: {}, } stationFrom: 'selectStationFrom/val', stationTo: 'selectStationTo/val', searchQuery: [(from, to, date) => ({ from, to, date }), '-stationFrom', '-stationTo', '-date', 'searchTrains'], results: ['nested', (cb, query) => { cb({ loading: true, error: null, data: null }); getTrains(query.from, query.to, query.date) .then(res => cb('data', res)) .catch(err => cb('error', err)) .finally(() => cb('loading', false)) }, 'searchQuery'], availableTrains: 'results.data', }, (state, props, $, connectAs) => { return (<div> <div> <OptionsInput { ...connectAs('selectStationFrom') } getOptions={ getMatchedStations } /> - <OptionsInput { ...connectAs('selectStationTo') } getOptions={ getMatchedStations } /> <input type="date" onChange={ $('date') } /> <button onClick={ $('searchTrains') }></button> </div> <div> { state.results.loading && <div className="loading">...</div> } { state.results.error && <div className="error"> . , . .</div> } { state.availableTrains && <div className="results"> { state.availableTrains.map((train) => <div />) } </div> } </div> </div>); });
рдиреЗрд╕реНрдЯреЗрдб рдСрдкрд░реЗрдЯрд░ рдЖрдкрдХреЛ рд╕рдмрд╕реНрдХреЗрд▓реНрд╕ рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ "рд╡рд┐рдШрдЯрд┐рдд" рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рд▓рд┐рдП, рд╕реВрддреНрд░ рдХрд╛ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдХреЙрд▓рдмреИрдХ рд╣реИ, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдбреЗрдЯрд╛ рдХреЛ рд╕рдмрд╕реЗрд▓ (рдПрдХ рдпрд╛ рдЕрдзрд┐рдХ) рдореЗрдВ "рдкреБрд╢" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдЯреНрд░реАрдо рд╣реИрдВ рдЬреЛ рддреНрд░реБрдЯрд┐, рд╡рд╛рджреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдкреНрд░рд╛рдкреНрдд рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВред рдиреЗрд╕реНрдЯреЗрдб рдСрдкрд░реЗрдЯрд░ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ рдФрд░ рд╢реНрд░реА рдореЗрдВ рдХреБрдЫ рдЖрд╡рд╢реНрдпрдХ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ (рд╣рдо рдЦреБрдж рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рд╕реЗрд▓ рдбреЗрдЯрд╛ рдбрд╛рд▓рддреЗ рд╣реИрдВ)ред рдЬрдмрдХрд┐ рдорд░реНрдЬ рдСрдкрд░реЗрдЯрд░ рдПрдХ рдореЗрдВ рдХрдИ рдереНрд░реЗрдбреНрд╕ рдХреЛ рдорд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рдиреЗрд╕реНрдЯреЗрдб рдзрд╛рдЧреЗ рдХреЛ рдХрдИ рд╕рдм-рдереНрд░реЗрдбреНрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╡рд┐рдкрд░реАрдд рд╣реЛрддрд╛ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдорд╛рдирдХ рддрд░реАрдХрд╛ рд╣реИ, mrr рдореЗрдВ рдпрд╣ рдПрдХ рд╡рд╛рджрд╛ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рд╣реИ рдФрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
results: ['promise', (query) => getTrains(query.from, query.to, query.date), 'searchQuery'],
рд╕рд╛рде рд╣реА, рд╡рд╛рджрд╛ рдСрдкрд░реЗрдЯрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рд╣рд╛рд▓рд┐рдпрд╛ рд╡рд╛рджреЗ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдЙрдкрд▓рдмреНрдз рд╕реАрдЯреЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдЯрдХ (рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреА рдХрд╛рд░реЛрдВ рд╕реЗ рдордирд╛ рдХрд░ рджреЗрдВрдЧреЗ)
const TrainSeats = withMrr({ selectSeats: [(seatsNumber, { id }) => new Array(Number(seatsNumber)).fill(true).map(() => ({ trainId: id })), '-seatsNumber', '-$props', 'select'], seatsNumber: [() => 0, 'selectSeats'], }, (state, props, $) => <div className="train"> тДЦ{ props.num } { props.from } - { props.to }. : { props.seats || 0 } { props.seats && <div> : <input type="number" onChange={ $('seatsNumber') } value={ state.seatsNumber || 0 } max={ props.seats } /> <button onClick={ $('select') }></button> </div> } </div>);
рдПрдХ рд╕реВрддреНрд░ рдореЗрдВ рдкреНрд░реЙрдкреНрд╕ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рд╢реЗрд╖ $ рдкреНрд░реЙрдкреНрд╕ рдмреЙрдХреНрд╕ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред
const Tickets = withMrr({ ... selectedSeats: '*/selectSeats', }, (state, props, $, connectAs) => { ... <div className="results"> { state.availableTrains.map((train, i) => <TrainSeats key={i} {...train} {...connectAs('train' + i)}/>) } </div> }
рдЬрдм рдЖрдк "рдЪрдпрдирд┐рдд" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдЪрдпрдирд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдХреНрд░рд┐рдп рд╕реБрдирдиреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рдЪрд╛рдЗрд▓реНрдб рдШрдЯрдХ рдХреЛ рдкреИрд░реЗрдВрдЯ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рдЧрд╛рдбрд╝рд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдореЗрдВ рднреА рд╕реАрдЯреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо "*" рдорд╛рд╕реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдмрд╛рд▓ рдШрдЯрдХреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╕реБрдирддреЗ рд╣реИрдВред
рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рд╣реИ: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ рдПрдХ рдЯреНрд░реЗрди рдореЗрдВ рд╕реАрдЯреЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ рджреВрд╕рд░реЗ рдореЗрдВ, рддрд╛рдХрд┐ рдирдпрд╛ рдбреЗрдЯрд╛ рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдкреАрд╕ рд▓реЗред рдбреЗрдЯрд╛ рдХреЛ "рд╕рдВрдЪрд┐рдд" рдХреИрд╕реЗ рдХрд░реЗрдВ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ
рдХреНрд▓реЛрдЬрд░ рдСрдкрд░реЗрдЯрд░ рд╣реИ, рдЬреЛ рдиреЗрд╕реНрдЯреЗрдб рдФрд░ рдлрд╝рдирд▓ рдХреЗ рд╕рд╛рде рдорд┐рд▓рдХрд░ mrr рдХрд╛ рдЖрдзрд╛рд░ рдмрдирд╛рддрд╛ рд╣реИ (рд╕рднреА рдЕрдиреНрдп рдЗрди рддреАрдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рд┐рдВрдЯреИрдХреНрдЯрд┐рдХ рдЪреАрдиреА рд╕реЗ рдЕрдзрд┐рдХ рдХреБрдЫ рдирд╣реАрдВ рд╣реИрдВ)ред
selectedSeats: ['closure', () => { let seats = [];
рдкрд╣рд▓реЗ
рдХреНрд▓реЛрдЬрд░ (рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдорд╛рдЙрдВрдЯ рдкрд░) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдПрдХ рдХреНрд▓реЛрдЬрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдлреЙрд░реНрдореВрд▓рд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЪрд░реЛрдВ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреА рдкрд╣реБрдВрдЪ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рддрд░реАрдХреЗ рд╕реЗ рдХреЙрд▓ рдХреЗ рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ - рд╡реИрд╢реНрд╡рд┐рдХ рдЪрд░ рдФрд░ рд╕рд╛рдЭрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддреА рд░рд╛рдЬреНрдп рдХреЗ рдЦрд╛рдИ рдореЗрдВ рдлрд┐рд╕рд▓рдиреЗ рдХреЗ рдмрд┐рдирд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдмрдВрдж рдХрд░рдиреЗ рд╕реЗ рдЖрдк рд╕реНрдХреИрди рдФрд░ рдЕрдиреНрдп рдЬреИрд╕реЗ рдЖрд░рдПрдХреНрд╕ рдСрдкрд░реЗрдЯрд░реЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рддрд░реАрдХрд╛ рдЕрдЪреНрдЫрд╛ рд╣реИред рдпрджрд┐ рд╣рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдЪрд░ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд┐рд╢реЗрд╖ рдирд╛рдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрд▓ рдХреЗ рдкрд┐рдЫрд▓реЗ рдореВрд▓реНрдп рдХреЗ рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
selectedSeats: [(seats, prev) => [...seats, ...prev], '*/selectSeats', '^']
рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдЪрдпрдирд┐рдд рдЯрд┐рдХрдЯ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рдФрд░ рдЕрдВрддрд┐рдо рдирд╛рдо рджрд░реНрдЬ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
const SeatDetails = withMrr({}, (state, props, $) => { return (<div> { props.trainId } <input name="name" value={ props.name } onChange={ $('setDetails', e => ['name', e.target.value, props.i]) } /> <input name="surname" value={ props.surname } onChange={ $('setDetails', e => ['surname', e.target.value, props.i]) }/> <a href="#" onClick={ $('removeSeat', props.i) }>X</a> </div>); }) const Tickets = withMrr({ $init: { results: {}, selectedSeats: [], } stationFrom: 'selectStationFrom/val', stationTo: 'selectStationTo/val', searchQuery: [(from, to, date) => ({ from, to, date }), '-stationFrom', '-stationTo', '-date', 'searchTrains'], results: ['promise', (query) => getTrains(query.from, query.to, query.date), 'searchQuery'], availableTrains: 'results.data', selectedSeats: [(seats, prev) => [...seats, ...prev], '*/selectSeats', '^'] }, (state, props, $, connectAs) => { return (<div> <div> <OptionsInput { ...connectAs('selectStationFrom') } getOptions={ getMatchedStations } /> - <OptionsInput { ...connectAs('selectStationTo') } getOptions={ getMatchedStations } /> <input type="date" onChange={ $('date') } /> <button onClick={ $('searchTrains') }></button> </div> <div> { state.results.loading && <div className="loading">...</div> } { state.results.error && <div className="error"> . , . .</div> } { state.availableTrains && <div className="results"> { state.availableTrains.map((train, i) => <TrainSeats key={i} {...train} {...connectAs('train' + i)}/>) } </div> } { state.selectedSeats.map((seat, i) => <SeatDetails key={i} i={i} { ...seat } {...connectAs('seat' + i)}/>) } </div> </div>); });
рдЪрдпрдирд┐рдд рд╕рд╛рдЗрдЯрд╕ рд╕реЗрд▓ рдореЗрдВ рдЪрдпрдирд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рд╣реЛрддреА рд╣реИред рдЬреИрд╕реЗ рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреНрд░рддреНрдпреЗрдХ рдЯрд┐рдХрдЯ рдХреЗ рд▓рд┐рдП рдирд╛рдо рдФрд░ рдЙрдкрдирд╛рдо рджрд░реНрдЬ рдХрд░рддрд╛ рд╣реИ, рд╣рдореЗрдВ рдбреЗрдЯрд╛ рдХреЛ рд╕рд░рдгреА рдХреЗ рд╕рдВрдмрдВрдзрд┐рдд рддрддреНрд╡реЛрдВ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
selectedSeats: [(seats, details, prev) => {
рдорд╛рдирдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИ: рд╕реВрддреНрд░ рдореЗрдВ, рд╣рдореЗрдВ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╕реЗрд▓ рдмрджрд▓ рдЧрдИ рд╣реИ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдВред рдорд░реНрдЬ рдСрдкрд░реЗрдЯрд░ рдХреЗ рд░реВрдкреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣рдорд╛рд░реА рдорджрдж рдХрд░реЗрдЧрд╛ред
selectedSeats: ['merge', { '*/selectSeats': (seats, prev) => { return [...prev, ...seats]; }, '*/setDetails': ([field, value, i], prev) => { prev[i][field] = value; return prev; }, '*/removeSeat': (i, prev) => { prev.splice(i, 1); return prev; }, }, '^'],
рдпрд╣ Redux Reducers рдХреА рддрд░рд╣ рдПрдХ рд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдФрд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЗ рд╕рд╛рдеред рдФрд░ рдЖрдк рд╕рд░рдгреА рдХреЛ рдореНрдпреВрдЯ рдХрд░рдиреЗ рд╕реЗ рдбрд░ рдирд╣реАрдВ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдПрдХ рд╕реЗрд▓ рдХреЗ рд╕реВрддреНрд░ рдиреЗ рдЗрд╕ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдХрд┐рдпрд╛ рд╣реИ, рдХреНрд░рдорд╢рдГ, рд╕рдорд╛рдирд╛рдВрддрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдмрд╛рд╣рд░ рд░рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рд▓реЗрдХрд┐рди рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдХреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕рдХреЗ рд▓рд╛рдпрдХ рдирд╣реАрдВ рд╣реИ)ред
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╕рдВрдЧреНрд░рд╣
рдЬрдм рд╕реЗрд▓ рд╕реНрдЯреЛрд░ рдФрд░ рд╕рд░рдгреА рдХреЛ рдмрджрд▓рддрд╛ рд╣реИ рддреЛ рдкреИрдЯрд░реНрди рдмрд╣реБрдд рд╕рд╛рдорд╛рдиреНрдп рд╣реИред рд╕рд░рдгреА рд╡рд╛рд▓реЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рддреАрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ: рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдирд╛, рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛, рд╣рдЯрд╛рдирд╛ред рдЗрд╕рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕реБрдВрджрд░
рдХреЛрд▓ рдСрдкрд░реЗрдЯрд░ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ
рдЪрдпрдирд┐рдд рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВред
рдпрд╣ рдерд╛:
selectedSeats: ['merge', { '*/selectSeats': (seats, prev) => { return [...prev, ...seats]; }, '*/setDetails': ([field, value, i], prev) => { prev[i][field] = value; return prev; }, '*/removeSeat': (i, prev) => { prev.splice(i, 1); return prev; }, 'addToCart': () => [], }, '^']
рдпрд╣ рдерд╛:
selectedSeats: ['coll', { create: '*/selectSeats', update: '*/setDetails', delete: ['merge', '*/removeSeat', [() => ({}), 'addToCart']] }]
рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╕реЗрдЯрдЯреЗрд▓реНрд╕ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
<input name="name" onChange={ $('setDetails', e => [{ name: e.target.value }, props.i]) } /> <input name="surname" onChange={ $('setDetails', e => [{ surname: e.target.value }, props.i]) }/>
Coll рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рддреАрди рдереНрд░реЗрдбреНрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд╕рд░рдгреА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ,
рдХреНрд░рд┐рдПрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реНрд╡рдпрдВ рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП, рдЬреЛ рдХрд┐ рд╕рд░рдгреА (рдЖрдорддреМрд░ рдкрд░ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕) рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдбрд┐рд▓реАрдЯ рд╕реНрдЯреНрд░реАрдо
рдбрд┐рд▓реАрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ ('* / removeSeat') рдФрд░ рдорд╛рд╕реНрдХ рджреЛрдиреЛрдВред рдореБрдЦреМрдЯрд╛ {} рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛, рдФрд░ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдорд╛рд╕реНрдХ {рдирд╛рдо: 'рдХрд╛рд░реНрд▓'} рдХрд╛рд░реНрд▓ рдирд╛рдо рдХреЗ рд╕рд╛рде рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рд╣рдЯрд╛ рджреЗрдЧрд╛ред
рдЕрдкрдбреЗрдЯ рд╕реНрдЯреНрд░реАрдо рдорд╛рдиреЛрдВ рдХреЗ рдЬреЛрдбрд╝реЗ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ: рд╡рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдЬреЛ рддрддреНрд╡ (рдореБрдЦреМрдЯрд╛ рдпрд╛ рдлрд╝рдВрдХреНрд╢рди) рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЙрди рддрддреНрд╡реЛрдВ рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХ рдпрд╛ рдореБрдЦреМрдЯрд╛ рдЬрд┐рдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, [{рдЙрдкрдирд╛рдо: 'рдЬреЙрдирд╕рди'}, {}] рд╕рд░рдгреА рдХреЗ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдЬреЙрдирд╕рди рдЙрдкрдирд╛рдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред
рдЯрдХреНрдХрд░ рдСрдкрд░реЗрдЯрд░ рдЖрдВрддрд░рд┐рдХ рдХреНрд╡реЗрд░реА рднрд╛рд╖рд╛ рдХреА рддрд░рд╣ рдХреБрдЫ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдзрд┐рдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рдмрдирд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
JsFiddle рдореЗрдВ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди
рдХрд╛ рдкреВрд░рд╛ рдХреЛрдб ред
рд╣рдо рд╢реНрд░реА рдХреЗ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реЛ рдЧрдПред рдПрдХ рдХрд╛рдлреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╖рдп рдЬреЛ рдУрд╡рд░рдмреЛрд░реНрдб рдмрдирд╛ рд╣реБрдЖ рд╣реИ, рд╡реИрд╢реНрд╡рд┐рдХ рдзрди рдкреНрд░рдмрдВрдзрди рд╣реИ, рдЬрд┐рд╕ рдкрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рд▓реЗрдХрд┐рди рдЕрдм рдЖрдк рдПрдХ рдШрдЯрдХ рдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдХреЛрдВ рдХреЗ рд╕рдореВрд╣ рдХреЗ рдЕрдВрджрд░ рд░рд╛рдЬреНрдп рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╢реНрд░реА рдХреА рд╢рдХреНрддрд┐ рдХреНрдпрд╛ рд╣реИ?
mrr рдЖрдкрдХреЛ рдПрдХ рдХрд╛рд░реНрдпрд╛рддреНрдордХ-рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓ рд╢реИрд▓реА рдореЗрдВ React рдореЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓рд┐рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ (mrr рдХреЛ рдбрд┐рдХреНрд░рд┐рдЯ рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдбрд┐рдХреНрд░рд┐рдкреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред mrr рдмрд╣реБрдд рдЕрднрд┐рд╡реНрдпрдВрдЬрдХ рд╣реИ - рдЖрдк рдХрдо рд╕рдордп рдХреЛрдб рдХреА рдкрдВрдХреНрддрд┐рдпрд╛рдБ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
mrr рдореВрд▓ рд╕рд╛рд░ рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рдпрд╣ рд▓реЗрдЦ mrr рдХреА рд▓рдЧрднрдЧ рд╕рднреА рдореБрдЦреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред ( ). , тАФ , , , .. mrr , .
( ), ┬л┬╗, mrr тАФ , . , , , тАФ mrr ( mrr ┬л--┬╗, ).
?
┬л┬╗ , . , , . , mrr , , , , Redux , state setState, .
?
, тАФ , . , ClojureScript, , React . Redux, mrr , . , mrr ┬л ┬╗, , mrr .
?
, :) , , API , ( ), . , mrr React', (React ).
, !