blog.bitsrc.ioã§å
¬éãããChidume Nnamdiã«ããèšäºã®ç¿»èš³ã玹ä»ããŸãã äžèŠãªã¬ã³ããªã³ã°ãåé¿ããæ¹æ³ãšãReactã®äŸ¿å©ãªæ°ããããŒã«ãåŠç¿ãããå Žåã¯ãcatãžããããã

React.jsããŒã ã¯ãReactãå¯èœãªéãé«éã«å®è¡ããããã«æžåœã«åãçµãã§ããŸãã éçºè
ãReactã¢ããªã±ãŒã·ã§ã³ãé«éåã§ããããã«ã次ã®ããŒã«ã远å ãããŸããã
- React.lazyããã³é
å»¶ã³ã³ããŒãã³ãããŒãã®ãµã¹ãã³ã¹ã
- çŽç²ãªæå
- ã©ã€ããµã€ã¯ã«ããã¯shouldComponentUpdateïŒ...ïŒ{...}ã
ãã®èšäºã§ã¯ããšããããã³ã³ããŒãã³ãæ©èœãé«éåããããã«React v16.6ã«è¿œå ãããå¥ã®æé©åããŒã«React.memoã
æ€èšããŸãã
ãã³ãïŒ
Bitã䜿çšããŠãReactã³ã³ããŒãã³ããã€ã³ã¹ããŒã«ããã³å
±æããŸãã ã³ã³ããŒãã³ãã䜿çšããŠæ°ããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããŒã ãšå
±æããŠç©äºãã¹ããŒãã¢ããããŸãã 詊ããŠã¿ãŠãã ããïŒ

远å ã¬ã³ããªã³ã°
Reactã§ã¯ãåã³ã³ããŒãã³ãã¯ãã¥ãŒãŠãããã«å¯Ÿå¿ããŠããŸãã ã³ã³ããŒãã³ãã«ãç¶æ
ããããŸãã ãŠãŒã¶ãŒã®ã¢ã¯ã·ã§ã³ã«ããç¶æ
å€ãå€åãããšãã³ã³ããŒãã³ãã¯åæç»ãå¿
èŠã§ããããšãèªèããŸãã Reactã³ã³ããŒãã³ãã¯äœåºŠã§ãåæç»ã§ããŸãã ããã¯å¿
èŠãªå ŽåããããŸãããã»ãšãã©ã®å Žåãç¹ã«ã¢ããªã±ãŒã·ã§ã³ã®é床ã倧å¹
ã«äœäžãããããã¬ã³ãã©ãŒãªãã§å®è¡ã§ããŸãã
次ã®ã³ã³ããŒãã³ããæ€èšããŠãã ããã
import React from 'react'; class TestC extends React.Component { constructor(props) { super(props); this.state = { count: 0 } } componentWillUpdate(nextProps, nextState) { console.log('componentWillUpdate') } componentDidUpdate(prevProps, prevState) { console.log('componentDidUpdate') } render() { return ( <div > {this.state.count} <button onClick={()=>this.setState({count: 1})}>Click Me</button> </div> ); } } export default TestC;
{countïŒ0}ç¶æ
ã®åæå€ã¯0ã§ããClickmeãã¿ã³ãã¯ãªãã¯ãããšãcountç¶æ
ã¯1ã«ãªããŸããç»é¢ã§ã¯ã0ã1ã«å€ãããŸãããããããã¿ã³ãå床ã¯ãªãã¯ãããšãåé¡ãå§ãŸããŸããæ¡ä»¶ã¯å€æŽãããŠããŸããã ã«ãŠã³ã¿ãŒå€ãtoãã¯1ã§ãæ°ããå€ã1ã§ããã€ãŸããDOMãæŽæ°ããå¿
èŠã¯ãããŸããã
åãç¶æ
ã2åèšå®ãããTestCã®æŽæ°ã確èªããããã«ã2ã€ã®ã©ã€ããµã€ã¯ã«ã¡ãœããã远å ããŸããã ç¶æ
ã®å€åã«ããã³ã³ããŒãã³ããæŽæ°/åæç»ããããšãReactã¯componentWillUpdateãµã€ã¯ã«ãéå§ããŸãã componentdidUpdate Reactãµã€ã¯ã«ã¯ãã³ã³ããŒãã³ããæ£åžžã«ã¬ã³ããªã³ã°ããããšéå§ãããŸãã
ãã©ãŠã¶ã§ã³ã³ããŒãã³ããèµ·åãããClick meããã¿ã³ãæ°åã¯ãªãã¯ããããšãããšã次ã®çµæãåŸãããŸãã

