Slide 1

Slide 1 text

ReactͷύϑΥʔϚϯεΛ վળ͢Δඞཁ͕ͳ͔ͬͨ࿩

Slide 2

Slide 2 text

ࣗݾ঺հɿືɹٛ໌ • ϑϩϯτΤϯυΤϯδχΞ • νʔϜεϐϦοτʹೖࣾ൒೥ • ήʔϜେ޷͖ • ࣾ಺ͷےτϨڭʹೖ৴ͭͭ͋͠Δ

Slide 3

Slide 3 text

ຊ೔ͷ͓࿩ ωοτͰ࠷ۙReactͷ ύϑΥʔϚϯεΛվળͨ͠࿩Λ Α͘ݟΔͷͰ ࣗ෼Ͱ΋΍ͬͯΈͨΒ ಛʹඞཁͳ͔ͬͨͱ͍͏࿩

Slide 4

Slide 4 text

લఏͱͯ͠ Reactͷಛ௃ΛৼΓฦΔ

Slide 5

Slide 5 text

Reactͷ̏ͭͷಛ௃ • JUST THE UI • VIRTUAL DOM • DATA FLOW VIRTUAL DOMʹΑΓ ඞཁ࠷௿ݶͷ ύϑΥʔϚϯε͸कΒΕ͍ͯΔ

Slide 6

Slide 6 text

͋Γ͕ͱ͏ ͓ΘΓ

Slide 7

Slide 7 text

΋͏গ͠ଓ͚·͢ɾɾɾ

Slide 8

Slide 8 text

·ͱΊ • React͸Virtul DomͰͷࠩ෼ߋ৽Λߦ͏ͨΊɹ ࠷ॳ͔Β͋Δఔ౓ͷύϑΥʔϚϯε͕อͯΔ Α͏ʹग़དྷ͍ͯΔɻ

Slide 9

Slide 9 text

վΊͯ DOM͸͍ͭߋ৽͞ΕΔͷ͔ʁ

Slide 10

Slide 10 text

Stateͷߋ৽

Slide 11

Slide 11 text

container amountΛߋ৽ State͕ߋ৽࣌ɺ࠶ϨϯμϦϯά͕ൃੜ ίϯϙʔωϯτ܈ $PNQPOFOU% $PNQPOFOU& $PNQPOFOU' $PNQPOFOU$ $PNQPOFOU# $PNQPOFOU" TFU4UBUF \BNPVOUWBMVF^ ࣮ࡍʹBNPVOUΛ࢖͏ ίϯϙʔωϯτ

Slide 12

Slide 12 text

ٯΛݴ͏ͱɾɾɾ

Slide 13

Slide 13 text

container setStateʹΑΓ ม਺VΛߋ৽ state͕ίϯϙʔωϯτʹ౉͍ͬͯΕ͹ɺ ྫ͑ະ࢖༻Ͱ΋࠶ϨϯμϦϯά͕૸Δ ίϯϙʔωϯτ܈ ίϯϙʔωϯτ $PNQPOFOU% $PNQPOFOU& $PNQPOFOU' $PNQPOFOU$ $PNQPOFOU# $PNQPOFOU" BNPVOUΛνΣοΫ BNPVOUΛʜ BNPVOUΛ νΣοΫ BN TFU4UBUF \BNPVOUWBMVF^ ࣮ࡍʹBNPVOUΛ࢖͏ ίϯϙʔωϯτ

Slide 14

Slide 14 text

࠶ϨϯμϦϯάͷ ճ਺ΛݮΒ͢ʹ͸ʁ

Slide 15

Slide 15 text

