рдореИрдВрдиреЗ рдЕрднреА-рдЕрднреА рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдм рддрдХ рдореБрдЭреЗ рдпрд╣ рдкрд╕рдВрдж рд╣реИред рдПрдХ рдЪреАрдЬ рдЬрд┐рд╕рд╕реЗ рдореИрдВрдиреЗ рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛ рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╢реБрджреНрдз "рд╕реНрдЯреЗрдЯрд▓реЗрд╕" рдШрдЯрдХреЛрдВ рд╕реЗ рдХреИрд╕реЗ рдирд┐рдкрдЯрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рдореЗрдВ рд░рд╛рдЬреНрдп рдХреЛ рд╕рдорд╛рд╣рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЪреЗрдХрдмреЙрдХреНрд╕ рд╣реИ рдЬреЛ checked
рдкреНрд░реЛрдк рд▓реЗрддрд╛ рд╣реИред рдЪреЗрдХрдмреЙрдХреНрд╕ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдЙрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдЪрд╛рд▓реВ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ onChange
, рдФрд░ рдПрдХ рдЕрджреНрдпрддрди checked
рдкреНрд░реЛрдк рд╡рд╛рдкрд╕ рдкрд╛рдиреЗ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡реЛрддреНрддрдо рдкреНрд░рдерд╛рдУрдВ рдкрд░ рдХреЛрдИ рджрд╕реНрддрд╛рд╡реЗрдЬ рдкреНрд░рддреАрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ https://github.com/storybooks/storybook/issues/197 рдЬреИрд╕реЗ рдореБрджреНрджреЛрдВ рдореЗрдВ рд╕реБрдЭрд╛рд╡ рдПрдХ рд░реИрдкрд░ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╛ рдПрдХ рдФрд░ рдРрдб-рдСрди рдЬреЛрдбрд╝реЗрдВред рдЕрдЧрд░ рдореИрдВ рдЗрд╕рдХреА рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ рддреЛ рдореИрдВ рдПрдХ рдШрдЯрдХ рдЖрд╡рд░рдг рдирд╣реАрдВ рдмрдирд╛рдКрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЕрдкрдиреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рд╕рд░рд▓ рд░рдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред
рдПрдХ рд╡рд┐рдЪрд╛рд░ рдЬреЛ рдореБрдЭреЗ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рдерд╛, рд╡рд╣ рд╣реИ actions
рдРрдб-рдСрди рдХреЛ knobs
рд╕рд╛рде рд╡рд╛рдпрд░ рдХрд░рдирд╛, рдЬрд┐рд╕рд╕реЗ рдиреЙрдмреНрд╕ рдХреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЯреЙрдЧрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдХрдо рд╕реЗ рдХрдо рд╕реБрдЭрд╛рд╡ рджреЗрдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред
рдХрд╣рд╛рдирд┐рдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдореЗрдВ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдПрдХ рдареЛрдХрд░ рд╣реИ, рдФрд░ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдПрдХ рд░реИрдкрд░ рдШрдЯрдХ рдмрдирд╛рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рдмрд╛рдд рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЬреЛрдбрд╝реЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рдХреИрд╕реЗ рдкреВрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдП?
рдЗрд╕ #3701 рдкреАрдЖрд░ рдореЗрдВ рдХреБрдЫ рдЗрд╕реА рддрд░рд╣ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬреЛ рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдерд╛ (рдФрд░ рд╡рд┐рд▓рдп рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛)ред
рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдлрд┐рд░ рд╕реЗ рдПрдХ рдЪрд░реНрдЪрд╛ рдЦреЛрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдкреАрдЖрдИ рд╕реБрдЭрд╛рд╡реЛрдВ рдХреЛ рд╕реБрди рд╕рдХрддреЗ рд╣реИрдВ =)ред
рдЖрд╣ рдзрдиреНрдпрд╡рд╛рдж, рдореИрдВрдиреЗ рд╡рд╣ рдкреАрдЖрд░ рдирд╣реАрдВ рджреЗрдЦрд╛ рдерд╛ред рдзрдиреНрдпрд╡рд╛рдж @aherriot рдЗрд╕реЗ рдПрдХ рд╕рд╛рде рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╣реА рд╡рд┐рдЪрд╛рд░ рд╣реИред
рдПрдкреАрдЖрдИ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореВрд▓рднреВрдд рдЕрд╡рдзрд╛рд░рдгрд╛ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рд╕рд╣рдорддрд┐ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдкреАрдЖрд░ рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ @Hypnosphi рд╕реЗ рдерд╛:
рдореБрдЭреЗ рдпрд╣ рддрдереНрдп рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдпрд╣ рд╕рддреНрдп рдХреЗ рдХрдИ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрддрд╛ рд╣реИ (рдШрдЯрдХ рдХреЙрд▓рдмреИрдХ рдФрд░ рдпреВрдЖрдИ рдиреЙрдмреНрд╕)
рдореБрдЭреЗ рдРрд╕рд╛ рдкреНрд░рддреАрдд рд╣реЛрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рд╕рддреНрдп рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдкрд░рд┐рдЪрдп рджреЗрдиреЗ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдШрдЯрдХ рдЕрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рдХреЗ рдПрдХ _рдПрдХрд▓_ рд╕реНрд░реЛрдд рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ - рдиреЙрдмреНрд╕ред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреНрдп рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдЖрд╡рд░рдг рдШрдЯрдХ, рд░рд╛рдЬреНрдп рдРрдб-рдСрди, рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рддреНрдп рдХрд╛ рдПрдХ рдФрд░ рд╕реНрд░реЛрдд рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рдЪреЗрдХрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ checked
рд▓рд┐рдП рдПрдХ рдШреБрдВрдбреА рдирд╣реАрдВ рд░рдЦ рдкрд╛рдКрдВрдЧрд╛, рдФрд░ рдПрдХ рд░реИрдкрд░ рдШрдЯрдХ рдХреЛ checked
рдкреНрд░реЛрдк рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреВрдВрдЧрд╛ред рдореИрдВ рдиреЙрдмреНрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреИрдирд▓ рдХреЛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдкреИрд░реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реЗ рдХреЛрдИ рдХреЙрд▓рдмреИрдХ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХрддрд░рдлрд╛ рд╣реИ рдФрд░ рди рдХрд┐ рдХреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдРрдкреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдиреЙрдмреНрд╕ рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдХрд░, рдХрд╣рд╛рдиреА рдХреЛ рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░рд╛рдЬреНрдп рдкреНрд░рдмрдВрдзрди рддрдВрддреНрд░ рдЕрдкрд╛рд░рджрд░реНрд╢реА рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкреНрд░рд╕реНрддреБрддрд┐рдХрд░рдг рдШрдЯрдХ рдЬреИрд╕реЗ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рд▓рд┐рдП рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреЗрдХрдмреЙрдХреНрд╕ рд╕реНрд╡рдпрдВ рдЗрд╕ рдмрд╛рдд рдХреА рдкрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд░реЗрдбрдХреНрд╕ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ setState
рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ withState
рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди рд╕реЗ рдХрд░рддрд╛ рд╣реЛ, рдпрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░реЙрдкреНрд╕ рджреНрд╡рд╛рд░рд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдиреЙрдмреНрд╕ред
рд╡реИрд╕реЗ рднреА рдЬреИрд╕реЗ рдореИрдВрдиреЗ рдХрд╣рд╛ рдХрд┐ рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдирдпрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕рд╣рдЬ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдЕрдЧрд░ рдореИрдВ рдСрдл-рдмреЗрд╕ рд╣реВрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╢реБрджреНрдз рд╕реНрдЯреЗрдЯрд▓реЗрд╕ рдШрдЯрдХреЛрдВ рд╕реЗ рдирд┐рдкрдЯрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдо рддреМрд░ рдкрд░ рд╕реНрд╡реАрдХреГрдд "рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕" рд╣реИ, рддреЛ рд╢рд╛рдпрдж рдХреЛрдИ рдореБрдЭреЗ рдПрдХ рдЕрдЪреНрдЫреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдЗрдВрдЧрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдХрд╛ рдореИрдВ рдЕрдиреБрд╕рд░рдг рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?
рдирдорд╕реНрддреЗ :)
рдореИрдВ рд╕рд┐рд░реНрдл рдпрд╣ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЙрд╕ рдкрд░ рдареЛрдХрд░ рдЦрд╛рдИ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░реЗ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдпрджрд┐ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреЗ рдореЛрдмрд╛рдЗрд▓ рд▓реЗрдЖрдЙрдЯ (рдпрд╛ рдирд╣реАрдВ) рдХреЛ рдкреНрд░реЙрдкреНрд╕ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдореЗрд░рд╛ рд▓рдХреНрд╖реНрдп рд╡реНрдпреВрдкреЛрд░реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдореЗрд░реЗ рдиреЙрдм рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдерд╛, рдФрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛;)
рдмрд╕ рдпрд╣рд╛рдВ рдЕрдкрдирд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдФрд░ @IanVS рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдПрдХ рдХреЙрд▓рдмреИрдХ рдЕрдЪреНрдЫрд╛ рд╣реЛрддрд╛ (рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдореИрдВ рдЕрдкрдиреЗ isMobile рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рддрд╛ рд╣реВрдВ, рддреЛ рдореИрдВ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ)
рдореИрдВрдиреЗ рд╕реБрдирд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧ рдиреЙрдм рд╕реНрдЯреЗрдЯ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдореЗрдВ рд░реБрдЪрд┐ рд╡реНрдпрдХреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЕрдЧрд░ рд╣рдо рдПрдХ рдЕрдЪреНрдЫреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░ рд╕рд╣рдордд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реЛрдЧрд╛ред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЪреВрдВрдХрд┐ рдпрд╣ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд▓реЛрдЧ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ рдФрд░ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЛ рдирдХрд╛рд░рд╛рддреНрдордХ рд░реВрдк рд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
@Hypnosphi , рдЖрдкрдХреЛ рдкрд┐рдЫрд▓реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди, WDYT рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдкрддреНрддрд┐ рдереА?
рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЦреБрд▓рд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣рд╛рдВ рдЯрд┐рдкреНрдкрдгреА рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореБрдЭреЗ рдЕрднреА рднреА рдЙрддреНрд╕реБрдХрддрд╛ рд╣реИ рдХрд┐ @Hypnosphi рдХрд╛ рдпрд╣рд╛рдБ рдкрд╣рд▓реЗ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд @igor-dv рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛ рдХрд╣рдирд╛ рд╣реИред
рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡рд┐рдЪрд╛рд░ рд╕рддреНрдп рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рдХреЛ рдкреЗрд╢ рдХрд░рдиреЗ рдХрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдШрдЯрдХ рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рд╕рддреНрдп рдХреЗ рдПрдХ рд╕реНрд░реЛрдд рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╣реИ - рдШреБрдВрдбреАред рдореЗрд░реЗ рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреНрдп рд╕рднреА рджреГрд╖реНрдЯрд┐рдХреЛрдг (рдЖрд╡рд░рдг рдШрдЯрдХ, рд░рд╛рдЬреНрдп рдРрдб-рдСрди, рдкреБрдирд░реНрд╕рдВрдпреЛрдЬрди) рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рддреНрдп рдХрд╛ рдПрдХ рдФрд░ рд╕реНрд░реЛрдд рдкреЗрд╢ рдХрд░реЗрдВрдЧреЗред рдореЗрд░реЗ рдЪреЗрдХрдмреЙрдХреНрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдореИрдВ рдЪреЗрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдШреБрдВрдбреА рдирд╣реАрдВ рд░рдЦ рдкрд╛рдКрдВрдЧрд╛, рдФрд░ рдПрдХ рд░реИрдкрд░ рдШрдЯрдХ рдХреЛ рдЪреЗрдХ рдХрд┐рдП рдЧрдП рдкреНрд░реЛрдк рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреВрдВрдЧрд╛ред рдореИрдВ рдиреЙрдмреНрд╕ рдХрдВрдЯреНрд░реЛрд▓ рдкреИрдирд▓ рдХреЛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдкреИрд░реЗрдВрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рджреЗрдЦрддрд╛ рд╣реВрдВ, рд╕рд┐рд╡рд╛рдп рдЗрд╕рдХреЗ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЗрд╕реЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕реЗ рдХреЛрдИ рдХреЙрд▓рдмреИрдХ рдирд╣реАрдВ рдорд┐рд▓ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ рдПрдХрддрд░рдлрд╛ рд╣реИ рдФрд░ рди рдХрд┐ рдХреИрд╕реЗ рд░рд┐рдПрдХреНрдЯ рдРрдкреНрд╕ рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдмрдирд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред
рдореЗрд░реЗ рд▓рд┐рдП рдЙрдЪрд┐рдд рд▓рдЧрддрд╛ рд╣реИред рдЖрдЗрдП рдПрдкреАрдЖрдИ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ
рдпрд╣ рдПрдХ рдмреЗрд╣рддрд░реАрди рдлреАрдЪрд░ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдмрд╕ рдПрдХ рдмрд╣реБрдд рд╣реА рдмреБрдирд┐рдпрд╛рджреА рдирд┐рдпрдВрддреНрд░рд┐рдд рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдПрдХ рд╣реА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдФрд░ рдЕрдиреНрдп рдШрдЯрдХреЛрдВ рдореЗрдВ рднреА рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ред рдЗрд╕реЗ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рд╡рд░реНрддрдорд╛рди рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ рдХреЗ рд╕рд╛рде рдмрдиреЗ рд░рд╣рдирд╛ рдереЛрдбрд╝рд╛ рдЪреБрдиреМрддреА рднрд░рд╛ рд▓рдЧрддрд╛ рд╣реИред рд╢рд╛рдпрдж рдЖрдк рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:
const {value: name, change: setName} = text('Name', 'Kent');
@brunoreis , рдореБрдЭреЗ рдЪрд┐рдВрддрд╛ рд╣реЛрдЧреА рдХрд┐ рдиреЙрдмреНрд╕ рдХреЗ рд░рд┐рдЯрд░реНрди рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдмрджрд▓рд╛рд╡ рд╣реЛрдЧрд╛ред рдореЗрд░рд╛ рдСрдл-рдж-рдХрдл рд╕реБрдЭрд╛рд╡ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
import {boolean, changeBoolean} from '@storybook/addon-knobs/react';
stories.add('custom checkbox', () => (
<MyCheckbox
checked={boolean('checked', false)}
onChange={(isChecked) => changeBoolean('checked', isChecked)} />
));
рдЬрд╣рд╛рдВ onChange
рдХреЙрд▓рдмреИрдХ рднреА рдХрд░реА рдХреА рдЕрдиреБрдорддрд┐ рджреЗ рд╕рдХрддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдпрд╣ рднреА рдХрд╛рдо рдХрд░реЗ:
onChange={(isChecked) => changeBoolean('checked')(isChecked)}
// which of course simplifies down to
onChange={changeBoolean('checked')}
рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓рд╛ рддрд░реНрдХ рдШреБрдВрдбреА рдХреЗ рд▓реЗрдмрд▓ рдХреЗ рд╕рдорд╛рди рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛтАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЬрд┐рд╕ рддрд░рд╣ рд╕реЗ рдиреЙрдмреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдмрджрд▓реЗ рдмрд┐рдирд╛ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рдСрдкреНрдЯ-рдЗрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред (рдЬрдм рддрдХ рдХрд┐ рд▓реЗрдмрд▓ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ? рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╡реЗ рд╣реИрдВ ...)
@IanVS , рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реИред рдЪреАрдЬреЛрдВ рдХреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЛ рдирд╣реАрдВ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЖрдкрд╕реЗ рд╕рд╣рдордд рд╣реВрдВред рдореБрдЭреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд▓реЗрдмрд▓ рдХреЛ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рд╕реЛрдЪрд╛ рдерд╛ред рдпрд╣ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ @Hypnosphi рдХреЗ рдорди рдореЗрдВ рдХреНрдпрд╛ рд╣реИред
рдиреЙрдмреНрд╕ рдХреЗ рд░рд┐рдЯрд░реНрди рд╕рд┐рдЧреНрдиреЗрдЪрд░ рдХреЛ рдмрджрд▓рдирд╛ рдПрдХ рдмреНрд░реЗрдХрд┐рдВрдЧ рдЪреЗрдВрдЬ рд╣реЛрдЧрд╛
рддрдХрдиреАрдХреА рд░реВрдк рд╕реЗ, рдпрд╣ рдЕрднреА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд░рдореБрдЦ рд░рд┐рд▓реАрдЬ рдЖрдЧрд╛рдореА рд╣реИред рд▓реЗрдХрд┐рди рдХреБрдЫ рдкрд╢реНрдЪрдЧрд╛рдореА рд╕рдВрдЧрддрддрд╛ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ред
рдореБрдЭреЗ рдХрд░реА рд╕рдорд░реНрдерди рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рд╣реИред
рдЬрдм рддрдХ рдХрд┐ рд▓реЗрдмрд▓ рдХреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рди рд╣реЛ?
рд╣рд╛рдБ, рд╡реЗ рд╣реИрдВ, рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдореЗрдВ рдЕрджреНрд╡рд┐рддреАрдп рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдЕрд▓рдЧ рд╕реЗ change<Type>
рдирд┐рд░реНрдпрд╛рдд рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдмрд╕ change
рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ https://github.com/storybooks/storybook/pull/3701 . рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдореИрдВ рдЙрд╕ рдкреАрдЖрд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓реВрдВрдЧрд╛ рддрд╛рдХрд┐
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ:
const {value: name, change: setName} = text('Name', 'Kent');
text
рдХреЗ рд░рд┐рдЯрд░реНрди рдкреНрд░рдХрд╛рд░ рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ред
рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝рдВрдХреНрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИрдВ рдФрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЧреБрдг рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╕реНрддреБ рдХреЛ рдирд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
@ndelangen text
рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдирд╣реАрдВ рд╣реИред рдпрд╣ рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛:
const { foo, bar } = x() // note the parens
рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдРрд╕рд╛ рдХреБрдЫ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рдирд╛рдо рд╡рд┐рд╡рд╛рджрд┐рдд рд╣реИ):
const {value: name, change: setName} = text.mutable('Name', 'Kent');
рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛?
const { foo, bar } = x() // note the parens
x рдХреА рд╡рд╛рдкрд╕реА рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдЧреБрдг рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред
рдореИрдВ рдЖрдкрдХреЗ рдореВрд▓ рдЙрджрд╛рд╣рд░рдг рд╕реЗ x = () => {}
рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣рд╛ рдерд╛ред
рдпрджрд┐ рд╣рдо text
рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд╡рд╛рдкрд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЕрдкрдирд╛ рдХреЛрдб рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛:
// Before
<Foo bar={text('Bar', '')}>
// After
<Foo bar={text('Bar', '')()}>
^^ this
рд╕рдордЭрд╛
рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ @IanVS рд╕реБрдЭрд╛рд╡ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛?
рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред
"рд╡рд┐рдирд╛рд╢" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреНрдпрд╛, рдЬреИрд╕реЗ "рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╣реБрдХ" рдХреЗ рд╕рд╛рде ?:
const [foo, setFoo] = useString('foo', 'default');
@DimaRGB . рдЬреИрд╕рд╛ рд╣реА рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рдерд╛
рдореМрдЬреВрджрд╛ рд╕рд┐рдВрдЯреИрдХреНрд╕ рдХреЛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣реБрдХ рдЬреИрд╕реА рдХреЙрд▓ рдЬреЛрдбрд╝рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдВрдЧреЗ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
.add('example', () => {
const [selected, setSelected] = useBool(false);
return <SomeComponent selected={selected} onSelected={setSelected} />
})
рд╕рд╛рдордпрд┐рдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ props
рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХреЛ рдмрддрд╛рдПрдВ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХрднреА-рдХрднреА рдПрдХ рдШрдЯрдХ рдореЗрдВ рдХреБрдЫ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдХреЗ рдкреНрд░реЛрдк рдХреЛ рдЯреЙрдЧрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╣реЛрддреЗ рд╣реИрдВ (рдореИрдВ рдЗрд╕рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдХреНрдпреЛрдВрдХрд┐ рдХрднреА-рдХрднреА рдПрдХ рдиреЗрд╡реА рдмрд╛рд░ рдореЗрдиреВ рдореЗрдВ рдореБрдЭреЗ рдЦреБрдж рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдпрджрд┐ рдХреЛрдИ рдмрдЪреНрдЪрд╛ рддрддреНрд╡ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)ред
@IanVS рдореЗрд░реЗ рдкрд╛рд╕ рдареАрдХ рд╡реИрд╕реА рд╣реА рд╕реНрдерд┐рддрд┐ рд╣реИ, рдЬрд╣рд╛рдВ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЯреЙрдЧрд▓ рдШрдЯрдХ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ рдкреИрд░реЗрдВрдЯ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдмрд╛рд░ рд╕реНрдЯреЛрд░реАрдмреБрдХ рд╕реНрдЯреЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕реЗ рдЯреЙрдЧрд▓ рдХрд░рддрд╛ рд╣реИ, UI рд╕реНрдерд┐рддрд┐ рдиреЙрдмреНрд╕ рдкреИрдирд▓ рдореЗрдВ рдЬреЛ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЙрд╕рдХреЗ рд╕рд╛рде рдЕрд╕рдВрдЧрдд рд╣реИред рдореИрдВрдиреЗ @storybook/addons-knobs
рд╕реЗ рдПрдХ рдирд┐рдЬреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд╣реИрдХ рдХрд┐рдпрд╛ - рдПрдХ рдЖрд╕рд╛рди рд╕реБрдЭрд╛рд╡ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдПрдкреАрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реЛрдЧрд╛:
import { manager } from '@storybook/addons-knob/dist/registerKnobs.js'
const { knobStore } = manager
// The name given to your knob - i.e: `select("Checked", options, defaultValue)`
knobStore.store['Checked'].value = newValue
// Danger zone! _mayCallChannel() triggers a re-render of the _whole_ knobs form.
manager._mayCallChannel()
@erickwilder рдореИрдВрдиреЗ рдЖрдкрдХреЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рд╡рд╣ рдХрднреА рднреА рдиреЙрдм рдлреЙрд░реНрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд░рддрд╛ рдерд╛ (рднрд▓реЗ рд╣реА рдЙрд╕рдиреЗ рдШрдЯрдХ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдкреНрд░реЙрдкреНрд╕ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рд╣реЛ)ред
рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ:
рдирд╣реАрдВ; рдореИрдВрдиреЗ рдЕрднреА рдЙрд╕ рдЕрдкрдбреЗрдЯ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрд╛ рдХреНрдпреЛрдВрдХрд┐ рдореИрдВ рдЪреЗрдХрдмреЙрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд▓реНрдк() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рдерд╛ рдЬреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ 'рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд' рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрдЪрд╛рд▓рд┐рдд рд╣реЛрддреЗ рд╣реИрдВред рдмрд╣реБ-рдЪрдпрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдХреЗ рдФрд░ рдХреЙрд▓рдмреИрдХ рдореЗрдВ рдЗрд╕ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдЭреЗ рдЕрджреНрдпрддрди рдорд╛рди рдШреБрдВрдбреА рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реБрдП:
// Ditch when https://github.com/storybooks/storybook/issues/3855 gets resolved properly.
function FixMeKnobUpdate(name, value) {
addons.getChannel().emit(CHANGE, { name, value });
}
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реЗрдЯрдЕрдк рдХреЗ рдХреБрдЫ рд╡рд┐рд╡рд░рдг рдЫреЛрдбрд╝реЗ рд╣реЛрдВрдЧреЗ:
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдРрд╕рд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╕рднреА рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдореИрдВ @IanVS рд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕рд╣рдордд
рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд╕реЗрдЯрдЕрдк (рдХреЛрдгреАрдп 7) рдХреЗ рд╕рд╛рде @erickwilder рдХреА рд╣реИрдХ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА, рд▓реЗрдХрд┐рди рдЬрдм рднреА рдореИрдВ рдиреЙрдм рд╕реНрдЯреЛрд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐
рддреНрд░реБрдЯрд┐: рдХреЛрдгреАрдп рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрдиреЗ рдХреА рдЙрдореНрдореАрдж рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣реИ!
рдореИрдВрдиреЗ рдХрд┐рд╕реА рддрд░рд╣ рдЗрд╕реЗ рдХреЛрдгреАрдп рдХреЗ рдмрд╛рд╣рд░ рдЪрд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдЗрд╕реЗ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛ ... рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдореИрдВ рдПрдХ рддреАрд╕рд░рд╛ рдШрдЯрдХ рд╕реА рдмрдирд╛рдКрдВрдЧрд╛ рдЬреЛ рдП рдФрд░ рдмреА рдХрд╛ рдПрдХ рдЖрд╡рд░рдг рд╣реЛрдЧрд╛ред
@erickwilder рд╕реЗ рдиреЙрдмреНрд╕ рдПрдбрди рдХреЗ рдкреБрди :
рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдЙрд╕реА рддрд░рд╣ рд░рд┐рдПрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХрд╛рдо рдХрд┐рдпрд╛
рдЯреНрд░рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реА рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП +1, рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдиреЙрдм рдирд╛рдо рдФрд░ рдПрдХ рдирдпрд╛ рдорд╛рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
import { manager } from "@storybook/addon-knobs"
manager.updateKnob(
propName, // knobs property, example from above "Checked"
newValue, // new value to set programmatically, ex. true
)
рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЗрд╕реЗ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рд╕рдорд░реНрдерди рджрд┐рдпрд╛ рдЬрд╛рдПред
рдЗрд╕ рдмреАрдЪ, рд╕реНрдЯреЛрд░реАрдмреБрдХ v5 рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЗрд╕ рдмреЗрд╣рдж рд╣реИрдХреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЬрд╛рдирд╛ рдкрдбрд╝рд╛:
window.__STORYBOOK_ADDONS.channel.emit('storybookjs/knobs/change', {
name: 'The name of my knob',
value: 'the_new_value'
})
рдореИрдВ
рдореИрдВ
рд╕рдВрдмрдВрдзрд┐рдд: #6916
рдпрд╣ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛... рдЦрд╛рд╕рдХрд░ рдХреНрдпреЛрдВрдХрд┐ modals.
рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред
рдЙрджрд╛рд╣рд░рдг:
storiesOf('input', module)
.addDecorator(withKnobs)
.add('default', () => <input type={text('type', 'text')} value={text('value', '')} disabled={boolean('disabled', false)} placeholder={text('placeholder', '')} onChange={action('onChange')} />)
рдпрд╣ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдСрдирдЪреЗрдВрдЬ рдЗрд╡реЗрдВрдЯ рдЯрд╛рд░рдЧреЗрдЯ рд╡реИрд▓реНрдпреВ рдХреЛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдП рдЧрдП рддрддреНрд╡ рдХреЗ рдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рдорд╛рди рдкрд░ рд╡рд╛рдпрд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣ рддрддреНрд╡ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдЧрд╛ред
рдпрд╣ рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛
+1 рд╕реЗ @mathieuk/ @raspo рдпрд╣рд╛рдБ рдПрдХ рд╕рдорд╛рдзрд╛рди рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рд╣рдо рд╕рдВрднрд╛рд╡рд┐рдд рд░реВрдк рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рддрд░реАрдХреЗ рд╕реЗ рднреА рдЗрд╕ рддрдХ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред helpers
рдореЙрдбреНрдпреВрд▓ рдореЗрдВ рдХреБрдЫ рд╕рд╛рдорд╛рдиреНрдп рддрд░реАрдХреЗ рдмрдирд╛рдирд╛?
import addons from "@storybook/addons";
export const emitter = (type, options) => addons.getChannel().emit(type, options);
export const updateKnob = (name, value) => (
emitter("storybookjs/knobs/change", { name, value })
);
рдФрд░ рдХрд╣рд╛рдирд┐рдпреЛрдВ рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдХреЙрд▓ рдХрд░рдирд╛...
import { text } from "@storybook/addon-knobs";
import { updateKnob } from 'helpers';
// ...
const value = text("value", "Initial value");
<select
value={value}
onChange={({ target }) => updateKnob("value", target.value)}
>
... рд▓реЗрдХрд┐рди рдЕрднреА рднреА рдХреБрдЫ рдлрдВрдХреА рдЯреВ-рд╡реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдХреА рддрд░рд╣ рд▓рдЧрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдиреЙрдмреНрд╕ рдПрдкреАрдЖрдИ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ
рдЙрдкрд░реЛрдХреНрдд рдкрд░ рдХреЛрдИ рдЕрдкрдбреЗрдЯ? рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рд╕реБрд╡рд┐рдзрд╛ рд╣реЛрдЧреА ЁЯСН
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХреА рдЬрд╛ рд░рд╣реА рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рд╣рдореЗрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреБрдЫ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХреНрд░реЙрд╕-рдбрд┐рдкреЗрдВрдбреЗрдВрдЯ рдиреЙрдмреНрд╕ рдХреЛ рдХрд╛рдлреА рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░рдиреЗ рджреЗрдЧреАред рдПрдХ рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛ рдШрдЯрдХ рдХрд╣рд╛рдиреА рдмрдирд╛рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдШреБрдВрдбреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рджреВрд╕рд░реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЕрджреНрдпрддрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рддреЛ рдЖрдкрдХреА рдХрд╣рд╛рдиреА рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд╣реИ:
const resultsCount = number(
'Results count',
currentPage, {
max: 100,
min: 0,
range: true
}
);
const resultsArray: React.ReactNode[] = new Array(resultsCount)
.fill(true)
.map((_, idx) => <div key={idx + 1}>Test Pagination Result #{idx + 1}</div>);
const childrenPerPage = 10;
const currentPage = number(
'Current page index',
0, {
max: Math.ceil(resultsCount / childrenPerPage) - 1,
min: 0,
range: true
}
);
рдореИрдВрдиреЗ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ, рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдореЗрд░реЗ currentPage
рдШреБрдВрдбреА рдкрд░ рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрдЧреА рдЬрдм resultsCount
10 рдХреА рд╡реГрджреНрдзрд┐ рдкрд░ рдШреБрдВрдбреА рдмрдврд╝реЗрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдШреБрдВрдбреА рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдп рд▓рдЧрддрд╛ рд╣реИ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рдХреИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдмрд╛рдж рдХреЗ рд░реЗрдВрдбрд░ рдореЗрдВ рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рдХреЗ рд╕рд╛рде рдЬрдм рдореИрдВ resultsCount
рдХреЛ 10+ рд╕реЗ рдмрдврд╝рд╛рддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ max
currentPage
рдореЗрдВ рднреА 1 рдХреА рд╡реГрджреНрдзрд┐ рд╣реЛрдЧреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмрд╛рд╡рдЬреВрдж рдЗрд╕рдХрд╛ рдореВрд▓реНрдп рд╕рдорд╛рди рд░рд╣рддрд╛ рд╣реИ рдЗрд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ( Math.ceil(resultsCount / childrenPerPage) - 1
рд▓реЙрдЧрд┐рдВрдЧ рдЕрдкреЗрдХреНрд╖рд┐рдд рдирдпрд╛ рдорд╛рди рджрд┐рдЦрд╛рддрд╛ рд╣реИ)ред
рд╣рдо рд▓рдЧрднрдЧ 5.3 (рдЬрдирд╡рд░реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝) рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ 6.0 (рджреЗрд░ рд╕реЗ рдорд╛рд░реНрдЪ рд░рд┐рд▓реАрдЬрд╝) рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЙрдмреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рдиреЙрдмреНрд╕ рдХреЗ рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
@shilman рдореИрдВ рдЗрд╕ рдлреАрдЪрд░ рдХреЛ рд▓реЗрдХрд░ рдмрд╣реБрдд рдЙрддреНрд╕рд╛рд╣рд┐рдд рд╣реВрдВ
рдореИрдВ, @atanasster рдФрд░ @PlayMa256 рдХреБрдЫ рд╕рдордп рд╕реЗ рдЗрд╕рдХреА рдиреАрдВрд╡ рдкрд░ рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕реЗ рд╕рд╣реА рд╣реЛрдиреЗ рдореЗрдВ рдХреБрдЫ рдФрд░ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрд╣реБрдд рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╣рдо 6.0.0 рдореЗрдВ 100% рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдореЗрдВ рдХреНрд░рд╛рдВрддрд┐ рд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдХреНрд░рд╛рдВрддрд┐? рдЧрд░реНрдо рд▓рд╛рдирдд рдбрд┐рдЧрд┐рдЯреАред рдореБрдЭреЗ рдЪрд┐рдврд╝рд╛рдирд╛ рдмрдВрдж рдХрд░реЛ, рдореЗрд░рд╛ рд╢рд░реАрд░ рддреИрдпрд╛рд░ рд╣реИред
рдореЛрдбрд▓ рдХреЗ рд▓рд┐рдП +1 :)
рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╢реБрд░реВ рд╕реЗ рд╣реА рдЕрд╕рдВрднрд╡ рд╣реИред рдЕрдкрдбреЗрдЯ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдореЗрдВ...
рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ!
рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдЕрдЧрд▓реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:
import { addons } from '@storybook/addons';
import { CHANGE } from '@storybook/addon-knobs';
const channel = addons.getChannel();
channel.emit(CHANGE, {
name: 'prop_name',
value: prop_value,
});
рдЕрднреА рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреАред
рдореИрдВрдиреЗ рдЕрд╡рд▓реЛрдХрдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рдореИрдВ рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
`
.add ('рдЪрд╛рд░реНрдЯ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛', () => {
const myObservable= new BehaviorSubject([{a: 'a', b: 'b'}]);
return {
template: '
<my-component
myInput: myData,
(myEvent)="myEventProp($event)"
></my-component>
',
props: {
myData: myObservable,
myEventProp: $event => {
myObservable.next([]);
action('(myEvent)')($event);
}
}
};
})
`
@ рдиреЙрд░рдмрд░реНрдЯ-рдбреВрдлрд╕ рдзрдиреНрдпрд╡рд╛рдж рдЖрдкрдХреЗ рдЙрджрд╛рд╣рд░рдг рдиреЗ рдореЗрд░реА рдорджрдж рдХреА
рд╣рд╛рдп рдЧреИрдВрдЧ, рд╣рдордиреЗ рдЕрднреА-рдЕрднреА 6.0-рдмреАрдЯрд╛ рдореЗрдВ рдПрдбрдСрди-рдХрдВрдЯреНрд░реЛрд▓ рдЬрд╛рд░реА рдХрд┐рдпрд╛ рд╣реИ!
рдирд┐рдпрдВрддреНрд░рдг рдкреЛрд░реНрдЯреЗрдмрд▓, рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдиреЙрдмреНрд╕ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдПрдбрдСрди-рдиреЙрдмреНрд╕ рд▓реЙрдиреНрдЧ рдЯрд░реНрдо рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрддрд╛ рд╣реИред
рдХреГрдкрдпрд╛ рдЕрдкрдЧреНрд░реЗрдб рдХрд░реЗрдВ рдФрд░ рдЖрдЬ рд╣реА рдЗрдиреНрд╣реЗрдВ рдЖрдЬрд╝рдорд╛рдПрдВ. рд░рд┐рд▓реАрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рд╕реНрдерд┐рд░ рдмрдирд╛рдиреЗ рдореЗрдВ рдЖрдкрдХреА рдорджрдж рдФрд░ рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдПрдХ рджрдо рдмрдврд╝рд┐рдпрд╛! рдореИрдВ рд░реАрдбрдореЗ рдХреЛ рдкрдврд╝рдиреЗ рд╕реЗ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдмрддрд╛ рд╕рдХрддрд╛ (рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛), рдХреНрдпрд╛ рдЗрди рдирдП controls
рдХреЛ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдмрджрд▓рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдореБрджреНрджреЗ рдореЗрдВ рдЕрдиреБрд░реЛрдз рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рдерд╛?
рд╡реЗ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореБрдЭреЗ рдпрдХреАрди рдирд╣реАрдВ рд╣реИ рдХрд┐ рдПрдкреАрдЖрдИ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рддреМрд░ рдкрд░ рдЕрднреА рддрдХ рд╕рдорд░реНрдерд┐рдд рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдо рдПрдбрдСрди-рдбреЙрдХреНрд╕ рдореЗрдВ рдирд┐рдпрдВрддреНрд░рдг рдХреЗ рд▓рд┐рдП рдареАрдХ рд╡рд╣реА рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред рдореИрдВ @tmeasday рдХреЗ рд╕рд╛рде рдХрд╛рдо
updateArgs
рдЬреЛрдбрд╝реЗрдВ?this.context?.updateArgs(....)
)рдХрд┐рд╕реА рднреА рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬреЛ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдХрд╣рд╛рдВ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдореИрдВрдиреЗ рдПрдХ рддрд╛рдЬрд╛ рд╕реАрдЖрд░рдП рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕реЗ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рдбреЗрдореЛ рддрдХ рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рддреНрд╡рд░рд┐рдд рдФрд░ рдЧрдВрджрд╛ рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкреВрд░реНрд╡рд╛рднреНрдпрд╛рд╕ рдмрдирд╛рдпрд╛ рд╣реИред рдЗрд╕рдХреА рдЬрд╛рдВрдЪ - рдкрдбрд╝рддрд╛рд▓ рдХрд░реЗрдВ:
рдирд┐рдпрдВрддреНрд░рдг рд░реАрдбрдореЗ рдореЗрдВ рдХреБрдЫ "рдиреЙрдмреНрд╕ рдЯреВ рдХрдВрдЯреНрд░реЛрд▓" рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдбреЙрдХреНрд╕ рднреА рд╣реИрдВ:
=> рдореИрдВ рдРрдбрдСрди-рдиреЙрдмреНрд╕ рд╕реЗ рдХреИрд╕реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░реВрдВ?
рд╣рд╛рдп рджреЛрд╕реНрддреЛрдВ!
рдПрдХ рдЕрд╕реНрдерд╛рдпреА рд╕рдорд╛рдзрд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдРрдк рдореЗрдВ рдЕрдЧрд▓реЗ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:import { addons } from '@storybook/addons'; import { CHANGE } from '@storybook/addon-knobs'; const channel = addons.getChannel(); channel.emit(CHANGE, { name: 'prop_name', value: prop_value, });
рдЕрднреА рднреА рдкреНрд░рддреАрдХреНрд╖рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реБрд╡рд┐рдзрд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рд▓рд╛рдЧреВ рдХреА рдЬрд╛рдПрдЧреАред
рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ groupId
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдЖрдкрдХреЛ рд╕рдореВрд╣ рдЖрдИрдбреА рдХреЛ name
рдореЗрдВ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛:
const show = boolean('Show Something', true, 'Group')
channel.emit(CHANGE, {
name: 'Show Something_Group',
value: prop_value,
});
рд╕рд╛рде рд╣реА, channel
рдПрдХ EventEmitter рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП addListener
рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рд╣реЛ рд░рд╣реЗ рд╣реИрдВред
channel.addListener(CHANGE, console.log)
рдпрд╣рд╛рдВ рдХрд┐рд╕реА рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рд╣реИ рдЬреЛ v6 рдореЗрдВ addon-controls
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддрд╛ рд╣реИред
import { useArgs } from '@storybook/client-api';
// Inside a story
export const Basic = ({ label, counter }) => {
const [args, updateArgs] = useArgs();
return <Button onClick={() => updateArgs({ counter: counter+1 })>{label}: {counter}<Button>;
}
рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдпрд╣ рдЗрд╕ рдЙрджреНрджреЗрд╢реНрдп рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдПрдкреАрдЖрдИ рд╣реИ рд▓реЗрдХрд┐рди рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЛрдиреЛрд░реЗрдкреЛ рдореЗрдВ рдЙрджрд╛рд╣рд░рдг:
рдзрдиреНрдпрд╡рд╛рдж, @shilman! рдпрд╣реА рдЪрд╛рд▓ рдЪрд▓реАред
рд░реБрдЪрд┐ рд░рдЦрдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдЯреАрдХ Checkbox
рдХрд╣рд╛рдиреА checked
рдкреНрд░реЛрдк рд╣реИ рдЬрд┐рд╕рдиреЗ рдЗрд╕ рдкреВрд░реЗ рдзрд╛рдЧреЗ рдХреЛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред Storybook 6.0.0-rc.9 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╣рдорд╛рд░реА рдирдИ рд╡рд╛рдпрд░реНрдб рдХрд╣рд╛рдиреА рдпрд╣рд╛рдВ рджреА рдЧрдИ рд╣реИ:
export const checkbox = (args) => {
const [{ checked }, updateArgs] = useArgs();
const toggleChecked = () => updateArgs({ checked: !checked });
return <Checkbox {...args} onChange={toggleChecked} />;
};
checkbox.args = {
checked: false,
label: 'hello checkbox!',
};
checkbox.argTypes = {
checked: { control: 'boolean' },
};
@shilman рдореИрдВрдиреЗ рдПрдХ рдирд┐рдпрдВрддреНрд░рд┐рдд рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╣рд╛рдиреА рдореЗрдВ useArgs
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ (рдПрдХ рдРрд╕рд╛ рдорд╛рдорд▓рд╛ рдЬрд╣рд╛рдВ рд╣рдо рдЖрдорддреМрд░ рдкрд░ useState
рд╣реБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШрдЯрдХ рдХреЗ value
рдкреНрд░реЛрдк рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЗрд╕рдХреА onChange
рдШрдЯрдирд╛)ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдПрдХ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ рдЬрд╣рд╛рдВ рд╣рд░ рдмрд╛рд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдЪрд░рд┐рддреНрд░ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИ, рддреЛ рдШрдЯрдХ рдлреЛрдХрд╕ рдЦреЛ рджреЗрддрд╛ рд╣реИред рдХреНрдпрд╛ рдпрд╣ рд╢рд╛рдпрдж рд╣рд░ рдмрд╛рд░ рдЬрдм рд╣рдо рддрд░реНрдХ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХрд╣рд╛рдиреА рдХреЛ рд░реАрдлреНрд░реЗрд╢/рдкреБрдирдГ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░рдг рд╣реЛрддрд╛ рд╣реИ?
рдХреНрдпрд╛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдЯреЗрдХреНрд╕реНрдЯ рдЗрдирдкреБрдЯ рд╡рд╛рд▓реЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рддрд░реНрдХ/рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдЕрд▓рдЧ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╡рд┐рдзрд┐ рд╣реИ?
рдпрд╣ 6.0.0-rc.13 . рдХреЗ рд╕рд╛рде рдерд╛
@jcq рдХреНрдпрд╛ рдЖрдк useArgs
рд▓рд┐рдП рдкреНрд░рд╛рдердорд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд╛ рдорд╛рдорд▓рд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдЬрд┐рд╕реЗ рд╣рдо рд╕рдорд░реНрдерди рджреЗрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕рдореЗрдВ рдЦреБрджрд╛рдИ рдХрд░рдиреЗ рдореЗрдВ рдЦреБрд╢реА рд╣реЛрдЧреАред
@shilman рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ - рдпрд╣рд╛рдБ рдирдпрд╛ рдореБрджреНрджрд╛ рд╣реИ:
https://github.com/storybookjs/storybook/issues/11657
рдореБрдЭреЗ рдпрд╣ рднреА рд╕реНрдкрд╖реНрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ рдХрд┐ рдЧрд▓рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдбреЙрдХреНрд╕ рдореЗрдВ рджрд┐рдЦрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХреИрдирд╡рд╛рд╕ рдореЛрдб рдореЗрдВ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
рдореИрдВрдиреЗ рдЕрд╡рд▓реЛрдХрдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рдореИрдВ рдХреЛрдгреАрдп рдХреЗ рд╕рд╛рде рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ
`
.add ('рдЪрд╛рд░реНрдЯ рдбреЗрдЯрд╛ рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛', () => {const myObservable= new BehaviorSubject([{a: 'a', b: 'b'}]); return { template: ' <my-component myInput: myData, (myEvent)="myEventProp($event)" ></my-component> ', props: { myData: myObservable, myEventProp: $event => { myObservable.next([]); action('(myEvent)')($event); } } };
})
`
рдЗрд╕рдиреЗ рдореЗрд░реЗ рд▓рд┐рдП рдХреЛрдгреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд╛рдо рдХрд┐рдпрд╛ рд▓реЗрдХрд┐рди рд▓рд╛рдЗрди 5 . рдкрд░ myData.value
рдмрджрд▓ рджрд┐рдпрд╛
рдореИрдВрдиреЗ рдЕрднреА рддрдХ рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдпрд╛ рдирд╣реАрдВ рд╣реИ (рдЕрднреА рдХреЗ рд▓рд┐рдП рд╕реНрдЯреЛрд░реАрдмреБрдХ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдкрд░ рдЕрдЯрдХрд╛ рд╣реБрдЖ рд╣реИ) рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рдореБрджреНрджреЗ рдХреЛ рдЕрдм рдмрдВрдж рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рддрд░реНрдХ/рдирд┐рдпрдВрддреНрд░рдг рдкрд░ рдорд╣рд╛рди рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рдо рд▓рдЧрднрдЧ 5.3 (рдЬрдирд╡рд░реА рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд░рд┐рд▓реАрдЬрд╝) рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдФрд░ 6.0 (рджреЗрд░ рд╕реЗ рдорд╛рд░реНрдЪ рд░рд┐рд▓реАрдЬрд╝) рдХреЗ рд▓рд┐рдП рдПрдХ рдиреЙрдмреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЪрд▓реА рдЖ рд░рд╣реА рдиреЙрдмреНрд╕ рдХреЗ рдореБрджреНрджреЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣рд▓ рдХрд░реЗрдЧрд╛ред рдореИрдВ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣рдо рдЗрд╕рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ! рдЖрдкрдХреЗ рдзреИрд░реНрдп рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!