рдореЗрд░рд╛ рдирд╛рдо рдЕрд░реНрдЯрд┐рдУрдо рдиреЗрд╕реНрдорд┐рдпрд╛рдиреЛрд╡ рд╣реИ, рдореИрдВ рдпреИрдВрдбреЗрдХреНрд╕рдкреНрд░реЗрдХреНрдЯрд┐рдХрдо рдореЗрдВ рдПрдХ рдлреБрд▓-рд╕реНрдЯреИрдХ рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ, рдореИрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдлреНрд░рдВрдЯрдПрдВрдб рд╕реЗ рдирд┐рдкрдЯрддрд╛ рд╣реВрдВред рд╣рдорд╛рд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдирдВрдж рдХреЗ рд╕рд╛рде рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ, рдбреЗрдЯрд╛ рдПрдирд╛рд▓рд┐рдЯрд┐рдХреНрд╕ рдФрд░ рдЕрдиреНрдп рдбрд┐рдЬрд┐рдЯрд▓ рд╢рд┐рд▓реНрдк рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╕рдВрднрд╡ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдФрд░ рд╕реАрдЦрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдХреЛрдИ рднреА рдбреЗрд╡рд▓рдкрд░ рдЬрд┐рд╕рдиреЗ рдЦреБрдж рдХреЛ рдирд╣реАрдВ рджрд┐рдпрд╛ рд╣реИ рд╡рд╣ рд╣рдореЗрд╢рд╛ "рдирд┐рд░рдВрддрд░" рд╣реИред рддреЛ рд╣рдо рд╣реИрдВ? рдЗрд╕рд▓рд┐рдП, рд╣рдо рдХрд╛рд░реНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕реАрдЦрдиреЗ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддреЗ рд╣реИрдВред рдФрд░ рд╣рд╛рд▓ рдХреЗ рд▓реЛрдЧреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдиреЗ рдореБрдЭреЗ рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХреА рдХрд┐ рд╣рдорд╛рд░реЗ рджреГрд╢реНрдпрдкрдЯрд▓ рдХреЛ рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛ рд╣реИред

