SFBDUCPJMFSQMBUF w ͔͜͜Βհ͢ΔίʔυԼهͷߏ w 5SBOTGPSNCSPXTFSJGZSFBDUJGZ w IBSNPOZPQUJPOΛ༻ w HJUIVCDPNLPCBSFBDUCPJMFSQMBUF http://koba04.github.io/react-boilerplate/
1SPQ w $PNQPOFOU͕ͭ*NNVUBCMFͳ1SPQFSUZ w $PNQPOFOUͷ࡞࣌ʹࢦఆ͢Δ͜ͱ͕ग़དྷͯɺUIJTQSPQTYYYͰ ࢀর͢Δ w QSPQTDIJMESFOͰ$PNQPOFOUͷཁૉΛऔಘ͢Δ͜ͱ͕ग़དྷΔ var Sample = React.createClass({ render() { return (
1BSFOUDIJMEDPNNVOJDBUJPO w SFGΛͬͯࢠ$PNQPOFOUͷࢀরΛऔಘग़དྷΔ w ޙड़ͷHFU%0./PEFͱΈ߹Θͤͯɺ3FBDU͕ఏڙ͍ͯ͠ΔJOQVU ͳͲͷ$PNQPOFOUʹର͢ΔࢀরΛऔಘ͢Δ͜ͱʹ͏͜ͱ͋Δ ͚Ͳɺجຊతʹආ͚ͨํ͕͍͍ w 1SPQΛ*'ͱͨ͠ํ͕ݟ௨͕͍͍͠ w %0.ͷࢀরΛऔಘͰ͖Δ componentDidMount() { this.refs.input.getDOMNode().focus(); } render() { return (
5SBOTGFSJOH1SPQT w +49TQSFBEBUUSJCVUFTΛ͏͔ɺ0CKFDUBTTJHOͳͲΛ͏ w طଘͷ$PNQPOFOUΛ֦ு͍ͨ͠Α͏ͳ߹ʹ͏ͱศར w ͨͩɺґଘ͍ͯ͠Δ1SPQ͕Θ͔Γʹ͘͘ͳΔͷͰҙ͕ඞཁ var Avatar = React.createClass({ render: function() { return ( var {userId, ...other} = this.props;
&WFOU w ΫϩεϒϥβରԠͨ͠ωΠςΟϒ"1*ͱಉ͡*'ΛͭಠࣗΠϕϯ τΛ͍࣋ͬͯΔ 4ZOUIFUJD&WFOU
w ෦ͰSPPUͷཁૉʹ͚ͩ&WFOU-JTUFOFSΛొͯ͠ɺ$PNQPOFOU ͱΠϕϯτʹର͢ΔϚοϐϯάΛ࣋ͬͯॲཧ͍ͯ͠Δ w ΠϕϯτϋϯυϥʔͷDPOUFYUDPNQPOFOUͷΠϯελϯεʹͳΔ w UPVDIΠϕϯτΛ༗ޮʹ͍ͨ͠߹ɺˣͷΑ͏ʹ༗ޮʹ͢Δඞཁ ͕͋Δ // handleSubmit(e) { // eSyntheticEvent e.preventDefault(); var artist = this.state.inputArtist; if (artist) { this.props.onHandleSubmit(artist); } },
'PSN6O$POUSPMMFE$PNQPOFOUT w WBMVFଐੑΛࢦఆ͠ͳ͍߹ɺೖྗ͕ͨͦ͠ͷ··ө͞ΕΔɻ EFGBVMU7BMVFΛࢦఆ͢Δ͜ͱͰॳظͷઃఆ͕Մೳ w IUUQKTpEEMFOFULPCBSYK[RSW w ࢀߟ%0.ͷWBMVFͱHFU"UUSJCVUF lWBMVFz ͰऔಘͰ͖Δͷҧ͍ w IUUQKTpEEMFOFULPCBLRVHE
"OJNBUJPO w Ξχϝʔγϣϯ։࢝࣌ʹ3FBDU$445SBOTJUJPO(SPVQϚϯτ͞ Ε͍ͯΔඞཁ͕͋Δ w ΞχϝʔγϣϯରͷཁૉʹLFZଐੑΛ͚ͭΔඞཁ͕͋Δ w USBOTJUJPO &OUFSc-FBWF ʹΑͬͯFOUFS
MFBWFͷͲͪΒ͔ͷΈΞχ ϝʔγϣϯͤ͞Δ͜ͱग़དྷΔ w ࡉ੍͔͍ޚΛ͍ͨ͠߹ɺ3FBDU5SBOTJUJPO(SPVQΛ͏
5FTU w 3FBDUBEEPOT5FTU6UJMTͱͯ͠6UJMܥ͕αϙʔτ͞Ε͍ͯΔ w 4JNVMBUPS͕ศརͦ͏ w IUUQGBDFCPPLHJUIVCJPSFBDUEPDTUFTUVUJMTIUNM w ࣮ࡍɺࢼͯ͠ͳ͍͚Ͳʜ var node = this.refs.input.getDOMNode(); React.addons.TestUtils.Simulate.click(node); React.addons.TestUtils.Simulate.change(node); React.addons.TestUtils.Simulate.keyDown(node, {key: "Enter"});
1FSGPSNBODF w 7JSUVBM%0.ͷEJ⒎Λܭࢉͯͦ͠ͷ෦͚ͩΛ࣮ࡍͷ%0.ʹө͠ ͯ͘ΕΔͷͰύϑΥʔϚϯεʹ༏Ε͍ͯΔ w ίʔυΛॻ͘ͱ͖ʹ%0.ؔ࿈ͷύϑΥʔϚϯεΛ͋·Γҙࣝͨ͘͠ ͳ͍ਓʹͱͬͯ3FBDUKTʹ͓ͤͯ͘͜ͱ͕ग़དྷΔͷͰΑͦ͞͏ w γϏΞʹύϑΥʔϚϯε͕ٻΊΒΕΔΑ͏ͳ߹ɺ TIPVME$PNQPOFOU6QEBUFͰSFOEFSपΓͷνϡʔχϯάΛ͢Δ͜ͱ ग़དྷΔ w 1VSF3FOEFS.JYJOΛ͑Δ߹͏͜ͱͰύϑΥʔϚϯε͕͕͋ Δ͜ͱ w 1FSGPSNBODF5PPMTBEEPOͰެࣜʹఏڙ͞Ε͍ͯΔ
'MVY w 'BDFCPPL͕ఏএ͍ͯ͠ΔΞʔΩςΫνϟ w ΞΫγϣϯͱ͍͏୯ҐͰΠϕϯτΛ %JTQBUDIFSܦ༝ͰΓͱΓͯ͠ɺํͳॲ ཧͷྲྀΕΛ࡞Δ w 3FBDUΛͬͯେنΞϓϦΛ࡞Ζ͏ͱ͢Δ ͱ͜͏͍͏ઃܭʹͳΔͷΘ͔Δؾ͕͢Δ w ৄࡉผ్Ͱʜ w IUUQGBDFCPPLHJUIVCJPqVY https://speakerdeck.com/fisherwebdev/fluxchat#11
3PVUFS w #BDLCPOF3PVUFSͰEJSFDUPSͰ͖ͳͷΛ͏ w SFBDUSPVUFSSFBDUSPVUFSDPNQPOFOUͱ͍͏$PNQPOFOUͰ ϧʔςΟϯάΛఆٛ͢ΔΑ͏ͳͷ͋Δ var Router = require(‘react-router-component’); var Locations = Router.Locations, Location = Router.Location ; var route = {
4FSWFS4JEF3FOEFSJOH w αʔόʔଆͰ$PNQPOFOUΛ)5.-Խͯ͠ฦ͢͜ͱ͕ग़དྷΔ w 1IBOUPN+4ͬͯͷྗٕͳ͜ͱ͠ͳ͍͍ͯ͘ w SFBDUSBJMTFYQSFTTSFBDUWJFXTͱ͍͏ͷެࣜͰαϙʔτͯ͠ ͍ΔͷͰಋೖͷίετߴ͘ͳ͍ w IUUQTHJUIVCDPNSFBDUKT w SFBDUSPVUFSDPNQPOFOU4FSWFS4JEFͰͷ3FOEFSJOHαϙʔτ ͍ͯ͠ΔͷͰΈ߹ΘͤΔͱ͍͍ w IUUQTHJUIVCDPNBOESFZQPQQSFBDUSPVUFSDPNQPOFOU
4FSWFS4JEF3FOEFSJOH w SFOEFS5P4USJOHͱSFOEFS5P4UBUJD.BSLVQͷͲͪΒ͔Λͬͯ )5.-Λੜ͢Δ w SFOEFS5P4USJOH w ϑϩϯτଆͰ3FBDUKTΛͬͯಈతʹ͍ͨ͠߹ʹ͏ w SFOEFS5P4UBUJD.BSLVQ w ੩తͳ)5.- ϑϩϯτଆͰ3FBDUKTΛΘͳ͍ Λੜ͍ͨ͠ͱ ͖ʹ͏
SFOEFS5P4USJOH w αʔόʔଆͰ)5.-Λੜͯ͠ɺΫϥΠΞϯτଆͰSFOEFSͰΠϕ ϯτ͕BUUBDI͞ΕΔ͚ͩ w αʔόʔଆͰੜ͞ΕΔ%0.ߏͱΫϥΠΞϯτଆͰੜ͞ΕΔ %0.ߏ͕ಉ͡ʹ͢Δඞཁ͕͋Δ w 1SPQͳͲ$PNQPOFOUͷੜʹඞཁͳσʔλΛαʔόʔɺΫϥ ΠΞϯτͰڞ༗͢Δඞཁ͕͋Δ w DPNQPOFOU8JMM.PVOU4FSWFS4JEF3FOEFSJOH࣌ʹݺΕΔͷ ͰαʔόʔͰಈ࡞͢ΔίʔυͰ͋Δඞཁ͕͋Δ
SFOEFS5P4UBUJD.BSLVQ w ੩తͳ)5.- EBUBSFBDUJEͳͲ͕ͳ͍ ͕ੜ͞ΕΔ w ϑϩϯτଆͰ3FBDUKTΛͬͯSFOEFS$PNQPOFOU͢Δͱɺαʔόʔ ଆͰੜͨ͠)5.-ΛΘͣʹ৽͘͠%0.Λ࡞ͬͯඳը͞ΕΔ w FYQSFTTSFBDUWJFXT͜ͷϝιουΛ͍ͬͯΔ w ੜ͞ΕΔ)5.-
$PODMVTJPO w ͪΐͬͱͨ͠ΞϓϦॻ͘ͳΒ7VFKTͱ͔XBZσʔλόΠϯσΟϯ άͷϥΠϒϥϦͬͯॻ͘ͷָ͕͚ͩͲɺ͕ͬͭΓ࡞Δ࣌ͷ7JFXͱ ͯ͠3FBDUKT͏ͷΞϦͳؾ͕͢Δ w 4&0͕ඞཁͳ໘Ͱ4FSWFS4JEF3FOEFSJOH͍͔ͨ͠Β͏ͱ͍͏ બ͋Γͦ͏ w +49ͱֶ͔͋ͬͯशίετߴͦ͏ͳҹ͚͋ͬͨͲ"1*γϯϓϧ ͰެࣜಡΊेཧղग़དྷΔ w IUUQGBDFCPPLHJUIVCJPSFBDUEPDT