state͸ઙ͘อͪɺ֤ίϯϙʔωϯτͷ ߋ৽ʹඞཁͳ΋ͷ͚ͩ౉͢Α͏৺͕͚Δ this.state = { // ඞཁͳstateΛҰͭͷΦϒδΣΫτʹશͯ֨ೲ͍ͯ͠Δύλʔϯ masterObject: { date: ‘2017-5-15’, amount: 3000, name: ‘tawashi’, } }; this.state = { // stateΛ෼ׂͨ͠ date: ‘2017-5-15’, amount: 3000, name: ‘tawashi’, };

Slide 16

Slide 16 text

Spread Attributes΍ChildrenͳͲͷ ͝ར༻͸ܭըతʹ render() { // Spread Attributes return ; } • όέπϦϨʔʹർΕͨਓͷٹੈओ • ͝ར༻͸ܭըతʹ

Slide 17

Slide 17 text

ෆཁͳpropsͷड͚౉͠ΛࢭΊΔ class MeatMarker extends Component { render() { return ; } } • ԼҐίϯϙʔωϯτʹ౉͢஋͸ඞཁͳ΋ͷͩ ͚ʹ͠·͠ΐ͏ • ϨϏϡʔ΍ݟ௚͠͸͔ͬ͠Γͱ

Slide 18

Slide 18 text

ReactϙϦεʢϨϏϡʔΞʣͱͯ͠ ͔ͬ͠Γ࢓ࣄ͍͖ͯ͠·͠ΐ͏

Slide 19

Slide 19 text

·ͱΊ • React͸Virtul DomͰͷࠩ෼ߋ৽Λߦ͏ͨΊɹ ɹ ࠷ॳ͔Β͋Δఔ౓ͷύϑΥʔϚϯε͕อͯΔ Α͏ʹग़དྷ͍ͯΔɻ • React͕ύϑΥʔϚϯεΛൃشͰ͖ΔΑ͏ʹߏ ੒͞Ε͍ͯΔ͔ৗʹ֬ೝ͢Δɻ

Slide 20

Slide 20 text

΋͏Ұ੠ؤுͬͯΈΔ

Slide 21

Slide 21 text

componentWillUpdate(nextProps) { console.log(this.state.amount); console.log(nextProps.amount); } // લճͱඳը݁Ռ͕Ұॹ͕ͩ࠶౓ϨϯμϦϯά͸࣮ࢪ͞ΕΔ render(){ ɹˡɹ return (

{amount}

); } ߋ৽ͷલޙͰState͕ಉҰͷ৔߹Ͱ΋ ࠶ϨϯμϦϯά͕૸Δ

Slide 22

Slide 22 text

࠶ϨϯμϦϯάͷ ճ਺ΛݮΒ͢ʹ͸ʁ

Slide 23

Slide 23 text

shouldComponentUpdate

Slide 24

Slide 24 text