ã³ã³ãœãŒã«ã§componentWillUpdateãšã³ããªãç¹°ãè¿ããšãç¶æ
ãå€ãããªãå Žåã§ãã³ã³ããŒãã³ããåæç»ãããŸãã ããã¯è¿œå ã®ã¬ã³ããªã³ã°ã§ãã
çŽç²ãªã³ã³ããŒãã³ã/ shouldComponentUpdate
shouldComponentUpdateã©ã€ããµã€ã¯ã«ããã¯ã¯ãReactã³ã³ããŒãã³ãã§ã®äžèŠãªã¬ã³ããªã³ã°ãåé¿ããã®ã«åœ¹ç«ã¡ãŸãã
Reactã¯ãã³ã³ããŒãã³ãã¬ã³ããªã³ã°ã®éå§æã«
shouldComponentUpdateã¡ãœãããèµ·åãããã®ã¡ãœããããç·ä¿¡å·ãåãåã£ãŠããã»ã¹ãç¶è¡ããããããã»ã¹ã
çŠæ¢ãããŠããããšãéç¥ããŸãã
shouldComponentUpdateãæ¬¡ã®ããã«ããŸãã
shouldComponentUpdate(nextProps, nextState) { return true }
nextProps
ïŒã³ã³ããŒãã³ããåãåãæ¬¡ã®props
å€ãnextState
ïŒã³ã³ããŒãã³ããåãåãæ¬¡ã®state
å€ã
æ»ãå€ã
true
ãããReactãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ã§ããããã«ããŸãã
次ã®ããã«æžããšä»®å®ããŸãã
shouldComponentUpdate(nextProps, nextState) { return false }
ãã®å Žåã
false
è¿ããããããReactãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããšãçŠæ¢ããŸãã
äžèšãããã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã«ã¯
true
ãè¿ãå¿
èŠãããããšã«ãªã
true
ã ããã§ãTestCã³ã³ããŒãã³ããæ¬¡ã®ããã«æžãæããããšãã§ããŸãã
import React from 'react'; class TestC extends React.Component { constructor(props) { super(props); this.state = { count: 0 } } componentWillUpdate(nextProps, nextState) { console.log('componentWillUpdate') } componentDidUpdate(prevProps, prevState) { console.log('componentDidUpdate') } shouldComponentUpdate(nextProps, nextState) { if (this.state.count === nextState.count) { return false } return true } render() { return ( <div> { this.state.count } <button onClick = { () => this.setState({ count: 1 }) }> Click Me </button> </div> ); } } export default TestC;
TestComponentã³ã³ããŒãã³ãã«shouldComponentUpdateããã¯ã远å ããŸããã çŸåšãçŸåšã®ç¶æ
ãªããžã§ã¯ã
this.state.count
ã®
count
å€ã¯ã次ã®ç¶æ
ãªããžã§ã¯ã
nextState.count
count
å€ãšæ¯èŒãããŸãã çãã
===
å Žåãåæç»ã¯è¡ãããã
false
è¿ãããŸãã çãããªãå Žåã¯
true
è¿ãããã¬ã³ãã©ãŒãèµ·åããŠæ°ããå€ã衚瀺ãããŸãã
ãã©ãŠã¶ã§ã³ãŒãããã¹ããããšãããªãã¿ã®çµæã衚瀺ãããŸãã

