ã¹ããŒãªãŒããã¯ã䜿ãå§ããã°ããã§ãä»ã®ãšãã倧奜ãã§ãã ç§ãèŠåŽããããšã®1ã€ã¯ãç¶æ
ã芪ã«å«ãŸããŠããå¿
èŠãããçŽç²ãªãã¹ããŒãã¬ã¹ãã³ã³ããŒãã³ããã©ã®ããã«åŠçãããã§ãã ããšãã°ã checked
å°éå
·ãåãåããã§ãã¯ããã¯ã¹ããããŸãã ãã§ãã¯ããã¯ã¹ãã¯ãªãã¯ããŠãããã®ç¶æ
ã¯åãæ¿ãããŸãããã onChange
ãçºçããæŽæ°ãããchecked
ãããããè¿ãããã®ãåŸ
ã¡ãŸãã ãããã®çš®é¡ã®ã³ã³ããŒãã³ããåŠçããããã®ãã¹ããã©ã¯ãã£ã¹ã«é¢ããããã¥ã¡ã³ãã¯ãªãããã§ããhttpsïŒ//github.com/storybooks/storybook/issues/197ãªã©ã®åé¡ã§ã®ææ¡ã¯ãã©ãããŒã³ã³ããŒãã³ããäœæããããšã§ããå¥ã®ã¢ããªã³ãè¿œå ããŸãã ã¹ããŒãªãŒãã§ããã ãã·ã³ãã«ã«ãããã®ã§ãæäŒã£ãŠããããªãã³ã³ããŒãã³ãã©ãããŒãäœããããããŸããã
ç§ããããåŠçããªããã°ãªããªãã£ã1ã€ã®ã¢ã€ãã¢ã¯ã actions
ã¢ããªã³ãknobs
ã«æ¥ç¶ããã¢ã¯ã·ã§ã³ãä»ããŠããã°ã©ã ã§ãããåãæ¿ããããšãã§ããããã«ããããšã§ãã ç§ã¯ã¹ããŒãªãŒããã¯ã§çæ°ãããšèšã£ãã®ã§ããããå®çŸå¯èœãã©ããã¯ããããŸããããå°ãªããšãææ¡ãæèµ·ããããšæããŸããã
ããã¯ç§ã«ãšã£ãŠã¹ããŒãªãŒãå®è£ ããäžã§ã®ã€ãŸããã§ãããä»ã®äººã«ãšã£ãŠããããããããªããšæããŸãã ã©ãããŒã³ã³ããŒãã³ããäœæããããšãæ¬åœã«æåã®æ¹æ³ã§ããå Žåããããæ確ã«ããããã«ããã€ãã®ããã¥ã¡ã³ããè¿œå ãããããå®çŸããæ¹æ³ãæããŠãã ããã
ããçš®ã®åæ§ã®ã¢ã€ãã¢ããã®ïŒ3701 PRã§çŽ¹ä»ãããŸããããããã¯ç©è°ãéžããŠããŸããïŒãããŠããŒãžãããŸããã§ããïŒã
ããäžåºŠãã£ã¹ã«ãã·ã§ã³ãéããŠãAPIã®ææ¡ãèãããšãã§ããŸã=ïŒã
ãããããããšããç§ã¯ãã®PRãèŠãŠããŸããã§ããã ããããŸãšããŠããã@aherriotã«æè¬ã
APIã«é£ã³èŸŒãåã«ãåºæ¬çãªæŠå¿µã«ã€ããŠè©±ãåããåæããå¿ èŠãããããã§ãã PRã®ã³ã¡ã³ãã®1ã€ã¯@Hypnosphiããã®ãã
è€æ°ã®çå®ã®æ å ±æºïŒã³ã³ããŒãã³ãã®ã³ãŒã«ããã¯ãšUIããïŒãå°å ¥ããããšããäºå®ã¯å¥œãã§ã¯ãããŸãã
ã¢ã€ãã¢ã¯ãããŸããŸãªä¿¡é Œã§ããæ
å ±æºãå°å
¥ããããšã§ã¯ãªããã³ã³ããŒãã³ãã®ç¶æ
ïŒããïŒã®ä¿¡é Œã§ããå¯äžã®æ
å ±æºãç¶æã§ããããã«ããããšã§ããããã«æãããŸãã ç§ãææ¡ããä»ã®ãã¹ãŠã®ã¢ãããŒãïŒã©ãããŒã³ã³ããŒãã³ããç¶æ
ã¢ããªã³ãåæ§æïŒã¯ãå®éã«ã¯å¥ã®çå®ã®æ
å ±æºãå°å
¥ããŸãã ç§ã®ãã§ãã¯ããã¯ã¹ã®äŸã§ã¯ã checked
ããã䜿çšããããšã¯ã§ãããã©ãããŒã³ã³ããŒãã³ããchecked
å°éå
·ãæäŸã§ããããã«ããããšãã§ããŸããã ããã®ã³ã³ãããŒã«ããã«ã¯ã³ã³ããŒãã³ãã®èŠªãšããŠè¡šç€ºãããŸãããçŸåšãã³ã³ããŒãã³ãããã³ãŒã«ããã¯ãååŸããããšã¯ã§ããŸãããããã¯äžçš®ã®äžæ¹çãªãã®ã§ãããreactã¢ããªãéåžžã©ã®ããã«æ§ç¯ããããã§ã¯ãããŸããã
ãããããã°ã©ã ã§å¶åŸ¡ã§ããããã«ããããšã§ããã§ãã¯ããã¯ã¹ã®ãããªåçŽãªãã¬ãŒã³ããŒã·ã§ã³ã³ã³ããŒãã³ãã®å Žåãšåæ§ã«ãã¹ããŒãªãŒããã¢ã³ã¹ãã¬ãŒã·ã§ã³ãããŠããã³ã³ããŒãã³ãã ãã«åé¢ããå®éã®ç¶æ
管çã¡ã«ããºã ãäžéæã«ããããšãã§ããŸãã ãã§ãã¯ããã¯ã¹èªäœã¯ãå°éå
·ãååŸããæ¹æ³ãæ°ã«ããŸãããreduxã«æ¥ç¶ããããã芪ãsetState
䜿çšããããåæ§æããwithState
ã䜿çšããããå°éå
·ãã«ãã£ãŠå¶åŸ¡ãããå¯èœæ§ããããŸããã¹ããŒãªãŒããã¯ã®ããã
ãšã«ããç§ãèšã£ãããã«ç§ã¯ããã«éåžžã«æ°ããã®ã§ãç§ã¯ç§ã®çŽæçãªèããå ±æããŠããã ãã§ãã ç§ããªãããŒã¹ã§ããããã®çš®é¡ã®çŽç²ãªã¹ããŒãã¬ã¹ã³ã³ããŒãã³ããåŠçããããã®äžè¬çã«åãå ¥ããããŠããããã¹ããã©ã¯ãã£ã¹ããããå Žåã誰ããç§ãåŸãããšãã§ããè¯ãäŸãæããŠãããã§ããããã
ãã ïŒïŒ
ã³ã³ããŒãã³ããå°éå ·ããã¢ãã€ã«ã¬ã€ã¢ãŠãã衚瀺ããïŒãŸãã¯è¡šç€ºããªãïŒå¿ èŠããããã©ãããåãåã£ãŠãããšãã«ãç§ã¯ããã«ééããŸãããç§ã®ç®æšã¯ããã¥ãŒããŒãã®å€æŽãããã«çµã³ä»ããããšã§ãããããã¯æ¬åœã«è¯ãã£ãã§ããã;ïŒ
ããã«ãŠãŒã¹ã±ãŒã¹ãè¿œå ãããã£ãã®ã§ããã @ IanVSã®ããã«ãã³ãŒã«ããã¯ãããã°ããã£ãã§ãããïŒãããã£ãŠãisMobileã®å°éå ·ãåãæ¿ãããšããã¥ãŒããŒãã®å€æŽãããªã¬ãŒã§ããŸãïŒ
ããã®ç¶æ ãæŽæ°ããæ¹æ³ã«èå³ãæã£ãŠãã人ãäœäººããããšèããŸããã è¯ã建ç¯ã«åæã§ããã°ãå€ãã®äººã«ãšã£ãŠäŸ¡å€ããããšæããŸãã ç¹ã«ãããã¯äººã ã䜿çšãããã©ãããéžæã§ããè¿œå ã®æ©èœã§ããã䜿çšããããªã人ã«æªåœ±é¿ãäžããªãããã§ãã
@Hypnosphi ã以åã®å®è£ ã§ããWDYTã«ã€ããŠç°è°ããããŸãããïŒ
ãã®åé¡ãéãããŸãŸã«ããããã«ããã«ã³ã¡ã³ãããŸãã @Hypnosphiã以åã«ããã§ææ¡ãã@
ã¢ã€ãã¢ã¯ãããŸããŸãªçå®ã®æ å ±æºãå°å ¥ããããšã§ã¯ãªããã³ã³ããŒãã³ãã®ç¶æ ã®ä¿¡é Œã§ããå¯äžã®æ å ±æºã§ãããããç¶æã§ããããã«ããããšã§ããããã«æãããŸãã ç§ãææ¡ããä»ã®ãã¹ãŠã®ã¢ãããŒãïŒã©ãããŒã³ã³ããŒãã³ããç¶æ ã¢ããªã³ãåæ§æïŒã¯ãå®éã«ã¯å¥ã®çå®ã®æ å ±æºãå°å ¥ããŸãã ãã§ãã¯ããã¯ã¹ã®äŸã§ã¯ããã§ãã¯ããããã®ãããèšå®ããããšã¯ã§ããŸããããŸããã©ãããŒã³ã³ããŒãã³ãããã§ãã¯ãããå°éå ·ãæäŸã§ããããã«ããŸãã ããã®ã³ã³ãããŒã«ããã«ã¯ã³ã³ããŒãã³ãã®èŠªãšããŠè¡šç€ºãããŸãããçŸåšãã³ã³ããŒãã³ãããã³ãŒã«ããã¯ãååŸããããšã¯ã§ããŸãããããã¯äžçš®ã®äžæ¹çãªãã®ã§ãããreactã¢ããªãéåžžã©ã®ããã«æ§ç¯ããããã§ã¯ãããŸããã
ç§ã«ã¯åççã«èãããŸãã APIã«ã€ããŠèª¬æããŸããã
ããã¯çŽ æŽãããæ©èœã«ãªããŸãã ç§ã¯ããã§éåžžã«åºæ¬çãªå¶åŸ¡ãããã³ã³ããŒãã³ãã§ãããšåãããŒãºã«çŽé¢ããä»ã®ã³ã³ããŒãã³ãã§ã以åã«çŽé¢ããŠããŸããã ã芧ããã ãããããšãããããŸãã
çŸåšã®æ§æã«è¿œãã€ãã®ã¯å°ãé£ããããã§ãã å€åããªãã¯æ¬¡ã®ãããªãã®ã䜿ãããšãã§ããŸãïŒ
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ã§äœæããããã®ã§ã
ç§ã¯ããªãã®åŽã®å©ããåããŠ@aherriotã«ãããçµããããããã«ãã®PRãåéããã ãã ãšæããŸã
ç§ãã¡ã¯ãããæã€ããšãã§ããŸãïŒ
const {value: name, change: setName} = text('Name', 'Kent');
text
ã®ãªã¿ãŒã³ã¿ã€ããå€æŽããå¿
èŠã¯ãããŸããã
Javascripté¢æ°ã¯ãªããžã§ã¯ãã§ãããããããããã£ãæã€ããšãã§ããŸãã
ãªããžã§ã¯ãã¯å解ã§ããŸãã
@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ã®ææ¡ã¯ã©ãã§ããïŒ
ãã®æ©èœããããšäŸ¿å©ã§ãã
ãreacthooksãã®ããã«ãdestructãã¯ã©ãã§ããïŒïŒ
const [foo, setFoo] = useString('foo', 'default');
@DimaRGBãšåãããã«èšãããã«ãªããŸãã
ããšãã°ãæ¢åã®æ§æãä¿æããããã¯ã®ãããªåŒã³åºããè¿œå ã§ããŸãã
.add('example', () => {
const [selected, setSelected] = useBool(false);
return <SomeComponent selected={selected} onSelected={setSelected} />
})
ææãreactã³ã³ããŒãã³ããç¬èªã®props
ãæŽæ°ããããšã¯æ³å®ãããŠããªãå¿
èŠããããŸããã代ããã«ãå€æŽãå¿
èŠã§ããããšã芪ã«äŒããŸãã ã³ã³ããŒãã³ãã«ããã®å°éå
·ãåãæ¿ããããšã«ãªã£ãŠããèŠçŽ ãå«ãŸããŠããå ŽåããããŸãïŒåèŠçŽ ãã¯ãªãã¯ãããå Žåã«ãããã²ãŒã·ã§ã³ããŒã¡ãã¥ãŒãéãå¿
èŠããããããããã«ééããŸããïŒã
@IanVS芪ã®å°éå
·ãä»ããŠã®ã¿æŽæ°ããããã°ã«ã³ã³ããŒãã³ãããããã¹ããŒãªãŒããã¯ã¹ããŒãªãŒã®ãŠãŒã¶ãŒããã°ã«ãããšãUIã®ç¶æ
ãäžèŽããªããšãããŸã£ããåãç¶æ³ããããŸãã @storybook/addons-knobs
ãã©ã€ããŒãã¡ãœããã䜿çšããŠããã¯ããŸããããã£ãšç°¡åãªææ¡ã¯ã次ã®ãããªããšãè¡ãããã®å
¬åŒAPIãæäŸããããšã§ãã
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ç§ã¯ããªãã®ã¢ãããŒããè©ŠããŸããããããã¯ããã®ãã©ãŒã ãæŽæ°ããããã«ã¯èŠããŸããã§ããïŒã³ã³ããŒãã³ãã«æäŸãããå°éå ·ãæŽæ°ããå Žåã§ãïŒã
ç·šéïŒ
ãããã¹ã¯ã©ããããŸãã ã©ããããå¶åŸ¡ãããŠããªããæ¹æ³ã§æäœããããã§ãã¯ããã¯ã¹ã§optionsïŒïŒã䜿çšããŠããããããã®æŽæ°ã衚瀺ãããŸããã§ããã è€æ°éžæã«åãæ¿ããŠã³ãŒã«ããã¯ã§ãã®ã¡ãœããã䜿çšããããšã«ãããæŽæ°ãããå€ããã圢åŒã§ååŸããŸããã
// Ditch when https://github.com/storybooks/storybook/issues/3855 gets resolved properly.
function FixMeKnobUpdate(name, value) {
addons.getChannel().emit(CHANGE, { name, value });
}
ã»ããã¢ããã®è©³çŽ°ãçç¥ããå¯èœæ§ããããŸãã
ãã®ãããªã¢ãããŒãããã¹ãŠã®äººã«åœ¹ç«ã€ãã©ããã¯ããããŸããã
ç§ã¯@IanVSã«å®å šã«åæããŸããã¹ããŒãªãŒããã¯ã¯å€§å¥œã
ã»ããã¢ããïŒAngular 7ïŒã§@erickwilderã®ããã¯ãè©ŠããŸãããã
ãšã©ãŒïŒAngular Zoneã«ãªãããšãäºæ³ãããŸããããããŸãïŒ
ã©ãããããããããAngularã®å€ã§å®è¡ããããšããŸãããããªããšãå®è¡ã§ããŸããã§ãã...ææªã®ã·ããªãªã§ã¯ãAãšBã®ã©ãããŒãšãªã3çªç®ã®ã³ã³ããŒãã³ãCãäœæããŸãã
@erickwilderã®@davidolivefargaäžæãœãªã¥ãŒã·ã§ã³ã¯ããã¬ãŒã ã¯ãŒã¯/ã©ã€ãã©ãªïŒreactãangularãvueããã®ä»ïŒã«é¢é£ããã®ã§ã¯ãªããKnobsã¢ããªã³ã®åã¬ã³ããªã³ã°ã«é¢é£ãããããã©ã®ãã¬ãŒã ã¯ãŒã¯ã§ãæ©èœããã¯ãã§ãã
äžèšãšåãæ¹æ³ã§Reactã䜿çšããŠäœæ¥ããŸãã
+1ã¯ãããªã¬ãŒããå ¬éã¡ãœãããè¿œå ããŸããããã«ã¯ãæŽæ°ããæååãšããŠã®ããåãšæ°ããå€ãå«ãŸããŸãã次ã«äŸã瀺ããŸãã
import { manager } from "@storybook/addon-knobs"
manager.updateKnob(
propName, // knobs property, example from above "Checked"
newValue, // new value to set programmatically, ex. true
)
ãããæ£åŒã«ãµããŒããããããšãæ¬åœã«æãã§ããŸãã
ãããŸã§ã®éãStorybook v5ã§ã¯ããã®ã²ã©ãããããŒãªãœãªã¥ãŒã·ã§ã³ã䜿çšããå¿ èŠããããŸããã
window.__STORYBOOK_ADDONS.channel.emit('storybookjs/knobs/change', {
name: 'The name of my knob',
value: 'the_new_value'
})
ð
ð
é¢é£ïŒïŒ6916
ããã¯ãã£ãããã§ããã...ç¹ã«ã¢ãŒãã«ã ããã§ãã
ããã¯åœ¹ã«ç«ã€ãšæããŸãã
äŸïŒ
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')} />)
ããã¯çŸåšæ©èœããŠããŸãããonChangeã€ãã³ãã®ã¿ãŒã²ããå€ããã¹ããããèŠçŽ ã®å°éå ·ã«èšå®ãããå€ã«ã¯ã€ã€ãªã³ã°ããã®ã¯èªç¶ãªããšã®ããã§ãã ããã¯ãèŠçŽ ã®ã¢ããªã±ãŒã·ã§ã³ããããã瀺ããŸãã
ããã¯äŸ¿å©ã§ã
ããã§ã®è§£æ±ºã«åããŠæã瀺ã@ mathieuk / @raspoã«+1ã
å¥ã®æ¹æ³ã§ããã«ã¢ã¯ã»ã¹ã§ããå¯èœæ§ããããŸãã 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)}
>
...ããã§ããããAPIã«çµã¿èŸŒãããšãã§ãããã®ãžã®ãã¡ã³ããŒãªåæ¹åãã€ã³ãã£ã³ã°ã®åé¿çã®ããã«æããŸã
äžèšã®æŽæ°ã¯ãããŸããïŒ éåžžã«äŸ¿å©ãªæ©èœã«ãªããŸãð
ãã®æ©èœãå®è£ ãããŠãããšãéåžžã«åŒ·åãªçžäºäŸåãããéåžžã«ç°¡åã«å®è¡ã§ããããã«ãªããŸãã ã¹ããŒãªãŒã«æ¬¡ã®ãããªãã®ã䜿çšããŠããããããå¥ã®ããã«å¿ããŠåçã«æŽæ°ã§ããå Žåã«ãããŒãžä»ãã³ã³ããŒãã³ãã¹ããŒãªãŒãäœæããããšãæ³åããŠã¿ãŠãã ããã
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
}
);
resultsCount
ããã10ãã€å¢ãããšã currentPage
ããã®æ倧ç¯å²ãåçã«æŽæ°ãããããšãæåŸ
ããŠãåºæ¬çã«ãããè©ŠããŠã¿ãŸããããåããã®åæå€ã®ããã§ããäœææã«ãã£ãã·ã¥ãããåŸç¶ã®ã¬ã³ããªã³ã°ã§å
éšç¶æ
å€ããªãŒããŒã©ã€ãããããã«äœ¿çšãããããšã¯ãããŸããã äžèšã®ã³ãŒãã§ãç§ã¯å¢å ãããšãã«resultsCount
ç§ã¯æåŸ
10+ã§max
ã®currentPage
ãããŠåºç€ãšãªãå€ã«ãããããããåããããããã®å€ã®æ»åšããŸã1å¢å ããŸãå€æŽããããã®ãèšç®ããããã«äœ¿çšãããŸãïŒ Math.ceil(resultsCount / childrenPerPage) - 1
ããã°ã«èšé²ãããšãæåŸ
ãããæ°ããå€ã衚瀺ãããŸãïŒã
5.3ïŒ1æåæ¬ã®ãªãªãŒã¹ïŒã¯ã»ãŒå®äºãã6.0ïŒ3æäžæ¬ã®ãªãªãŒã¹ïŒã®ããã®æžãçŽããæ€èšããŠããŸããããã«ãããé·å¹Žã®ããã®åé¡ã解決ãããŸãã ããã§äœæ¥ã§ãããã©ããã確èªããŸãã ãåŸ ã¡é ããŸããŠãããããšãããããŸãïŒ
@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,
});
ãŸã åŸ ã£ãŠãããã®æ©èœã¯ãã€ãã£ãã«å®è£ ãããŸãã
ç§ã¯observableã䜿çšããŠãã®åé¡ã解決ããŸããã è§åºŠã®ããã¹ããŒãªãŒããã¯ã䜿çšããŠããŸã
`
.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);
}
}
};
}ïŒ
`
@ norbert-doofusããªãã®äŸãç§ãå©ããŠãããŠããããšãð
ããã«ã¡ã¯ã®ã£ã³ã°ã6.0ããŒã¿çã®ã¢ããªã³ã³ã³ãããŒã«ããªãªãŒã¹ããŸããïŒ
ã³ã³ãããŒã«ã¯ãã¢ããªã³ãããé·æé眮ãæããããšãç®çãšãããããŒã¿ãã«ã§èªåçæãããããã§ãã
ã¢ããã°ã¬ãŒãããŠãä»ãããè©Šããã ããã ãªãªãŒã¹ã®ããã«ãããå®å®ãããããã®ããªãã®å©ããšãµããŒãã«æè¬ããŸãïŒ
ããã¯çŽ æŽãããããšã§ãïŒ READMEãèªãã ã ãã§ã¯ããããŸããïŒèŠéãããããããŸããïŒããããã®æ°ããcontrols
ããã°ã©ã ã§å€æŽããããšã¯ã§ããŸããïŒããã¯ããã®å·ã§è¡ããããªã¯ãšã¹ãã§ãããïŒ
APIãæ£åŒã«ãµããŒããããŠãããã©ããã¯ãŸã ããããŸããããå¯èœæ§ããããŸãïŒaddon-docsã®ã³ã³ãããŒã«ã«å¯ŸããŠæ£ç¢ºã«ãµããŒããããŠããŸãïŒã @tmeasdayãšèŠã€ããŸãã
updateArgs
ãè¿œå ããŸããïŒthis.context?.updateArgs(....)
ïŒControlsã«èå³ãããããã©ãããå§ããã°ãããããããªã人ã®ããã«ãæ°ããCRAãããžã§ã¯ãããå®çšçãªãã¢ã«ç§»è¡ããããã®ç°¡åã§æ±ãã¹ããããã€ã¹ãããã®ãŠã©ãŒã¯ã¹ã«ãŒãäœæããŸããã èŠãŠã¿ãªïŒ
=> CRAãšTypeScriptã䜿çšããã¹ãââãŒãªãŒããã¯ã³ã³ãããŒã«
Controls READMEã«ã¯ãããã€ãã®ãã³ã³ãããŒã«ãžã®ããã移è¡ããã¥ã¡ã³ãããããŸãã
=>ã¢ããªã³ãããã移è¡ããã«ã¯ã©ãããã°ããã§ããïŒ
ã¿ãªãããããã«ã¡ã¯ïŒ
äžæçãªè§£æ±ºçãšããŠã次ã®ã³ãŒãã§ã¢ããªã§äœ¿çšããŸããã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
ã䜿çšããå Žåã¯ã次ã®ããã«ã°ã«ãŒãIDã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)
ããaddon-controls
ãv6ã§
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>;
}
ããããã®ç®çã«æé©ãªAPIã§ãããã©ããã¯ããããŸããããæ©èœããã¯ãã§ãã ã¢ãã¬ãã®äŸïŒ
ããããšãã@ shilmanïŒ ãããããªãã¯ã§ããã
èå³ã®ãã人ã®ããã«ããã®ã¹ã¬ããå
šäœãéå§ããæ£ç¢ºãªCheckbox
ã¹ããŒãªãŒchecked
å°éå
·ããããŸãã Storybook6.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
ãŸããéåžžã®Canvasã¢ãŒãã§ã¯æ£ããæ©èœããŸããã誀ã£ãåäœãããã¥ã¡ã³ãã«è¡šç€ºãããããšãæ確ã«ããå¿ èŠããããŸãã
ç§ã¯observableã䜿çšããŠãã®åé¡ã解決ããŸããã è§åºŠã®ããã¹ããŒãªãŒããã¯ã䜿çšããŠããŸã
`
.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); } } };
}ïŒ
`
ããã¯Angularã䜿çšããŠç§ã«ãšã£ãŠã¯ããŸããããŸãããã5è¡ç®ã§myData.value
ã«å€æŽããŸãã
ç§ã¯ãŸã ãããè©ŠããŠããŸããïŒä»ã®ãšããå€ãããŒãžã§ã³ã®ã¹ããŒãªãŒããã¯ã§ç«ã¡åŸçããŠããŸãïŒãããã®åé¡ã¯ä»ãã解決ã§ããããã§ãã åŒæ°/ã³ã³ãããŒã«ã®çŽ æŽãããäœæ¥ã«æè¬ããŸãïŒ
æãåèã«ãªãã³ã¡ã³ã
5.3ïŒ1æåæ¬ã®ãªãªãŒã¹ïŒã¯ã»ãŒå®äºãã6.0ïŒ3æäžæ¬ã®ãªãªãŒã¹ïŒã®ããã®æžãçŽããæ€èšããŠããŸããããã«ãããé·å¹Žã®ããã®åé¡ã解決ãããŸãã ããã§äœæ¥ã§ãããã©ããã確èªããŸãã ãåŸ ã¡é ããŸããŠãããããšãããããŸãïŒ