рд╡рд░реНрдХрд╢реЙрдк рдХрд┐рд╕рдиреЗ рдФрд░ рдХреНрдпрд╛ рдмрдирд╛рдпрд╛ рд╣реИ
рд╣рдорд╛рд░реА рд╡рд┐рдХрд╛рд╕ рдЯреАрдо рдмреЗрд╣рдж рдХреЙрдореНрдкреИрдХреНрдЯ рд╣реИред рдмреИрдХрдПрдВрдб рдкрд░ рдХреЗрд╡рд▓ рджреЛ рд▓реЛрдЧ рд╣реИрдВ, рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдкрд░ - рдЪрд╛рд░, рдореБрдЭреЗ рджреЗрдЦрддреЗ рд╣реБрдП, рдПрдХ рдкреВрд░реНрдг рд╕реНрдЯреИрдХред рд╕рдордп-рд╕рдордп рдкрд░, Yandex.Tutorial рдХреЗ рд▓реЛрдЧ рд╣рдореЗрдВ рд╕реБрджреГрдвреАрдХрд░рдг рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рджреЛ рд╕рдкреНрддрд╛рд╣ рдХреЗ рд╕реНрдкреНрд░рд┐рдВрдЯ рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реЗрдо рдкрд░ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред
рд╣рдорд╛рд░рд╛ рдлрд╝реНрд░рдВрдЯ Redux / Redux-Saga рдХреЗ рд╕рд╛рде React.js рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рд╣рдо рдмреИрдХрдПрдВрдб рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдкреНрд░реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдЯреИрдХ рдХрд╛ рдмреИрдХреЗрдВрдб рд╣рд┐рд╕реНрд╕рд╛ рдкрд╛рдпрдерди (рдЕрдзрд┐рдХ рд╕рдЯреАрдХ, Django) рдореЗрдВ рд╣реИ, рдбреЗрдЯрд╛рдмреЗрд╕ PostgreSQL рд╣реИ, рдФрд░ рдХреБрдЫ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд░реЗрдбрд┐рд╕ред Redux рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рд╣рдо рд╕реВрдЪрдирд╛ рднрдВрдбрд╛рд░рдг рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, Redux рдФрд░ Redux-Saga рджреНрд╡рд╛рд░рд╛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВред рд╕рднреА рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯреНрд╕, рдЬреИрд╕реЗ рдХрд┐ рд╕рд░реНрд╡рд░ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ, Yandex.Metrica рдкрд░ рдХреЙрд▓ рдФрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ, рдмрд╕ Redux-Saga рдореЗрдВ рдкреНрд░реЛрд╕реЗрд╕ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рд╕рднреА рдбреЗрдЯрд╛ рд╕рдВрд╢реЛрдзрди Redux reducers рдореЗрдВ рд╣реЛрддреЗ рд╣реИрдВред
рдХреИрд╕реЗ рдЕрдкрдиреЗ iframe рдореЗрдВ рд▓реЙрдЧ рдХреА рдЕрдирджреЗрдЦреА рди рдХрд░реЗрдВ
рдЕрдм рд╣рдорд╛рд░реЗ рдордВрдЪ рдкрд░, рдкреНрд░рд╢рд┐рдХреНрд╖рдг рддреАрди рд╡реНрдпрд╡рд╕рд╛рдпреЛрдВ рдореЗрдВ рдЦреБрд▓рд╛ рд╣реИ: рдлреНрд░рдВрдЯ-рдПрдВрдб рдбреЗрд╡рд▓рдкрд░, рд╡реЗрдм рдбреЗрд╡рд▓рдкрд░, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХред рдФрд░ рд╣рдо рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВред
рдЫрд╣ рдорд╣реАрдиреЗ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо "
рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ " рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдмрдирд╛рдпрд╛, рдЬрд╣рд╛рдВ рд╣рдо рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ
рдХреЛ рдЬреБрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдХрд╛
рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рд┐рдЦрд╛рддреЗ рд╣реИрдВ ред рдпрд╣ рдЗрдВрдЯрд░реЗрдХреНрдЯрд┐рд╡ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рд╛рдВрдд рдЦреЛрд▓ рд╣реИ, рдЬреЛ рдбреЗрдЯрд╛ рд╡реИрдЬреНрдЮрд╛рдирд┐рдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдкреНрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкрд░реНрдпрд╛рд╡рд░рдг рдореЗрдВ рд╕рднреА рдСрдкрд░реЗрд╢рди рдиреЛрдЯрдмреБрдХ рдХреЗ рдЕрдВрджрд░ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдПрдХ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ - рдПрдХ рдиреЛрдЯрдмреБрдХ (рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХреЙрд▓ рдХрд░реВрдВрдЧрд╛)ред
рдЕрдиреБрднрд╡ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рд╣реИрдВ: рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛рд░реНрдп рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХреЗ рдХрд░реАрдм рд╣реЛрдВред рдХрд╛рдо рдХреЗ рдорд╛рд╣реМрд▓ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ рдХрд┐ рдкрд╛рда рдХреЗ рдЕрдВрджрд░ рд╕рднреА рдХреЛрдб рдиреЛрдЯрдмреБрдХ рдореЗрдВ рд╕рд╣реА рд▓рд┐рдЦреЗ, рдЪрд▓рд╛рдП рдФрд░ рдЬрд╛рдВрдЪреЗ рдЬрд╛ рд╕рдХреЗрдВред
рдмреБрдирд┐рдпрд╛рджреА рдХрдард┐рдирд╛рдЗрдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдЙрддреНрдкрдиреНрди рдирд╣реАрдВ рд╣реБрдЖред рдиреЛрдЯрдмреБрдХ рд╕реНрд╡рдпрдВ рдПрдХ рдЕрд▓рдЧ iframe рдореЗрдВ рдмрд╕рд╛ рдерд╛, рдЗрд╕реЗ рдЬрд╛рдБрдЪрдиреЗ рдХрд╛ рддрд░реНрдХ рдмреИрдХрдПрдВрдб рдкрд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдЫрд╛рддреНрд░ рдиреЛрдЯрдмреБрдХ рд╕реНрд╡рдпрдВ (рджрд╛рдИрдВ рдУрд░) рдХреЗрд╡рд▓ рдПрдХ iframe рд╣реИ рдЬрд┐рд╕рдХрд╛ URL JupyterHub рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдиреЛрдЯрдмреБрдХ рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИредрдкрд╣рд▓реЗ рд╕рдиреНрдирд┐рдХрдЯрди рдореЗрдВ, рд╕рдм рдХреБрдЫ рдПрдХ рдЕрдбрд╝рдЪрди рдХреЗ рдмрд┐рдирд╛, рдПрдХ рдЕрдбрд╝рдЪрди рдХреЗ рдмрд┐рдирд╛ рдХрд╛рдо рдХрд┐рдпрд╛ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди, рдмреЗрддреБрдХреА рдмрд╛рддреЗрдВ рд╕рд╛рдордиреЗ рдЖрдИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рд╕рд╣реА рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдПрдХ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреА рдЧрд╛рд░рдВрдЯреА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐, "рдЯреЗрд╕реНрдЯ рдЯрд╛рд╕реНрдХ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╕рд░реНрд╡рд░ рдЬрд╡рд╛рдм рджреЗрддрд╛ рд╣реИ рдХрд┐ рдЙрддреНрддрд░ рдЧрд▓рдд рд╣реИред рдФрд░ рдХреНрдпреЛрдВ - рдПрдХ рд░рд╣рд╕реНрдпред
рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ, рд╣рдореЗрдВ рдЙрд╕реА рджрд┐рди рдПрд╣рд╕рд╛рд╕ рд╣реБрдЖ рдЬрдм рд╣рдореЗрдВ рдПрдХ рдмрдЧ рдорд┐рд▓рд╛: рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЬреЛ рд╕рдорд╛рдзрд╛рди рдЙрдбрд╝рд╛рди рдирд╣реАрдВ рднрд░ рд░рд╣рд╛ рдерд╛, рд╡рд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдерд╛, рд╕рдорд╛рдзрд╛рди рд╕рд┐рд░реНрдл рдЬреБрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рд░реВрдк рдореЗрдВ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рд╡рд╛рд▓реЗ рдХреЛ рдкрд╣рд▓реЗ рд╣реА рдорд┐рдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдЦреБрдж рдХреЛ рдЬреАрд╡рд┐рдд рд░рд╣рдиреЗ рдХрд╛ рд╕рдордп рдирд╣реАрдВ рдерд╛, рдФрд░ рд╣рдордиреЗ рдмреИрдХрдПрдВрдб рдХреЛ рдзреАрдорд╛ рдХрд░ рджрд┐рдпрд╛ рддрд╛рдХрд┐ рдЙрд╕рдореЗрдВ рдХрд╛рд░реНрдп рдХреА рдЬрд╛рдБрдЪ рд╣реЛред рдХреНрдпрд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рд╡рд╣ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ред
рд╣рдореЗрдВ рдиреЛрдЯрдмреБрдХ рдХреЛ рдмрдЪрд╛рдиреЗ рдФрд░ рдЗрд╕реЗ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдХреЛ рдЕрдиреБрд░реЛрдз рднреЗрдЬрдиреЗ рдХреЗ рдмреАрдЪ рд░реЗрдирд╢реЙрд░реНрди рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдирд╛ рдерд╛ред рдкрдХрдбрд╝ рдпрд╣ рдереА рдХрд┐ рдиреЛрдЯрдмреБрдХ рдХрд╛ рдЖрдИрдлреНрд░реЗрдо рдЕрднрд┐рднрд╛рд╡рдХ рдЦрд┐рдбрд╝рдХреА рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЕрд░реНрдерд╛рддреН, рдЙрд╕ рджреГрд╢реНрдп рдХреЗ рд╕рд╛рде, рдЬрд┐рд╕ рдкрд░ рдПрдХ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рда рдШреВрдо рд░рд╣рд╛ рдерд╛ред рдмреЗрд╢рдХ, рдЙрдирдХреЗ рдмреАрдЪ рдХрд┐рд╕реА рднреА рдШрдЯрдирд╛ рдХреЛ рд╕реАрдзреЗ рдЕрдЧреНрд░реЗрд╖рд┐рдд рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рдерд╛: рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдбреЛрдореЗрди рдкрд░ рд░рд╣рддреЗ рд╣реИрдВред
рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рддрд▓рд╛рд╢ рдореЗрдВ, рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЬреБрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдЕрдкрдиреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдмреГрд╣рд╕реНрдкрддрд┐ рд╡рд╕реНрддреБ рд╣реИ - рдПрдХ рдиреЛрдЯрдмреБрдХ - рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЖрдк рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ, рдиреЛрдЯрдмреБрдХ рдХреЗ рд╕рдВрд░рдХреНрд╖рдг рд╕рд╣рд┐рдд рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЙрдЪрд┐рдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреА рдХреЙрд▓ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рдЬреБрдкрд┐рдЯрд░ рдХреЗ рдЕрдВрджрд░ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ (рдореЗрд░реЗ рдкрд╛рд╕ рдерд╛: рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рд╛рдорд╛рдиреНрдп рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИ), рджреЛрд╕реНрддреЛрдВ рдФрд░ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ - рд╣рдордиреЗ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд▓рдЧ-рдЗрди рдмрдирд╛рдпрд╛ рдФрд░ рдкреЛрд╕реНрдЯрдореЗрд╕реЗрдЬ рддрдВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЙрди рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдордиреНрд╡рд┐рдд рдХрд╛рд░реНрдп рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛, рдЬрд┐рдирд╕реЗ рдХрд╛рд░реНрдпрд╢рд╛рд▓рд╛ рдХрд╛ рд╕рдмрдХ рдЗрдХрдЯреНрдард╛ рд╣реБрдЖ рдерд╛ред
рд╣рдордиреЗ рдЗрд╕ рддрдереНрдп рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдПрдХ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рд╡рд░реНрдХрдЖрдЙрдЯ рдХрд┐рдпрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рд╕реНрдЯреИрдХ рдореЗрдВ рд╢реБрд░реВ рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ Redux-Saga рд╢рд╛рдорд┐рд▓ рд╣реИ - рдЗрд╕реЗ рд╕реАрдзреЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ рдХрд╣реЗрдВ, Redux рдкрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░, рдЬреЛ рд╕рд╛рдЗрдб рдЗрдлреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реЗ рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдиреЛрдЯрдмреБрдХ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЗрд╕ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рдХреА рддрд░рд╣ рд╣реА рд╣реИред рд╣рдо рдмреИрдХрдПрдВрдб рдкрд░ рдХреБрдЫ рднреЗрдЬрддреЗ рд╣реИрдВ, рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рдХреБрдЫ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╕рдм рдореВрд╡рдореЗрдВрдЯ Redux-Saga рдХреЗ рдЕрдВрджрд░ рдкреНрд░реЛрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рдпрд╣ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдлреНрд░рдВрдЯреЗрдВрдб рдореЗрдВ рдлреЗрдВрдХрддрд╛ рд╣реИ, рдЙрд╕реЗ рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ рдХрд┐ UI рдореЗрдВ рдХреНрдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╣реИред
рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рд╣реИ? рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ рдХреЛ рдПрдХ рдиреЛрдЯрдмреБрдХ рдХреЗ рд╕рд╛рде рдЖрдИрдлреНрд░реЗрдо рдореЗрдВ рдмрдирд╛рдпрд╛ рдФрд░ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рдПрдХ iframe рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рдмрд╛рд╣рд░ рд╕реЗ рдЖрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ рдкреНрд░рд╛рдкреНрдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдорд╣рд╕реВрд╕ рдХрд░рддреЗ рд╣реБрдП рдХрд┐ рдЙрд╕реЗ рдиреЛрдЯрдмреБрдХ рд░рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╡рд╣ рдЗрд╕ рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдмрджрд▓реЗ рдореЗрдВ, рдЕрдиреБрд░реЛрдз рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ рднреЗрдЬрддрд╛ рд╣реИред
рдЬрдм рд╣рдо "рдЪреЗрдХ рдЯрд╛рд╕реНрдХ" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдВрдмрдВрдзрд┐рдд рдШрдЯрдирд╛ Redux рд╕реНрдЯреЛрд░ рдкрд░ рднреЗрдЬреА рдЬрд╛рддреА рд╣реИ: "рддреЛ рдФрд░ рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЪреЗрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред" Redux-Saga рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИ рдФрд░ рдПрдХ iframe рдореЗрдВ рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ рдХрд░рддрд╛ рд╣реИред рдЕрдм рд╡рд╣ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдлреНрд░реЗрдо рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣реА рд╣реИред рдЗрд╕ рдмреАрдЪ, рд╣рдорд╛рд░рд╛ рдЫрд╛рддреНрд░ рдмрдЯрди рдкрд░ рдбрд╛рдЙрдирд▓реЛрдб рд╕рдВрдХреЗрддрдХ рджреЗрдЦрддрд╛ рд╣реИ "рдХрд╛рд░реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ" рдФрд░ рд╕рдордЭрддрд╛ рд╣реИ рдХрд┐ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рд▓рдЯрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди "рд╕реЛрдЪрддрд╛ рд╣реИ"ред рдФрд░ рдХреЗрд╡рд▓ рдЬрдм рдкреЛрд╕реНрдЯрдореЗрдЬрд╝реЗрдЬ рдпрд╣ рдХрд╣рддреЗ рд╣реБрдП рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ рдХрд┐ рдмрдЪрдд рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИ, Redux-Saga рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдмреИрдХрдПрдВрдб рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдкрд░ рдХрд╛рд░реНрдп рдХреА рдЬрд╛рдБрдЪ рдХреА рдЬрд╛рддреА рд╣реИ - рд╕рд╣реА рд╕рдорд╛рдзрд╛рди рдпрд╛ рдирд╣реАрдВ, рдпрджрд┐ рдЧрд▓рддрд┐рдпрд╛рдБ рдХреА рдЬрд╛рддреА рд╣реИрдВ, рддреЛ рдХреМрди рд╕рд╛, рдЖрджрд┐, рдФрд░ рдпрд╣ рдЬрд╛рдирдХрд╛рд░реА рдмрдбрд╝реЗ рдХрд░реАрдиреЗ рд╕реЗ Redux Store рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИред рдФрд░ рд╡рд╣рд╛рдВ рд╕реЗ, рдлреНрд░рдВрдЯ-рдПрдВрдб рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рда рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЦреАрдВрдЪрддреА рд╣реИред
рдпрд╣рд╛рдБ рдЖрд░реЗрдЦ рд╣реИ рдХрд┐ рдЕрдВрдд рдореЗрдВ рдмрд╛рд╣рд░ рдЖрдпрд╛ рд╣реИ:
(1) рд╣рдо рдмрдЯрди рджрдмрд╛рддреЗ рд╣реИрдВ "рдХрд╛рд░реНрдп рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ" (рдЪреЗрдХ рдХрд░реЗрдВ) тЖТ (2) рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрддреЗ рд╣реИрдВ CHECK_NOTEBOOK_REQUEST тЖТ (3) рд╣рдо рдЪреЗрдХ рдХреА рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрддреЗ рд╣реИрдВ тЖТ (2) рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрддреЗ рд╣реИрдВ SAOTEBOOK_REQUEST тЖТ (3) рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рднреЗрдЬрддреЗ рд╣реИрдВ рдФрд░ iframe рдореЗрдВ рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ рд╕реЗрд╡ рдХрд░рддреЗ рд╣реИрдВред (рек) рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ тЖТ (рел) рдиреЛрдЯрдмреБрдХ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ тЖТ (рек) рдЬреБрдкрд┐рдЯрд░ рдПрдкреАрдЖрдИ рд╕реЗ рдШрдЯрдирд╛ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдХрд┐ рдиреЛрдЯрдмреБрдХ рдХреЛ рд╕рд╣реЗрдЬ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдкреЛрд╕реНрдЯрдореЗрдЬреЗрдЬ рдиреЛрдЯрдмреБрдХ-рд╕рд╣реЗрдЬреЗ рдЧрдП тЖТ (рез) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдШрдЯрдирд╛ тЖТ (реи) рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬреЗрдВ SAVE_NITEBOOK_SUCCESS тЖТ (рей) рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдиреЛрдЯрдмреБрдХ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬреЗрдВ тЖТ (6) тЖТ (7) рдЬрд╛рдВрдЪреЗрдВ рдХрд┐ рдпрд╣ рдиреЛрдЯрдмреБрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╣реИ тЖТ (8) тЖТ (7) рдиреЛрдЯрдмреБрдХ рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдВ тЖТ (5) рдХреЛрдб рд▓реМрдЯрд╛рдПрдВ тЖТ (7) рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ тЖТ (9) ) тЖТ (7) рд╣рдореЗрдВ рдХрдЯ рдорд┐рд▓рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдЬрд╛рдВрдЪ тЖТ (6) тЖТ (3) рд╣рдо рдХрд╛рд░реНрд░рд╡рд╛рдИ CHECK_NOTEBOOK_SUCCESS рднреЗрдЬ тЖТ (2) рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдХреНрд╖реАрдп рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ тЖТ (1) рдкрд░рд┐рдгрд╛рдо рдбреНрд░рд╛рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рд╕рдм рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдЕрдВрдд рдореЗрдВ trainer_type_jupyter.jsx рд╣реИ - рдЙрд╕ рдкреГрд╖реНрда рдХреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЬрд╣рд╛рдВ рд╣рдорд╛рд░реА рдиреЛрдЯрдмреБрдХ рдЦреАрдВрдЪреА рдЧрдИ рд╣реИред
<div className="trainer__right-column"> {notebookLinkIsLoading ? ( <iframe className="trainer__jupiter-frame" ref={this.onIframeRef} src={notebookLink} /> ) : ( <Spin size="l" mix="trainer__jupiter-spin" /> )} </div>
"рдЪреЗрдХ рдЬреЙрдм" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рд╣реИрдВрдбрд▓рдЪреЗрдХ рд╡рд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред
handleCheckTasks = () => { const {checkNotebook, lesson} = this.props; checkNotebook({id: lesson.id, iframe: this.iframeRef}); };
рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣реИрдВрдбрд▓рдЪреЗрдХ рдХрд╛рд░реНрдп рдкрд╛рд░рд┐рдд рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде Redux рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИред
export const checkNotebook = getAsyncActionsFactory(CHECK_NOTEBOOK).request;
рдпрд╣ Redux-Saga рдФрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рддрд░реАрдХреЛрдВ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХреА рдЧрдИ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рдХреНрд░рд┐рдпрд╛ рд╣реИред рдпрд╣рд╛рдБ getAsyncActionsFactory рддреАрди рдХрд╛рд░реНрдп рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ:
// рдмрд░реНрддрди / рджреБрдХрд╛рди-рд╕рд╣рд╛рдпрдХ / async.js
export function getAsyncActionsFactory(type) { const ASYNC_CONSTANTS = getAsyncConstants(type); return { request: payload => ({type: ASYNC_CONSTANTS.REQUEST, payload}), error: (response, request) => ({type: ASYNC_CONSTANTS.ERROR, response, request}), success: (response, request) => ({type: ASYNC_CONSTANTS.SUCCESS, response, request}), } }
рддрджрдиреБрд╕рд╛рд░, getAsyncConstants рдлреЙрд░реНрдо рдХреЗ рддреАрди рд╕реНрдерд┐рд░рд╛рдВрдХ * _REQUEST, * _SUCCESS рдФрд░ * _ERROR рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реА Redux-Saga рдЗрд╕ рдЕрд░реНрдерд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓реЗрдЧреА:
// trainer.saga.js
function* watchCheckNotebook() { const watcher = createAsyncActionSagaWatcher({ type: CHECK_NOTEBOOK, apiMethod: Api.checkNotebook, preprocessRequestGenerator: function* ({id, iframe}) { yield put(trainerActions.saveNotebook({iframe})); yield take(getAsyncConstants(SAVE_NOTEBOOK).SUCCESS); return {id}; }, successHandlerGenerator: function* ({response}) { const {completed_tests: completedTests} = response; for (let id of completedTests) { yield put(trainerActions.setTaskSolved(id)); } }, errorHandlerGenerator: function* ({response: error}) { yield put(appActions.setNetworkError(error)); } }); yield watcher(); }
рдЬрд╛рджреВ? рдХреБрдЫ рднреА рдЕрд╕рд╛рдзрд╛рд░рдг рдирд╣реАрдВред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, createAsyncActionSagaWatcher рдмрд╕ рдПрдХ рд╡реЙрдЯрд░рдорд╛рд░реНрдХ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдбреЗрдЯрд╛ рдХреЛ рдПрдХреНрд╢рди рдореЗрдВ рдЖрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ URL рдкрд░ рдПрдХ рдЕрдиреБрд░реЛрдз рдХрд░ рд╕рдХрддрд╛ рд╣реИ, * _REQUEST рдПрдХреНрд╢рди рдХреЛ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рд╕рдлрд▓ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рдж * _SCCCCESS рдФрд░ * _ERROR рдХреЛ рдкреНрд░реЗрд╖рдг рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП, рдШрдбрд╝реА рдХреЗ рдЕрдВрджрд░ рд╣реИрдВрдбрд▓рд░ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдЖрдкрдиреЗ рд╢рд╛рдпрдж рджреЗрдЦрд╛ рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░реАрдкреНрд░реЛрд╕реЗрд╕рд░ рдореЗрдВ рд╣рдо рдПрдХ рдФрд░ Redux-Saga рдХрд╣рддреЗ рд╣реИрдВ, рдЬрдм рддрдХ рдпрд╣ SUCCESS рдХреЗ рд╕рд╛рде рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛, рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦреЗрдВред рдФрд░ рд╣рд╛рдВ, iframes рдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рднреЗрдЬрдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ id рджреЗрддреЗ рд╣реИрдВред
SaveNotebook рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдХрд░реАрдм рд╕реЗ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ:
function* saveNotebook({payload: {iframe}}) { iframe.contentWindow.postMessage(JSON.stringify({ type: 'save-notebook' }), '*'); yield; }
рд╣рдо рд╕рд╛рдордиреЗ рд╡рд╛рд▓реЗ рдХреЗ рд╕рд╛рде iframes рдХреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддрдВрддреНрд░ рддрдХ рдкрд╣реБрдВрдЪ рдЧрдП рд╣реИрдВ - рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬред рджрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЯреБрдХрдбрд╝рд╛ рд╕реЗрд╡-рдиреЛрдЯрдмреБрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрд░рд╡рд╛рдИ рднреЗрдЬрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдЗрдлреНрд░реЗрдо рдХреЗ рдЕрдВрджрд░ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдиреЛрдЯрдмреБрдХ рдХреЗ рдЕрдВрджрд░ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпреЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреЗ рд╣реИрдВ:
define([ 'base/js/namespace', 'base/js/events' ], function( Jupyter, events ) {...});
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдПрдкреАрдЖрдИ рд╕реЗ рдирд┐рдкрдЯрдирд╛ рд╣реЛрдЧрд╛ред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЗрд╕ рдкрд░ рдХреЛрдИ рд╕реНрдкрд╖реНрдЯ рджрд╕реНрддрд╛рд╡реЗрдЬ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди
рд╕реНрд░реЛрдд рдХреЛрдб рдЙрдкрд▓рдмреНрдз рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╡рд┐рд▓рдореНрдм рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХреЛрдб рд╡рд╣рд╛рдВ рдкрдврд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИред
рдкрд╛рда рдХреЗ рдлреНрд░рдВрдЯ рдореЗрдВ рдкреИрд░реЗрдВрдЯ рд╡рд┐рдВрдбреЛ рдХреЗ рд╕рд╛рде рд╕рдВрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рд╕рд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП: рдЖрдЦрд┐рд░рдХрд╛рд░, рдЙрдирдХреЗ рдмреАрдЪ рдХреА desync рдХрд╛рд░реНрдп рд╕рддреНрдпрд╛рдкрди рдХреЗ рд╕рд╛рде рдмрдЧ рдХрд╛ рдХрд╛рд░рдг рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо рдЙрди рд╕рднреА рд╕рдВрджреЗрд╢реЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ:
window.addEventListener('message', actionListener);
рдЕрдм рд╣рдо рдЙрдирдХрд╛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░реЗрдВрдЧреЗ:
function actionListener({data: eventString}) { let event = ''; try { event = JSON.parse(eventString); } catch(e) { return; } switch (event.type) { case 'save-notebook': Jupyter.actions.call('jupyter-notebook:save-notebook'); Break; ... default: break; } }
рд╣рдорд╛рд░реЗ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдлрд┐рдЯ рдирд╣реАрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╕рднреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рд╛рд╣рд╕рдкреВрд░реНрд╡рдХ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрд╡-рдиреЛрдЯрдмреБрдХ рдЗрд╡реЗрдВрдЯ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдиреЛрдЯрдмреБрдХ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрджреЗрд╢ рд╡рд╛рдкрд╕ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдХрд┐ рдиреЛрдЯрдмреБрдХ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
events.on('notebook_saved.Notebook', actionDispatcher); function actionDispatcher(event) { switch (event.type) { case 'select': const selectedCell = Jupyter.notebook.get_selected_cell(); dispatchEvent({ type: event.type, data: {taskId: getCellTaskId(selectedCell)} }); return; case 'notebook_saved': default: dispatchEvent({type: event.type}); } } function dispatchEvent(event) { return window.parent.postMessage( typeof event === 'string' ? event : JSON.stringify(event), '*' ); }
рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдмрд╕ {рдЯрд╛рдЗрдк рдХрд░реЗрдВ:, рдиреЛрдЯрдмреБрдХ_рд╕рд╛рд╡реЗрдж тАЩ} рдКрдкрд░ рднреЗрдЬреЗрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдиреЛрдЯрдмреБрдХ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдЖрдЗрдП рдЕрдкрдиреЗ рдШрдЯрдХ рдкрд░ рд╡рд╛рдкрд╕ рдЬрд╛рдПрдВ:
//trainer_type_jupyter.jsx
componentDidMount() { const {getNotebookLink, lesson} = this.props; getNotebookLink({id: lesson.id}); window.addEventListener('message', this.handleWindowMessage); }
рдШрдЯрдХ рдмрдврд╝рддреЗ рд╕рдордп, рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдиреЛрдЯрдмреБрдХ рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП рдкреВрдЫрддреЗ рд╣реИрдВ рдФрд░ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕рджрд╕реНрдпрддрд╛ рд▓реЗрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЙрдбрд╝рд╛рди рднрд░ рд╕рдХрддреЗ рд╣реИрдВ:
handleWindowMessage = ({data: eventString}) => { const {activeTaskId, history, match: {params}, setNotebookSaved, tasks} = this.props; let event = null; try { event = JSON.parse(eventString); } catch(e) { return; } const {type, data} = event; switch (type) { case 'app_initialized': this.selectTaskCell({taskId: activeTaskId}) return; case 'notebook_saved': setNotebookSaved(); return; case 'select': { const taskId = data && data.taskId; if (!taskId) { return } const task = tasks.find(({id}) => taskId === id); if (task && task.status === TASK_STATUSES.DISABLED) { this.selectTaskCell({taskId: null}) return; } history.push(reversePath(urls.trainerTask, {...params, taskId})); return; } default: break; } };
рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╕реЗрдЯрдиреЛрдЯрдмреБрдХ рд╕реЗрд╡реНрдб рдПрдХреНрд╢рди рдкреНрд░реЗрд╖рдг рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ Redux-Saga рдХреЛ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрдиреЗ рдФрд░ рдиреЛрдЯрдмреБрдХ рдХреЛ рдмрдЪрд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рдкрд╕рдВрдж рдХреА рдЧрдбрд╝рдмрдбрд╝
рд╣рдо рдиреЛрдЯрдмреБрдХ рд╕рдВрд░рдХреНрд╖рдг рдмрдЧ рдХреЗ рд╕рд╛рде рдореБрдХрд╛рдмрд▓рд╛ рдХрд┐рдпрд╛ред рдФрд░ рддреБрд░рдВрдд рдПрдХ рдирдИ рд╕рдорд╕реНрдпрд╛ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░ рджрд┐рдпрд╛ред рдХрд╛рд░реНрдпреЛрдВ (рдХрд╛рд░реНрдпреЛрдВ) рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рдирд╛ рд╕реАрдЦрдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛, рдЬрд┐рд╕рд╕реЗ рдЫрд╛рддреНрд░ рдЕрднреА рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪ рдкрд╛рдпрд╛ рдерд╛ред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рд╣рдорд╛рд░реЗ рдЗрдВрдЯрд░рдПрдХреНрдЯрд┐рд╡ рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдФрд░ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдХреЗ рдмреАрдЪ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛: рдПрдХ рдкрд╛рда рдХреЗ рдЕрдВрджрд░, рд╣рдо рдПрдХ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде iframe рдореЗрдВ рдмреИрдареЗ рдереЗ, рдЙрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЗ рдмреАрдЪ, рдЬрд┐рдиреНрд╣реЗрдВ рд╕рдВрдкреВрд░реНрдг рд░реВрдк рд╕реЗ рдкрд╛рда рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд╕рд╛рде рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рдирд╛ рдерд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддрд╛рдХрд┐ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рдкрд╛рда рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рджреВрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рдЕрдиреБрд░реВрдк рд╕реЗрд▓ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд: рдпрджрд┐ рдЬреБрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдлреНрд░реЗрдо рдореЗрдВ рдЖрдк рддреАрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдмрдВрдзреЗ рдПрдХ рд╕реЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдПрдбреНрд░реЗрд╕ рдмрд╛рд░ рдореЗрдВ URL рдХреЛ рддреБрд░рдВрдд рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рддрджрдиреБрд╕рд╛рд░, рдкрд╛рда рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рддреАрд╕рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рд╕рд╛рде рдкрд╛рда рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдзрд┐рдХ рдХрдард┐рди рдХрд╛рд░реНрдп рдерд╛ред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкрд╛рда рдФрд░ рдЕрд╕рд╛рдЗрдирдореЗрдВрдЯ рдХреЗ рд▓рдЧрд╛рддрд╛рд░ рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕ рдмреАрдЪ, рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдмреГрд╣рд╕реНрдкрддрд┐ рдиреЛрдЯрдмреБрдХ рдореЗрдВ, рдХреБрдЫ рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдХрд┐рд╕реА рднреА рд╕реЗрд▓ рдХреЛ рдЦреЛрд▓рдиреЗ рд╕реЗ рд░реЛрдХрддрд╛ рд╣реИред рдФрд░ рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдПрдХ рдЕрд▓рдЧ рдХрд╛рд░реНрдп рд╣реИред рдпрд╣ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рдФрд░ рддреАрд╕рд░реЗ рдХрд╛рдо рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░реЗ рдХреЛ рдЫреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдкрд╛рда рдХреЗ рдЧреИрд░-рд░реЗрдЦреАрдп рдкрд╛рд░рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдЬреЛрдЦрд┐рдо рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдирд╛ рдкрдбрд╝рд╛ред
рд╕рдорд╛рдзрд╛рди рдПрдХ рд╣реА рдкреЛрд╕реНрдЯрдореЗрд╕реЗрдЬ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдерд╛ред рдХреЗрд╡рд▓ рд╣рдореЗрдВ рдмреГрд╣рд╕реНрдкрддрд┐ рдиреЛрдЯрдмреБрдХ рдПрдкреАрдЖрдИ рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рдЬреЛ рдХрд┐ рдмреГрд╣рд╕реНрдкрддрд┐ рд╡рд╕реНрддреБ рд╕реНрд╡рдпрдВ рд╣реА рдХрд░ рд╕рдХрддреА рд╣реИ, рдореЗрдВ рдЖрдЧреЗ рдХреА рдУрд░ рдЭреБрдХрдирд╛ рдерд╛ред рдФрд░ рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддрдВрддреНрд░ рдХреЗ рд╕рд╛рде рдЖрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрд▓ рдХрд┐рд╕ рдХрд╛рд░реНрдп рд╕реЗ рдЬреБрдбрд╝реА рд╣реИред рдЕрдкрдиреЗ рд╕рдмрд╕реЗ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рдореЗрдВ, рдпрд╣ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИред рдиреЛрдЯрдмреБрдХ рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ, рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдЬрд╛рддреА рд╣реИрдВред рдЙрдирдХреЗ рдкрд╛рд╕ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдореЗрдЯрд╛рдбрд╛рдЯрд╛ рдореЗрдВ "рдЯреИрдЧ" рдлрд╝реАрд▓реНрдб рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЯреИрдЧ рд╕рдмрдХ рдХреЗ рдЕрдВрджрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдХреЗрд╡рд▓ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЯреИрдЧрд┐рдВрдЧ рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдм рддрдХ рдЫрд╛рддреНрд░ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрд╛ рдирд╣реАрдВред рдирддреАрдЬрддрди, рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдХреЗ рдореМрдЬреВрджрд╛ рдореЙрдбрд▓ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ, рд╣рдо iframe рд╕реЗ рдкреЛрд╕реНрдЯрдореЗрд╕реЗрдЬ рдХреЛ рдЕрдкрдиреЗ рдлреНрд░рдВрдЯрдПрдВрдб рдкрд░ рднреЗрдЬрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ, Redux рд╕реНрдЯреЛрд░ рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХрд╛рд░реНрдп рдХреЗ рдЧреБрдгреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ, рдХрд┐ рдХреНрдпрд╛ рдпрд╣ рдЕрднреА рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрджрд┐ рдЕрдиреБрдкрд▓рдмреНрдз рд╣реИ, рддреЛ рд╣рдо рдкрд┐рдЫрд▓реЗ рд╕рдХреНрд░рд┐рдп рд╕реЗрд▓ рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╣реИрдВред
рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдпрд╣ рд╣рд╛рд╕рд┐рд▓ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдХрд┐ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рд╕реЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рдЕрд╕рдВрднрд╡ рд╣реИ рдЬреЛ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рд╕рдордпрд░реЗрдЦрд╛ рджреНрд╡рд╛рд░рд╛ рд╕реБрд▓рдн рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рд╕рдЪ рд╣реИ, рдЗрд╕рдиреЗ рдПрдХ рдЕрд▓реМрдХрд┐рдХ, рд▓реЗрдХрд┐рди рдмрдЧ рдХреЛ рдЬрдиреНрдо рджрд┐рдпрд╛: рдЖрдк рдПрдХ рджреБрд░реНрдЧрдо рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдПрдХ рд╕реЗрд▓ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рдЬрд▓реНрджреА рд╕реЗ "рдмреНрд▓рд┐рдВрдХ" рдХрд░рддрд╛ рд╣реИ: рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдкрд▓ рдХреЗ рд▓рд┐рдП рд╕рдХреНрд░рд┐рдп рдерд╛, рд▓реЗрдХрд┐рди рддреБрд░рдВрдд рдЕрд╡рд░реБрджреНрдз рд╣реЛ рдЧрдпрд╛ рдерд╛ред рдЬрдмрдХрд┐ рд╣рдордиреЗ рдЗрд╕ рдЦреБрд░рджрд░реЗрдкрди рдХреЛ рдЦрддреНрдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣ рд╕рдмрдХ рд▓реЗрдиреЗ рдореЗрдВ рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рд╣рдо рдпрд╣ рд╕реЛрдЪрддреЗ рд░рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯреЗрдВ (рд╡реИрд╕реЗ, рдХреНрдпрд╛ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ?)ред
рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдЕрдкрдиреЗ рджреГрд╢реНрдп рдХреЛ рдХреИрд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд┐рдпрд╛, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛ред рдЪрд▓рд┐рдП рдлрд┐рд░ рд╕реЗ trainer_type_jupyter.jsx рдХреА рдУрд░ рдореБрдбрд╝рддреЗ рд╣реИрдВ - рд╣рдо app_initialized рдФрд░ рдЪрдпрди рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред
App_initialized рдХреЗ рд╕рд╛рде, рд╕рдм рдХреБрдЫ рдкреНрд░рд╛рдердорд┐рдХ рд╣реИ: рдиреЛрдЯрдмреБрдХ рдиреЗ рд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╣рдо рдХреБрдЫ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЪрдпрдирд┐рдд рдХрд╛рд░реНрдп рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╡рд░реНрддрдорд╛рди рд╕реЗрд▓ рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рдкреНрд▓рдЧрдЗрди рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЯрд╛рд╕реНрдХрдЖрдИрдб рдкрд╛рд╕ рдХрд░ рд╕рдХреЗрдВ рдФрд░ рдЗрд╕ рдЯрд╛рд╕реНрдХрдЖрдИрдб рдХреЗ рдЕрдиреБрд░реВрдк рдкрд╣рд▓реА рд╕реЗрд▓ рдореЗрдВ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХреЗрдВред
рдЕрд░реНрдерд╛рддреН:
// trainer_type_jupyter.jsx
selectTaskCell = ({taskId}) => { const {selectCell} = this.props; if (!this.iframeRef) { return; } selectCell({iframe: this.iframeRef, taskId}); };
// trainer.actions.js
export const selectCell = ({iframe, taskId}) => ({ type: SELECT_CELL, iframe, taskId });
// trainer.saga.js
function* selectCell({iframe, taskId}) { iframe.contentWindow.postMessage(JSON.stringify({ type: 'select-cell', data: {taskId} }), '*'); yield; } function* watchSelectCell() { yield takeEvery(SELECT_CELL, selectCell); }
// custom.js (рдЬреНрдпреВрдкрд┐рдЯрд░ рдкреНрд▓рдЧрдЗрди)
function getCellTaskId(cell) { const notebook = Jupyter.notebook; while (cell) { const tags = cell.metadata.tags; const taskId = tags && tags[0]; if (taskId) { return taskId; } cell = notebook.get_prev_cell(cell); } return null; } function selectCell({taskId}) { const notebook = Jupyter.notebook; const selectedCell = notebook.get_selected_cell(); if (!taskId) { selectedCell.unselect(); return; } if (selectedCell && selectedCell.selected && getCellTaskId(selectedCell) === taskId) { return; } const index = notebook.get_cells() .findIndex(cell => getCellTaskId(cell) === taskId); if (index < 0) { return; } notebook.select(index); const cell = notebook.get_cell(index); cell.element[0].scrollIntoView({ behavior: 'smooth', block: 'start' }); } function actionListener({data: eventString}) { ... case 'select-cell': selectCell(event.data); break;
рдЕрдм рдЖрдк рд╕реЗрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ iframe рд╕реЗ рд╕реАрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реЗрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рд╕реЗрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, рд╣рдо URL рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдп рдореЗрдВ рдЖрддреЗ рд╣реИрдВред рдпрд╣ рдХреЗрд╡рд▓ рд╡рд┐рдкрд░реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реА рд░рд╣рддрд╛ рд╣реИ - рдЬрдм рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рдХрд╛рд░реНрдп рдХреЛ рдЪреБрдирддреЗ рд╣реИрдВ, рддреЛ рд╕реЗрд▓ рдХреЛ рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВред рдЖрд╕рд╛рди:
componentDidUpdate({match: {params: {prevTaskId}}) { const {match: {params: {taskId}}} = this.props; if (taskId !== prevTaskId) { this.selectTaskCell({taskId});
рдкреВрд░реНрдгрддрд╛рд╡рд╛рджрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдмреЙрдпрд▓рд░
рдпрд╣ рд╣рдо рдХрд┐рддрдирд╛ рдЕрдЪреНрдЫрд╛ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд┐рд░реНрдл рдбреАрдВрдЧ рдорд╛рд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рдореЗрдВ рд╕рдорд╛рдзрд╛рди рдкреНрд░рднрд╛рд╡реА рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдереЛрдбрд╝рд╛ рдЧрдбрд╝рдмрдбрд╝ рджрд┐рдЦрддрд╛ рд╣реИ: рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рдмрд╛рд╣рд░ рд╕реЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрджреЗрд╢ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдПрдХ iframe рд╕реЗ) рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреА рд╣реИред рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╣рдордиреЗ рдЦреБрдж рдХреЛ рдмрдирд╛рдпрд╛ рд╣реИ, рдРрд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬреЛ рдореИрдВ, рдФрд░ рд╕рд╣рдХрд░реНрдореА рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
тАв рддрддреНрд╡реЛрдВ рдХреА рдмрд╛рддрдЪреАрдд рдореЗрдВ рдХреЛрдИ рд▓рдЪреАрд▓рд╛рдкрди рдирд╣реАрдВ рд╣реИ: рдЬрдм рднреА рд╣рдо рдирдИ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдкреНрд▓рдЧрдЗрди рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ рддрд╛рдХрд┐ рдпрд╣ рдкреБрд░рд╛рдиреЗ рдФрд░ рдирдП рд╕рдВрдЪрд╛рд░ рдкреНрд░рд╛рд░реВрдк рджреЛрдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░реЗред рдЖрдЗрдлреНрд░реЗрдо рдФрд░ рд╣рдорд╛рд░реЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рдШрдЯрдХ рдХреЗ рдмреАрдЪ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдПрдХрд▓ рдкреГрдердХ рддрдВрддреНрд░ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдкрд╛рда рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдЬреНрдпреВрдкрд┐рдЯрд░ рдиреЛрдЯрдмреБрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ - рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рдкреНрд░рдгрд╛рд▓реА рдмрдирд╛рдиреЗ рдХреА рдЗрдЪреНрдЫрд╛ рд╣реИ рддрд╛рдХрд┐ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдирдП рдХрд╛рд░реНрдпреЛрдВ, рдШрдЯрдирд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛред рдФрд░ рди рдХреЗрд╡рд▓ рдмреГрд╣рд╕реНрдкрддрд┐ рдиреЛрдЯрдмреБрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдмрд▓реНрдХрд┐ рд╕рд┐рдореБрд▓реЗрдЯрд░реЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЖрдЗрдлреНрд░реЗрдо рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рднреАред рдЗрд╕рд▓рд┐рдП рд╣рдо рдкреЛрд╕реНрдЯ-рдореЗрд╕реЗрдЬ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд▓рдЧ-рдЗрди рдХреЛрдб рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд▓рдЧ-рдЗрди рдХреЗ рдЕрдВрджрд░ рдЗрд╕реЗ (eval) рд░реЗрдВрдбрд░ рдХрд░рддреЗ рд╣реИрдВред
тАв рдХреЛрдб рдХреЗ рдЯреБрдХрдбрд╝реЗ рдЬреЛ рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдкреВрд░реЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдмрд┐рдЦрд░реЗ рд╣реБрдП рд╣реИрдВред рдЗрдлреНрд░реЗрдореНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЪрд╛рд░ Redux-Saga рдФрд░ рдШрдЯрдХ рд╕реЗ рджреЛрдиреЛрдВ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╖реНрдЯрддрдо рдирд╣реАрдВ рд╣реИред
тАв Jupyter рдиреЛрдЯрдмреБрдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде iframe рдЦреБрдж рдПрдХ рдФрд░ рд╕реЗрд╡рд╛ рдкрд░ рдмреИрдард╛ рд╣реИ рдЗрд╕реЗ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдирд╛ рдереЛрдбрд╝рд╛ рд╕рдорд╕реНрдпрд╛рдЧреНрд░рд╕реНрдд рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдореЗрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд╕рд╛рдордиреЗ рдХреЗ рдЫреЛрд░ рдкрд░ рдФрд░ рдиреЛрдЯрдмреБрдХ рдореЗрдВ рд╣реА рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рддрд░реНрдХ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рджреЛрд╣рд░рд╛ рдХрд╛рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
тАв рдХрдИ рдЖрд╕рд╛рди рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХрдо рд╕реЗ рдХрдо рд░рд┐рдПрдХреНрдЯ рдХрд░реЗрдВред рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЬреАрд╡рди рдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдПрдХ рдЯрди рд╣реИ, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдЦреБрдж рдХреЛ рд░рд┐рдПрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рдмрдВрдзрди рд╕реЗ рднреНрд░рдорд┐рдд рд╣реВрдВред рдЖрджрд░реНрд╢ рд░реВрдк рд╕реЗ, рдореИрдВ рд╣рдорд╛рд░реЗ iframes рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ рдЖрдкрдХрд╛ рдлреНрд░рдВрдЯ-рдПрдВрдб рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреНрдпрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЪреБрдиреА рдЧрдИ рддрдХрдиреАрдХреЛрдВ рдХрд╛ рдкреНрд░рддрд┐рдЪреНрдЫреЗрджрди рд╕реАрдорд╛рдПрдВ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ: рд╡рд╣реА Redux-Saga рд╣рдорд╕реЗ Redux рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, рдкреЛрд╕реНрдЯрдореИрд╕реЗрдЬ рдирд╣реАрдВред
рдЗрд╕рд▓рд┐рдП рдЬреЛ рд╣рд╛рд╕рд┐рд▓ рд╣реБрдЖ рд╣реИ, рдЙрд╕ рдкрд░ рд╣рдо рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд░реЛрдХ рдирд╣реАрдВ рд▓рдЧрд╛рдПрдВрдЧреЗред рдПрдХ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рджреБрд╡рд┐рдзрд╛: рдЖрдк рд╕реБрдВрджрд░рддрд╛ рдХреЗ рдкрдХреНрд╖ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдкреНрд░рджрд░реНрд╢рди рдХреА рдЕрдиреБрдХреВрд▓рддрд╛, рдпрд╛ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдмрд▓рд┐рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдЕрднреА рддрдХ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рдорд┐рд▓рд╛ рд╣реИред
рд╢рд╛рдпрдж рдЖрдкрдХреЗ рд╕рд╛рде рд╡рд┐рдЪрд╛рд░ рдЖрддреЗ рд╣реИрдВ?