ãããã
Click Me
ãã¿ã³ãæ°å
Click Me
ãããšã衚瀺ãããã®ã¯æ¬¡ã®ããã«ãªããŸãïŒ1åã ã衚瀺ãããŸãïŒïŒã
componentWillUpdate
componentDidUpdate

React DevToolsã¿ãã§TestCã³ã³ããŒãã³ãã®ç¶æ
ã倿Žã§ããŸãã [React]ã¿ããã¯ãªãã¯ããå³åŽã®[TestC]ãéžæãããšãã«ãŠã³ã¿ãŒã¹ããŒã¿ã¹å€ã衚瀺ãããŸãã

ãã®å€ã¯å€æŽã§ããŸãã ã«ãŠã³ã¿ãŒããã¹ããã¯ãªãã¯ãã2ãšå
¥åããŠEnterããŒãæŒããŸãã

ã«ãŠã³ãã®ç¶æ
ã倿Žãããã³ã³ãœãŒã«ã«æ¬¡ã®ããã«è¡šç€ºãããŸãã
componentWillUpdate componentDidUpdate componentWillUpdate componentDidUpdate

以åã®å€ã¯1ã§ãæ°ããå€ã¯2ã ã£ããããåæç»ãå¿
èŠã§ããã
Pure Componentã«é²ã¿ãŸãããã
Pure Componentã¯ãReactã®ããŒãžã§ã³v15.5ã«ç»å ŽããŸããã ããã©ã«ãå€ãæ¯èŒããããã«äœ¿çšãããŸãïŒ
change detection
ïŒã
extend React.PureComponent
ã䜿çš
extend React.PureComponent
ã
shouldComponentUpdate
ã©ã€ããµã€ã¯ã«ã¡ãœãããã³ã³ããŒãã³ãã«è¿œå ããå¿
èŠããããŸããã倿Žã®è¿œè·¡ã¯
shouldComponentUpdate
ããŸãã
PureComponentãTestCã³ã³ããŒãã³ãã«è¿œå ããŸãã
import React from 'react'; class TestC extends React.PureComponent { constructor(props) { super(props); this.state = { count: 0 } } componentWillUpdate(nextProps, nextState) { console.log('componentWillUpdate') } componentDidUpdate(prevProps, prevState) { console.log('componentDidUpdate') } render() { return ( <div> { this.state.count } <button onClick = { () => this.setState({ count: 1 }) }> Click Me </button> </div > ); } } export default TestC;
ã芧ã®ãšããã
shouldComponentUpdate
ãã³ã¡ã³ãã«æçš¿ããŠããŸãã ããå¿
èŠãããŸãã
React.PureComponent
ããã¹ãŠã®äœæ¥ãè¡ããŸãã
ãã©ãŠã¶ãåèµ·åããŠæ°ãããœãªã¥ãŒã·ã§ã³ããã¹ããã
Click Me
]ãã¿ã³ãæ°å
Click Me
ãããšã次ã®çµæãåŸãããŸãã