shouldComponentUpdate class MeatMarker extends Component { shouldComponentUpdate: function(nextProps, nextState) { if (this.props.userName !== nextProps.userName) { return true;ɹˡ update࣮ࢪ } else { return false;ɹˡɹupdate͞Εͳ͍ } } • ίϯϙʔωϯτΛ࠶ඳը͢Δ͔Ͳ͏͔Λܾఆ͢Δ • updateલʹ࣮ߦ͞ΕΔɻ • ໭Γ஋ͰfalseΛฦͤ͹update͸࣮ࢪ͞Εͳ͍ɹ (σϑΥϧτͰ͸ඞͣtrue͕ฦΓ·͢)

Slide 25

Slide 25 text

shouldComponentUpdateΑ͋͘Δ࣮૷ shouldComponentUpdate: function(nextProps, nextState) { // user໊͕ߋ৽લޙͰಉҰͳΒߋ৽ॲཧ͸࣮ࢪ͠ͳ͍ return this.props.userName !== nextProps.userName; } ̍.৚݅Λઃܭ࣮ͯ͠૷ 2.lodash΍immutable.jsΛར༻࣮ͨ͠૷ shouldComponentUpdate: function(nextProps, nextState) { // ߋ৽લޙͰ஋͕มΘ͍ͬͯͳ͚Ε͹ɺupdate͸࣮ࢪ͠ͳ͍ const propsDiff = _.isEqual(nextProps, this.props); const stateDiff = _.isEqual(nextState, this.state); return !(propsDiff && stateDiff); }

Slide 26

Slide 26 text

PureComponentͰ΋OK class MeatMarker extends Component { constructor(props) { super(props); ɹɹɹɹɹɹɹ! //extendsઌΛPureComponentʹมߋ͢Δʮ͚ͩʯͰར༻Ͱ͖Δ class MeatMarker extends PureComponent { constructor(props) { super(props); • React v15.3Ҏ߱Ͱ࣮૷͞Ε͍ͯΔ • shouldComponentUpdateΛཪͰ࣮૷ • શͯͷstateͱpropsʹshallowͳൺֱΛ࣮ࢪ

Slide 27

Slide 27 text

೦ͷͨΊͷshallowͳൺֱͷ͓͞Β͍ ̍ճ໨ api.get("/api/user",(req, res) => { this.setState({user:res}) ); console.log(this.state.user); ݁Ռ {user: ‘minato’ , company: ‘TeamSpirit’} ̎ճ໨ api.get("/api/user",(req, res) => { this.setState({user:res}) ); console.log(this.state.user); ݁Ռ {user: ‘minato’ , company: ‘TeamSpirit’} ̍ճ໨ͱ̎ճ໨ͰผͷΦϒδΣΫτΛ ੜ੒͍ͯ͠ΔͷͰtrue͕ؼΓ·͢

Slide 28

Slide 28 text

WARNING!

Slide 29

Slide 29 text

Կ΋ߟ࣮͑ͣ૷͢Δͷ͸·͍ͣ class BaseComponent extends React.Component { shouldComponentUpdate: function(nextProps, nextState) { const propsDiff = _.isEqual(nextProps, this.props); const stateDiff = _.isEqual(nextState, this.state); return !(propsDiff && stateDiff); } } ɹྫ͑͹ҎԼͷΑ͏ʹߋ৽લޙͷstateɺprops Λൺֱ͢ΔBaseClassΛ࣮૷͠ɺશͯͷclassͰܧ ঝͯ͠ൺֱॲཧΛ࣮૷͢ΔͱɺٯʹύϑΥʔϚ ϯε͕௿Լ͢ΔՄೳੑ͕͋Δʢͱݴ͏͔͢Δʣ

Slide 30

Slide 30 text

Ͳ͜ʹ࣮૷͢΂͖͔͸ ͪΌΜͱݕ౼͔ͯ͠Βʹ ͠·͠ΐ͏

Slide 31

Slide 31 text

·ͱΊ • React͸Virtul DomͰͷࠩ෼ߋ৽Λߦ͏ͨΊɹ ɹ ࠷ॳ͔Β͋Δఔ౓ͷύϑΥʔϚϯε͕อͯΔ Α͏ʹग़དྷ͍ͯΔɻ • React͕ύϑΥʔϚϯεΛൃشͰ͖ΔΑ͏ʹߏ ੒͞Ε͍ͯΔ͔ৗʹ֬ೝ͢Δɻ • shouldComponentUpdateͰߋ৽લޙͷ஋͕ ಉҰͷ৔߹ʹߋ৽ॲཧΛߦΘͳ͍Α͏ʹ͢Δ

Slide 32

Slide 32 text

͜͜·Ͱ͸༧๷

Slide 33

Slide 33 text

͔͜͜Β͸ର঱ྍ๏

Slide 34

Slide 34 text

ύϑΥʔϚϯεͷ ϘτϧωοΫΛ୳͢

Slide 35

Slide 35 text

PerfͷಋೖɻPerfͱ͸Կ͔ʁ • ίϯϙʔωϯτͷඳըʹ͔͔Δ࣌ؒΛௐ΂Δ ͜ͱ͕Ͱ͖Δπʔϧ • ϒϥ΢βͷίϯιʔϧ্Ͱಈ࡞͢Δ ↓͜Μͳײ͡ͷ݁Ռ͕ग़ͯͲ͜ʹ͕͔͔͍࣌ؒͬͯΔ֬ೝͰ͖Δ

Slide 36

Slide 36 text

PerfͰͷݪҼಛఆͱରॲํ๏ import React from ‘react'; import Perf from 'react-addons-perf'; class MeatMaker extends React.Component { componentDidMount() { window.Perf = Perf; }; } 1. componentDidMountͰPerfΛWindowʹ ηοτ͢Δɻ Reactιʔείʔυ

Slide 37

Slide 37 text

PerfͰͷݪҼಛఆͱରॲํ๏ 2. Perf.start()Λ࣮ߦɻ 3. ޷͖ͳ͚ͩΞΫγϣϯΛى͜͢ɻ 4. Perf.stop()Λ࣮ߦɻ 5. getLastMeasurementsͰ಺༰Λ֬ೝ͠ɺ࣌ؒ ͕͔͔͍ͬͯΔՕॴΛ֬ೝɻ ϒϥ΢βίϯιʔϧ ͜͜ΒลͳΜ͔΍͹ͦ͏

Slide 38

Slide 38 text

PerfͰͷݪҼಛఆͱରॲํ๏ʢผղʣ import React from ‘react'; import Perf from 'react-addons-perf'; class MeatMaker extends React.Component { componentDidMount() { window.Perf = Perf; } render (){ return (
{Perf.start()} {Perf.stop()}
); } } ίϯϙʔωϯτͷಡΈࠐΈલޙͰstartɺstopΛ࣮ ࢪɺ֬ೝ͸ͦͷޙϒϥ΢β͔Βߦͬͯ΋OK

Slide 39

Slide 39 text

ݪҼ΍৔ॴΛಛఆͨ͠ޙͷରॲํ๏͸ʁ جຊ͸લ߲·ͰͷLTͷ಺༰Λ ࢥ͍ฦ͍͚ͯͨͩ͠Ε͹ େৎ෉ʢͷ͸ͣʣʂ

Slide 40

Slide 40 text

۩ମతʹ͸ʁʢ͓͞Β͍ʣ • ߏ੒Λݟ௚͠ • ෆཁͳpropsͷ࡟আ • shouldComponentUpdate(PureComponent) ͷ࣮૷

Slide 41

Slide 41 text

ݪҼͱରॲฤʢ͓·͚ʣ getSubContainer() { switch (this.state.selectedKey) { case 'meat': return (); case 'chicken': return (); default : return null; } }Window.Perf.start()Λ࣮ߦ ↓ຖճίϯϙʔωϯτΛ࠶࡞੒͍ͯ͠ΔͷͰॏ͍

Slide 42

Slide 42 text

ݪҼͱରॲฤʢ͓·͚ʣ renderSubContainer() { {const meat = this.state.selectedKey === ‘meat’ } {const chicken = this.state.selectedKey === ‘chicken’ } return (
);
); } ঢ়گʹԠͯ͡ίϯϙʔωϯτΛඇදࣔʹ͠ɺ ࠶࡞੒͸ࣙΊͯΈͨ

Slide 43

Slide 43 text

࠶ϨϯμϦϯά͸ૣ͘ͳͬͨʂ

Slide 44

Slide 44 text

͕

Slide 45

Slide 45 text

ॳظදࣔ͸஗͘ͳΓ ϝϞϦͷৗ࣌ͷ࢖༻ྔ͸૿͑ͨ

Slide 46

Slide 46 text

ଥ౰ͳτϨʔυΦϑ͔ ݕূ͸ඞཁ ΫϫΨλ खฤΈͷϚϑϥʔ

Slide 47

Slide 47 text

·ͱΊ • React͸Virtul DomͰͷࠩ෼ߋ৽Λߦ͏ͨΊɺ࠷ॳ͔Β ͋Δఔ౓ͷύϑΥʔϚϯε͕อͯΔΑ͏ʹग़དྷ͍ͯΔɻ • React͕ύϑΥʔϚϯεΛൃشͰ͖ΔΑ͏ʹߏ੒͞Εͯ ͍Δ͔ৗʹ֬ೝ͢Δɻ • shouldComponentUpdateͰߋ৽લޙͷ஋͕ಉҰͷ৔߹ ʹߋ৽ॲཧΛߦΘͳ͍Α͏ʹ͢Δɻ • ϨϯμϦϯά͕஗͍৔߹͸PerfΛ࢖ͬͯݪҼΛಛఆ͠ɺ ରॲྍ๏Λ࣮૷͢Δɻ࣮૷͸ܭըతʹ

Slide 48

Slide 48 text

࠷ޙʹࠓߋͰ͕͢ λΠτϧͷ݅ʹ͍ͭͯ

Slide 49

Slide 49 text

ॳΊͯฐࣾͷ੡඼ͷύϑΥʔϚϯεΛҙࣝͨ࣌͠ • ฐࣾͷϓϩμΫτ͸೔ࠒͷϨϏϡʔΛ͋Δఔ ౓͔ͬ͠Γ΍͍ͬͯͨ͜ͱ΋͋Γɺɹɹɹɹ ผʹࠓ͙͢ύϑΥʔϚϯεΛҙࣝͨ͠मਖ਼Λ ࣮ࢪ͠ͳͯ͘΋͍͍͔ͳɻͱ͍͏ͷ͕࠷ॳͷ ײ૝Ͱͨ͠ɻ • ࣮૷ͯ͠΋ମײͰ͖Δఔͷ͕ࠩ͋·Γແ͘ɺ ଞͷݕ౼ࣄ߲͕ग़ͦ͏ͩͬͨ • ϚδͰࠔͬͨΒPerfͰͳΜͱ͔͢Δ

Slide 50

Slide 50 text

·ͱΊͷ·ͱΊ • React͸Virtual Domͷࢥ૝΋͋Γɺҙࣝͤͣ ͱ΋ύϑΥʔϚϯε͸͋Δఔ౓ग़Δɻ • ઃܭͱ೔ࠒͷϨϏϡʔ͕େࣄɻઃܭ΍೔ࠒͷ ϨϏϡʔ͕ສશͳΒ͹ɺͦ΋ͦ΋ύϑΥʔϚ ϯεͷվળࣗମ͕ෆཁͳ͜ͱ΋ଟ͍ɻ • ϚδͰࠔͬͨΒPerfͰͳΜͱ͔͢Δ

Slide 51

Slide 51 text

ྑ͍ReactϥΠϑΛ

Slide 52

Slide 52 text

͝੩ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