ã芧ã®ããã«ã1ã€ã®
component*Update
ãšã³ããªã®ã¿ãã³ã³ãœãŒã«ã«è¡šç€ºãããŸããã
Reactã§ES6ã®ã³ã³ããŒãã³ãã¯ã©ã¹ã§åæç»ãè¡ãæ¹æ³ã確èªããããã³ã³ããŒãã³ã颿°ã«ç§»ããŸãããã 圌ããšåãçµæãéæããã«ã¯ïŒ
æ©èœã³ã³ããŒãã³ã
Pure Componentããã³
shouldComponentUpdate
ã©ã€ããµã€ã¯ã«
shouldComponentUpdate
ã䜿çšããŠãã¯ã©ã¹ã§ã®äœæ¥ãæé©åããæ¹æ³ããã§ã«ç¥ã£ãŠããŸãã ã¯ã©ã¹ã³ã³ããŒãã³ããReactã®ã¡ã€ã³ã³ã³ããŒãã³ãã§ãããšäž»åŒµãã人ã¯ããŸãããã颿°ãã³ã³ããŒãã³ããšããŠäœ¿çšã§ããŸãã
function TestC(props) { return ( <div> I am a functional component </div> ) }
颿°ã³ã³ããŒãã³ãã¯ãã¯ã©ã¹ã³ã³ããŒãã³ããšã¯ç°ãªããç¶æ
ãæããªãããšã«
useState
ããããšãéèŠã§ãïŒ
useState
ããã¯ã
useState
ããããè°è«ããããšãã§ããŸãïŒãã€ãŸããåæç»ãæ§æããããšã¯ã§ããŸããã ã¯ã©ã¹ã®æäœäžã«äœ¿çšããã©ã€ããµã€ã¯ã«ã¡ãœããã¯ãããã§ã¯äœ¿çšã§ããŸããã ã©ã€ããµã€ã¯ã«ããã¯ã颿°ã³ã³ããŒãã³ãã«è¿œå ã§ããå Žåã
shouldComponentUpdate
ã¡ãœããã远å ããŠã颿°ã¬ã³ãã©ãŒãå¿
èŠã§ããããšãReactã«éç¥ã§ããŸãã ïŒãããããèè
ãæåŸã®æã§äºå®ã«èª€ããç¯ããã®ã§ããã
extend React.PureComponent
çŽç·šïŒãããŠããã¡ããã
extend React.PureComponent
䜿çš
extend React.PureComponent
ããšã¯ã§ããŸããã
ã³ã³ããŒãã³ãã¯ã©ã¹ES6 TestCãã³ã³ããŒãã³ã颿°ã«å€æããŸãã
import React from 'react'; const TestC = (props) => { console.log(`Rendering TestC :` props) return ( <div> {props.count} </div> ) } export default TestC;
ã³ã³ãœãŒã«ã§ã¬ã³ããªã³ã°ããåŸã
Rendering TestC :5
ãšã³ããªã衚瀺ãããŸãã

DevToolsãéãã[React]ã¿ããã¯ãªãã¯ããŸãã ããã§ã¯ãTestCã³ã³ããŒãã³ãã®ããããã£ã®å€ã倿ŽããããšããŸãã TestCãéžæãããšãTestCã®ãã¹ãŠã®ããããã£ãšå€ãå«ãã«ãŠã³ã¿ãŒããããã£ãå³åŽã«éããŸãã çŸåšã®å€ã5ã®ã«ãŠã³ã¿ãŒã®ã¿ã衚瀺ãããŸãã
5ãã¯ãªãã¯ããŠå€ã倿ŽããŸãã 代ããã«ãå
¥åãŠã£ã³ããŠã衚瀺ãããŸãã

æ°å€ã倿ŽããŠEnterããŒãæŒããšãå
¥åããå€ã«åŸã£ãŠã³ã³ããŒãã³ãã®ããããã£ã倿ŽãããŸãã 45ãšä»®å®ããŸãã

[ã³ã³ãœãŒã«]ã¿ãã«ç§»åããŸãã

åã®å€5ãçŸåšã®45ã«å€æŽããããããTestCã³ã³ããŒãã³ããåæç»ãããŸããã[React]ã¿ãã«æ»ããå€ã45ã«å€æŽããŠãããã³ã³ãœãŒã«ã«æ»ããŸãã

ã芧ã®ããã«ã以åã®å€ãšæ°ããå€ã¯åãã§ãããã³ã³ããŒãã³ãã¯åã³åæç»ãããŸãã :(
ã¬ã³ãã©ãŒã管çããæ¹æ³ã¯ïŒ
解決çïŒReact.memoïŒïŒ
React.memo()
ã¯ãReact v16.6ã§å°å
¥ãããæ°æ©èœã§ãã ãã®åäœåçã¯ã
React.PureComponent
ã®åçã«äŒŒãŠããŸããã³ã³ããŒãã³ã颿°ã®åæç»ã®ç®¡çã«åœ¹ç«ã¡ãŸãã ã¯ã©ã¹ã³ã³ããŒãã³ãã®
React.memo(...)
ã¯ã颿°ã³ã³ããŒãã³ãã®
React.PureComponent
ã§ãã
React.memoã®äœ¿ç𿹿³ïŒ...ïŒãšãŠãç°¡åã§ãã ã³ã³ããŒãã³ã颿°ããããšããŸãã
const Funcomponent = ()=> { return ( <div> Hiya!! I am a Funtional component </div> ) }
React.memo颿°ã®åŒæ°ãšããŠFuncComponentãæž¡ãã ãã§ãã
const Funcomponent = ()=> { return ( <div> Hiya!! I am a Funtional component </div> ) } const MemodFuncComponent = React.memo(FunComponent)
React.memoã¯ã
purified MemodFuncComponent
MemodFuncComponentãè¿ããŸãã ããã¯ãJSXããŒã¯ã¢ããã§æç»ãããã®ã§ãã ã³ã³ããŒãã³ãã®ããããã£ãšç¶æ
ãå€åãããšãReactã¯ã³ã³ããŒãã³ãã®ä»¥åãšçŸåšã®ããããã£ãšç¶æ
ãæ¯èŒããŸãã ãããŠãããããåäžã§ãªãå Žåã«ã®ã¿ãã³ã³ããŒãã³ã颿°ãåæç»ãããŸãã
ãããTestC颿°ã³ã³ããŒãã³ãã«é©çšããŸãã
let TestC = (props) => { console.log('Rendering TestC :', props) return ( <div> { props.count } </> ) } TestC = React.memo(TestC);
ãã©ãŠã¶ãéããã¢ããªã±ãŒã·ã§ã³ãããŠã³ããŒãããŸãã DevToolsãéããReactã¿ãã«ç§»åããŸãã
<Memo(TestC)>
éžæããŸãã
å³åŽã®ãããã¯ã§ã«ãŠã³ã¿ãŒã®ããããã£ã89ã«å€æŽãããšãã¢ããªã±ãŒã·ã§ã³ãåæç»ãããŸãã

å€ãåã®89ã«å€æŽãããšã...

åæç»ã¯ãããŸããïŒ
React.memoã®æ å
ïŒ...ïŒïŒ :)
æåã®äŸã§
React.memo(...)
ã䜿çšããªããšã以åã®å€ãåãå€ã«å€æŽãããå Žåã§ããTestCã³ã³ããŒãã³ã颿°ãåæç»ãããŸãã ããã§ã
React.memo(...)
ãããã§ãã³ã³ããŒãã³ã颿°ã®äžå¿
èŠãªã¬ã³ããªã³ã°ãåé¿ã§ããŸãã
ãããã«
- ãªã¹ããèŠãŠã¿ãŸããããïŒ
React.PureComponent
ã·ã«ããŒ;React.memo(...)
-ãŽãŒã«ã;React.PureComponent
ã¯ES6ã¯ã©ã¹ã§æ©èœããŸããReact.memo(...)
ã¯é¢æ°ã§æ©èœããŸããReact.PureComponent
ã¯ãES6ã¯ã©ã¹ã®åæç»ãæé©åããŸããReact.memo(...)
颿°ã®åæç»ãæé©åããŸãã- æ©èœã®æé©åã¯çŽ æŽãããã¢ã€ãã¢ã§ãã
React
ãåã³åãã«ãªãããšã¯ãããŸããã
èšäºããã®ä»ã®æ
å ±ãèšæ£ãç°è°ã«ã€ããŠè³ªåãããå Žåã¯ãé æ
®ãªãã³ã¡ã³ããã¡ãŒã«ããã©ã€ããŒãã¡ãã»ãŒãžããå¯ããã ããã
ãããããé¡ãããŸãïŒ