ç§ãã¡ã¯reactmapbox glã¢ãžã¥ãŒã«ãæ§ç¯ããŠãããä»æ¥ã¯ã¯ããŒã³ãšã€ã³ãžã§ã¯ãã®å°éå ·ã䜿çšããŠããŸãã
16.2.0ã³ã³ããã¹ãAPIã®äœ¿çšãæ€èšããŠããŸãããã16.3.0ã«æ°ããAPIãããããšãããããŸããããã³ã³ããã¹ãã®è©³çŽ°ãèªã¿åãæ¹æ³ãèŠã€ãããªãããã§ãã
componentDidMountã©ã€ããµã€ã¯ã«ïŒãããã®å®è£
ã§äœ¿çšããã®ãçã«ããªã£ãŠããŸãïŒã
ãããåé¿ããæ¹æ³ã¯ãããŸããïŒ
ãããæ©èœãããããšããŠããäŸãè¿œå ããŸãïŒ //codesandbox.io/s/l20yn296w7
ç·šéïŒ httpsïŒ//github.com/reactjs/rfcs/blob/master/text/0002-new-version-of-context.md#class-based-apiã®ã¬ã€ãã©ã€ã³ã«åŸã£ãŠãã ãã
ããã¯ãæ°ããAPIã§å®çŸã§ããæ¹æ³ã§ãã
class BaseMapElement extends React.Component {
componentDidMount() {
console.log(this.props.context);
}
render() {
return null;
}
}
const MapElement = () => (
<Context.Consumer>
{context =>
<BaseMapElement context={context} />
}
</Context.Consumer>
)
ã§ã¯ã componentDidMount
ä»ããŠã¢ã¯ã»ã¹ããå¯äžã®æ¹æ³ã¯ãå°éå
·ã«ãªãã€ã¬ã¯ãããããšã§ããïŒ
ç·šéïŒ componentDidMount
å°éå
·ã«åæ§ç¯ããé«æ¬¡ã³ã³ããŒãã³ãã¯è¯ããã¿ãŒã³ã§ãããéåžžã¯è¿œå ã®ã³ã³ããŒãã³ããå¿
èŠãªãå Žåã¯ã次ã®ããã«ã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹ã«ã³ã³ããã¹ãå€ãæ ŒçŽããŸãã this.contextValue = value
次ã«ã¢ã¯ã»ã¹ããŸããã©ã€ããµã€ã¯ã«ããã¯ã å°ãéãã§ãããæé©åãšããŠããè¯ãããã®å Žéãã®ãã¿ãŒã³ããªããã¢ãŠãããŠããã®ã§ãäžè¬çã«ã¯å€§äžå€«ã ãšæããŸã
ç§ã¯åããžã¬ã³ãã«çŽé¢ããŠããŸãã
ã©ã€ããµã€ã¯ã«ã¡ãœããã§ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããããã³ã³ããã¹ããåŒã³åºãããããç°¡åãªæ¹æ³ãããã¯ãã§ãã
ãã®ãåæåããããããŒã¿ããã§ãã¯ããŠãã§ããããããã¢ã³ããŠã³ãæã«ã¯ãªãŒã³ã¢ãããããããå¿
èŠããããããããŸããã
人ã
ã¯çŸåšãããããå£ããŠããç¶æ³ã§ãããè¡ã£ãŠããŸãã
ã¯ããã³ã³ããŒãã³ããå¥ã®ã³ã³ããŒãã³ãã§ã©ããããããšã§è§£æ±ºã§ããŸãã ãããã解決çãšããããã¯åé¿çã®ããã«æããŸãã
次ã®ããã«ã³ã³ããŒãã³ãã€ã³ã¹ã¿ã³ã¹ã«ã³ã³ããã¹ãå€ãæ ŒçŽããŸãïŒthis.contextValue = value次ã«ãã©ã€ããµã€ã¯ã«ããã¯ã§ããã«ã¢ã¯ã»ã¹ããŸã
ããã¯éåæã¢ãŒãã§ã¯å®å šã§ã¯ãªããšç¢ºä¿¡ããŠããŸãã ãããããªãã§ãã ããã cc @acdlite
ã¯ããã³ã³ããŒãã³ããå¥ã®ã³ã³ããŒãã³ãã§ã©ããããããšã§è§£æ±ºã§ããŸãã ãããã解決çãšããããã¯åé¿çã®ããã«æããŸãã
ç§ã¯ããã«åæããŸãã componentDidMount
ãšcomponentWillUnmount
ãä»ããŠãã€ãã£ãã«ã¢ã¯ã»ã¹ããåæå/ã¯ãªãŒã³ã¢ããã§ããããã«ãããšäŸ¿å©ã§ãã
äžè¬ã«ãã€ã³ã¹ã¿ã³ã¹å€æ°ãå·§åŠã«äœ¿çšããŠéåžžã®ããŒã¿ãããŒãã ãŸããšãéåæã§åé¡ãçºçããŸãã ããªãã§ãã ããã ã€ã³ã¹ã¿ã³ã¹å€æ°ã¯ã¿ã€ããŒãªã©ã®ç¹å®ã®ããšãè¡ãå¯äžã®æ¹æ³ã§ãããããä»æ¥ã¯å°ãæ··ä¹±ããŠããŸãã éåæããªãªãŒã¹ããåã«ãããæ確ãªæšå¥šäºé ãå ¬éããŸãããããŠãã€ã®æ¥ããã€ã³ã¹ã¿ã³ã¹ã«ããŸãäŸåããªãæ°ããã³ã³ããŒãã³ãAPIãå ¥æããäºå®ã§ãã
tl; drïŒå°éå ·ã®éæ¥åç §ã䜿çšããŸãã ãããŠãäœåãªã³ã³ããŒãã³ãã«ã€ããŠã¯ããŸãå¿é ããªãã§ãã ããã
ããã¯éåæã¢ãŒãã§ã¯å®å šã§ã¯ãªããšç¢ºä¿¡ããŠããŸãã ãããããªãã§ãã ããã
ããã¯ã©ã®ããã«ïŒãããŠã©ã®ããã«ïŒå®å šã§ã¯ãªãã§ããããïŒ éåæã¢ãŒãã«ã€ããŠã®ãã®ãã¹ãŠã®è©±ã§ã¯ããå®å šã§ãªãããšã¯ã©ãããæå³ãã¯ã¯ã£ããããŠããŸããã ããã¯ãè¡åãäžåçã§äºæž¬äžå¯èœãªãã®ãŒãã³ã®ããã«æãå§ããŠããŸããããã¯ãåçŽã§ç解ããããããŒã¿ãããŒã¢ãã«ã§äžè¬çã«å¥œãŸããŠããã·ã¹ãã ã§ã人ã ãå€ãã®ä¿èšŒã§æºããããšã¯ãããŸããã ã³ã³ããŒãã³ããåã³éæ³ã®ãªããžã§ã¯ãã§ãã0.13以åã®åå°ã«æ»ã£ããããªæ°ãããŸãã
ãå¥ã®ã³ã³ããŒãã³ããè¿œå ããã ãããšèšãã®ãç°¡åã§ãããããã¯ãã°ãã°é¢åã§ãããç¬èªã®ã«ããŽãªã®ãã°ãšèª²é¡ããããããŸãã ç§ã¯ã人ã ããå®å šãã§ããããã«ãreactAPIãä»ããŠæœè±¡åãçºæããªããã°ãªããªããããªæ°ããå§ããŸããã
ç³ãèš³ãããŸãã^äžèšãã€ã©ã€ã©/æãã«èãããå Žåãç§ã¯ãã®ããŒã³ãæå³ããŠããŸããã§ããïŒ phhhhoooneã§
ããã¯æã£ãŠããããã«èãããŸããããç§ã¯ããªãã®äž»åŒµãç解ãããããã©ã®ããã«/ãªãå®å šã§ãªãã®ãã«ã€ããŠããªãã®è³ªåãå ±æããŸã
è¡åãäžåçã§äºæž¬äžå¯èœãªãã®ãŒãã³ã®ããã«æãå§ããŠããŸã
ç³ãèš³ãããŸããããç§ãã¡ã¯1ãæ以äžãå ·äœçãªææ¡ãå«ãã¬ã€ãã³ã¹ã«åãçµãã§ããŸãã ããããåéããŠããã°æçš¿ãšããŠå ¬éããæéãäžããŠãã ããã ãŸããå®éã®ã¢ã«ãã¡ã䜿çšããã«è°è«ããããšãå°é£ã§ãããããç§ãã¡ãæžåœã«åãçµãã§ãããã®ã§ãã
ãããã£ãŠãäœãèšããªãããããŸãæ©èœããªãããšã«ã€ããŠäºåã«èŠåããå¿ èŠããããŸãã ç§ãã¡ã¯èŠåã®åŽã§èª€ããç¯ããŸãããç§ãã¡ã¯ããªãã«ãšã£ãŠãããããå°é£ã«ããŠããããã«èŠããããšãããããŸãã ã³ãŒããåºãŠãããã§éã¶ããšãã§ããã°ãç§ãã¡ãäœãæå³ããã®ãããããããããããçã«ããªã£ãŠãããšç¢ºä¿¡ããŠããŸãã
ããã¯ã©ã®ããã«ïŒãããŠã©ã®ããã«ïŒå®å šã§ã¯ãªãã§ããããïŒ
ç§ã®è©±ãèŠãæ©äŒã¯ãããŸãããïŒ ãªããããè¡ã£ãŠããã®
ããªãã話ãèŠããšä»®å®ããŠãããã¯ãã®ç¹å®ã®ã±ãŒã¹ã«ã€ããŠã®ããå
·äœçãªèª¬æã§ãã ãã¢ã§ç€ºããããã«ã¬ã³ããªã³ã°ããäžæåæ¢ãã§ããããã«ããã«ã¯ãReactããã€ã§ããå Žåã«ãã£ãŠã¯ããŸããŸãªå°éå
·ã䜿çšããŠrender()
ãåŒã³åºãããšãã§ããå¿
èŠããããŸãã ããšãã°ã this.props
ãšthis.state
ãæ°ããç»é¢ïŒããŒãäžïŒã®å°éå
·ã«èšå®ããå Žåã¯ã render
åŒã³åºããŸãããå€ãthis.props
ãŸããçŸåšã®ããŒãžã§ã³ã®ããªãŒã§ã®ã€ã³ã¿ã©ã¯ã·ã§ã³ã«å¿çããŠã¬ã³ããªã³ã°ããå Žåã¯this.state
ïŒããšãã°ãæ°ããç»é¢ã®èªã¿èŸŒã¿äžã«äœããæŒãå ŽåïŒã
éåæã§ã¯ãçµéšåã¯æ¬¡ã®ãšããã§ãã componentDidMount
ã componentDidUpdate
ã componentWillUnmount
ãªã©ã®ã©ã€ããµã€ã¯ã«ãšrefã³ãŒã«ããã¯ã®ã¿ãã察å¿ããå°éå
·ãšç¶æ
ã䜿çšããŠãæ確ã«å®çŸ©ãããæç¹ã§å®è¡ãããŸããç»é¢ã«è¡šç€ºãããŠãããã®ã«ã 幞ããªããšã«ããã®å³ã«ããŸãé©åããªãã©ã€ããµã€ã¯ã«ã¯ä»ã«ãããã€ãããããããã®ããè¯ã代æ¿æ¡ã玹ä»ããŠããŸãïŒ getDerivedPropsFromState
ã getSnapshotBeforeUpdate
ïŒã ããã¯æ®µéçãªç§»è¡ã«ãªããŸãã ç¹°ãè¿ãã«ãªããŸãããããã¯ãã¹ãŠããã°æçš¿ã«å«ãŸããäºå®ã§ãã
ä»ããã®åé¡ã®æ ¹æ¬ã«ã éåæã¢ãŒãã§ã¯ã Reactã¯render
ã¡ãœããããã€ã©ã®é åºã§åŒã³åºããã«ã€ããŠä¿èšŒããŸããã ããã¯ãReactãããããä¿èšŒããããšã®ãªãã£ããã®ã§ããããŸããŸãæ¯ååãé åºã§ããã ãã£ãŒã«ããrender
ä¿åããŠãããã©ã€ããµã€ã¯ã«ã§èªã¿åãããšã¯ãå®å
šãã§ã¯ãããŸãããReactãrender
ãšåŒã°ãããšãã«ãããŸããŸãªå°éå
·ïŒäžæãããããªãŒãªã©ïŒã§ãã£ãŒã«ããä¿åããå¯èœæ§ãããããã§ãããŸã æºåãã§ããŠããŸããïŒã
ã©ã€ããµã€ã¯ã«ã¡ãœããã§ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããããã³ã³ããã¹ããåŒã³åºãããããç°¡åãªæ¹æ³ãããã¯ãã§ãã
ã¯ããã³ã³ããŒãã³ããå¥ã®ã³ã³ããŒãã³ãã§ã©ããããããšã§è§£æ±ºã§ããŸãã ãããã解決çãšããããã¯åé¿çã®ããã«æããŸãã
äœåãªã©ãããŒã®ããã«æããããšæ°ããã³ã³ããã¹ããé«éåããçç±ã§ãã ããªãŒã«æ瀺çãªã©ãããŒããŒãããªãå ŽåãæŽæ°ãå¿ èŠãªã³ã³ããŒãã³ãããã°ãããèŠã€ãããããšã¯ã§ããŸããã
ã©ã€ããµã€ã¯ã«ã§ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã¯ããããå°éå ·ãšããŠäœ¿çšããŠãã ããã
class Button extends React.Component {
componentDidMount() {
alert(this.props.theme);
}
render() {
const { theme, children } = this.props;
return (
<button className={theme ? 'dark' : 'light'}>
{children}
</button>
);
}
}
export default React.forwardRef((props, ref) => (
<ThemeContext.Consumer>
{theme => <Button {...props} theme={theme} ref={ref} />}
</ThemeContext.Consumer>
));
ããã¯ã contextTypes
å®çŸ©ãšã»ãŒåãè¡æ°ã§ãã
ã¯ããã³ã³ããŒãã³ããå¥ã®ã³ã³ããŒãã³ãã§ã©ããããããšã§è§£æ±ºã§ããŸãã ãããã解決çãšããããã¯åé¿çã®ããã«æããŸãã
åé¢æ°/ã¬ã³ããªã³ã°ããããã¢ãããŒãã¯æ°ããã³ã³ããã¹ãã®_å ¬åŒAPI_ã§ãããšãã³ãèšã£ãããšã2çªç®ã«ãããã£ãã®ã§ãããã䜿çšããŠãReactã«é«éã§ããããšãå¿é ãããŠãã ããã ïŒãããªãïŒïŒ
ããã¯ã©ã®ããã«ïŒãããŠã©ã®ããã«ïŒå®å šã§ã¯ãªãã§ããããïŒ
ãã©ããã®StrictModeããã¥ã¡ã³ãã¯ãã€ã³ã¹ã¿ã³ã¹ã®å€æŽïŒããã¯åãªãå¥ã®ã¿ã€ãã®å¯äœçšã§ãïŒãéåæã¢ãŒãã§å±éºã§ããçç±ã®ããã€ãã«ã觊ããŠããŸãã
ããã§ææ¡ãããŠããã¬ã€ãã©ã€ã³ã«åŸã£ãå®éšçãªãã©ã³ãããããŸãã 誰ãããããçã«ããªã£ãŠãããã©ããã確èªããããã«èŠãããšãã§ããŸããïŒ https://github.com/commodityvectors/react-mapbox-gl/pull/11
ç§ã¯ãã®ã©ã€ãã©ãªã«ç²ŸéããŠããªãã®ã§ã人ã
ããã®ã³ã³ããŒãã³ãã§refãå©çšããããšããããã©ããã¯ããããŸããããå©çšããå Žåããã®PRã®withContext
ããã¯ã¹ã€ã³ã¯æ°ããforwardRef
API ã
æå³ãããã åç §ããŠããã ãããããšãããããŸãã ãšãããããã®åé¡ã解決ããŸãã
ç§ã¯åãããšãéæã§ãããã©ããã確èªããããšããŠããã®ã§ããã®åé¡ã«ééããŸããã
ãããã£ãŠãããããã¹ãŠããåéã§ããããšããã Context.Consumer
ã䜿çšããã³ã³ããŒãã³ãã§ã¯ãåã¬ã³ããªã³ã°é¢æ°ã®å€éšã§APIã«ã¢ã¯ã»ã¹ããããšã¯ã§ããŸããã ç§ã¯ãããå°ãç°¡åã«ããããã«åããããããªãäœããæãã€ããïŒãããäœããã®çç±ã§è¯ãç¿æ
£ã§ãªããªãã°ãããã€ãã®ãã£ãŒãããã¯ãæ¬åœã«æè¬ããã ããïŒïŒ
const MapElement = (props) => (
<Context.Consumer>
{context =>
<RunOnLifecycle
runOnMount={() => { /*use context*/ }}
runOnUnMount={() => { /*use context*/ }}
runOnUpdate={(prevProps) => { /*use context - compare prevProps with props */ }}
{ ...props }
/>
}
</Context.Consumer>
)
ãããŠããã®ãã«ããŒã³ã³ããŒãã³ã<RunOnLifecycle/>
ïŒ
export interface IPropsRunOnLifecycle {
runOnMount?: () => void;
runOnUpdate?: (prevProps: object) => void;
runOnUnMount?: () => void;
children?: JSX.Element | ReactNode;
[prop: string]: any;
}
export class RunOnLifecycle extends React.Component<IPropsRunOnLifecycle> {
componentDidUpdate(prevProps, prevState, snapshot) {
if (this.props.runOnUpdate != null) {
this.props.runOnUpdate(prevProps);
}
}
componentDidMount() {
if (this.props.runOnMount != null) {
this.props.runOnMount();
}
}
componentWillUnmount() {
if (this.props.runOnUnMount != null) {
this.props.runOnUnMount();
}
}
render() { return this.props.children || null; }
}
ãããå°æ¥ã®é çã®çš®ã«ãªãã®ã§ã¯ãªãããšèããŠããŸãã å€å°ã®ããã¯ã§ã¯ãããŸãããããã§ãããªãæšæºçãªReactã®ããã«æããŸãã
ãã®ã¢ãããŒããæªãèãã«ãããããããªãããã€ãã®åŸ®åŠãªéãããããŸãã ããšãã°ã MapElement
ãrunOnMount
ã³ãŒã«ããã¯ãå®è¡ããããšãã«
ð代ããã«ãããã«HOCã¢ãããŒãã䜿çšããããšããå§ãããŸãïŒ
https://reactjs.org/docs/context.html#sumption -context-with-a-hoc
ãã®çš®ã®ããšã«HOCã䜿çšããããšã®å¯äžã®æ¬åœã®æ¬ ç¹ã¯ã forwardRef
APIã«ãã£ãŠè»œæžãããŠããŸãã
https://reactjs.org/docs/react-api.html#reactforwardref
ç§ãã¡ã¯ãreactããã¥ã¡ã³ãã人ã ãããã§èšã£ãããšã®ãããªã¢ãããŒããåããŸããã ãããŸã§ã®ãšããããŸãæ©èœããŠããŸãã
https://github.com/commodityvectors/react-mapbox-gl/blob/master/src/Map.js#L63
ãã®ã¢ãããŒããæªãèãã«ãããããããªãããã€ãã®åŸ®åŠãªéãããããŸãã ããšãã°ãMapElementãåç §ã䜿çšããã¯ã©ã¹ã³ã³ããŒãã³ãã§ããå ŽåãrunOnMountã³ãŒã«ããã¯ãå®è¡ããããšãã«åç §ã¯ãŸã èšå®ãããŠããŸããã
ãã£ãŒãããã¯@bvaughnãããããšãã çŸæç¹ã§ã¯ãã³ã³ããã¹ãããªãŒå ã«ããŠã³ããããŠãããã®ã«å¿ããŠãUIã«ç©äºãè¿œå /åé€ããäžçš®ã®ç¶æ ãããã·ã³ã³ããŒãã³ããšããŠçŽç²ã«äœ¿çšããŠããŸãã ããŒã¿ã«ã®ãããªãã®ã§ãããReactã³ã³ããŒãã³ãããªãŒå ã«ãããŸãã ãããã£ãŠãå®éã«åãã¬ã³ããªã³ã°ããããåç §ãåŠçãããããããšã¯ãŸã£ãããããŸããã
refãšçžäºäœçšããäœããããå¿ èŠãããå Žåã¯èŠããŠãããŠãã ããã
ããã«ã¡ã¯ãã¿ãªããã
ã©ã€ããµã€ã¯ã«ã¡ãœããã®ã³ã³ããã¹ãããŒã¿ãå¿
èŠã§ãã ãã®ãããæåã®ããã€ãã®ã³ã¡ã³ãã確èªããåŸãHOCã¢ãããŒãã«åŸããã³ã³ããã¹ãããŒã¿ãå°éå
·ãšããŠæž¡ããŸããã
ãã¹ãŠãæåŸ
ã©ããã«æ©èœããŠããŸãã ãããä»ãç§ã¯ã³ã³ããŒãã³ãã®åäœãã¹ãã±ãŒã¹ãæžãããã®ã§ããããããã§ããŸããã
ãã®ã·ããªãªã®ãã¹ãã±ãŒã¹ãäœæããæ¹æ³ã誰ãã«æããŠããã ããã°å¹žãã§ãã
ç§ã¯é µçŽ ãé µçŽ ã¢ããã¿ãŒåå¿16ãããã³ãžã§ã¹ãã䜿çšããŠããŸããã䜿çšã«åé¡ããããŸãã
@AmnArora
ç§ãåããŠããäŒç€Ÿã§ã¯ã次ã®ããšãè¡ã£ãŠããŸãïŒããã¯ã³ã³ã»ã³ãµã¹ã§ã¯ãªãå¯èœæ§ããããŸãïŒãã裞ã®ãã³ã³ããŒãã³ãããšã¯ã¹ããŒãããŠããããã¹ãã«ã€ã³ããŒãããæåã§å°éå ·ã«åæ ŒããŸãã
äŸãã°
// MyComponent.js
export class MyComponent extends Component { /* ... */ }
export default HOC()(MyComponent)
// MyComponent.spec.js
import { MyComponent } from '...'
// OtherComponents.js
import MyComponent from '...'
ãŸãããã®è°è«ã«å ããŠãåãåé¡ãçºçããè€æ°ã®ã³ã³ããã¹ããæ¶è²»ãããã®https://www.npmjs.com/package/react-context-consumer-hocãäœæããŸããã
ãã¹ãŠãæåŸ ã©ããã«æ©èœããŠããŸãã ãããä»ãç§ã¯ã³ã³ããŒãã³ãã®åäœãã¹ãã±ãŒã¹ãæžãããã®ã§ããããããã§ããŸããã
@AmnAroraãªããŠããããã¹ããæžãããšãã§ããªãã®ã§ããïŒ äœãè©ŠããŸãããïŒ ã©ã®ãããªãšã©ãŒãçºçããŠããŸããïŒ
@pgarciacamouãŸããè¿ éãªè¿ä¿¡ã«æè¬ããŸãã ããŠããŠã§ãäžã§äœãèŠã€ããããããã«ã¯ãšãªãæçš¿ããåŸã ç§ã¯ããªããèšã£ãã®ãšåã解決çãæãã€ããã
ãã¹ãã±ãŒã¹ã¯çŸåšæ©èœããŠããŸãããããã¯åé¿çã®ããã§ãã https://www.npmjs.com/package/react-context-consumer-hocãèŠãŠãããŒã ãšè©±ãåã
ããããšãã ïŒ100ïŒ
@bvaughn以åãç¶æ 管çã«reduxã䜿çšããŠãããšããã³ã³ããŒãã³ããæµ ãã³ããŒããdiveïŒïŒã¡ãœãããšinstanceïŒïŒã¡ãœããã䜿çšããŠã³ã³ããŒãã³ãã®ã€ã³ã¹ã¿ã³ã¹ãååŸããŸããã
ãã ããã³ã³ããã¹ãAPIã䜿çšããå Žåããããã®ã¡ãœããã¯ãããã䜿çšã§ããŸããã§ããã
ãããŠããããã®æ¹æ³ã®ãããã䜿çšããŠããªãã£ããšãã次ã®ãšã©ãŒãçºçããŠããŸããïŒ _ã¿ã°12ã®äžæãªããŒã_
ã¬ããã£ã
ãããã¯äž¡æ¹ãšãã䜿çšããŠããEnzymeã®ããŒãžã§ã³ãæ°ããã³ã³ããã¹ãAPIãé©åã«ãµããŒãããŠããªããšããåé¡ã®ããã«èãããŸãã ããã¯æ®å¿µã§ãã
redux
ãšunistore
ïŒå€ãã®ã³ãŒãæ±æ/äœåãªå¯åéšåimoïŒã«å€§ããªå«æªæãèŠãããã¹ããããã³ã³ããŒãã³ããåäžã®ã°ããŒãã«ç¶æ
ã«ã¢ã¯ã»ã¹ã§ããããã«ãã次ã®ã»ããã¢ããã«ã€ãªãããŸããã ã°ããŒãã«ç¶æ
ã§ãã£ãŠã¯ãªããªãä»ã®ãã¹ãŠïŒã€ãŸããããã¹ãå
¥åå€ããã°ã«å€ïŒã¯ããã¹ããããåã³ã³ããŒãã³ãã®ããŒã«ã«ç¶æ
å
ã«æ ŒçŽãããŸãã
ããã«ã¡ã¯ã
ãã®åé¡ã¯è§£æ±ºãããŸãããïŒ
3ã€ã®ã³ã³ããŒãã³ããããã·ããªãªããããŸãã ã¯ãªãšãŒã¿ãŒããã£ã¹ãã¬ã€ãã»ã«ã
Cellã«ã¯ãCreatorãšDisplayã®äž¡æ¹ã§äœ¿çšãããã¬ã³ããªã³ã°ããžãã¯ããããŸãã
çŸåšãã¢ã€ãã ãäœæãããŠãããã衚瀺ããå¿ èŠãããå Žåã¯ãã¹ããŒã¿ã¹ãæž¡ãå¿ èŠããããŸãã ããŸããŸãªå Žæã§ã»ã«ã䜿çšããã®ã§ãã¹ããŒã¿ã¹ãå°éå ·ãšããŠåå¥ã«æž¡ãå¿ èŠããããŸãã ãã®ãããã¹ããŒã¿ã¹ã«ã³ã³ããã¹ãã䜿çšãããã£ãã®ã§ãããåé¡ã¯ããã£ã¹ãã¬ã€ã³ã³ããŒãã³ããããŠã³ããããŠããå Žåã«ã®ã¿ã³ã³ããã¹ããå€æŽããããšããããšã§ãã ããã¯Reactã®çŸåšã®ããŒãžã§ã³ã§ãã ïŒç§ã¯React 16.7ã䜿çšããŠããŸãïŒ
React 16.6ã§ã¯ãã¯ã©ã¹ã«æ°ããcontextType
APIãè¿œå ããã componentDidMount
æ°ããã³ã³ããã¹ããç°¡åã«èªã¿åãããšãã§ããããšã«æ³šæããŠãã ããã
ãããã³ã³ããŒãã³ãã§åäžã®ã³ã³ããã¹ãã䜿çšããã ãã§ããå Žåã¯ã contextType
ã䟿å©ãªãªãã·ã§ã³ã§ãã
React 16.6ã§ã¯ãã¯ã©ã¹ã«æ°ãã
contextType
APIãè¿œå ãããcomponentDidMount
æ°ããã³ã³ããã¹ããç°¡åã«èªã¿åãããšãã§ããããšã«æ³šæããŠãã ããã
ããã§ã¯ãããŸããã åäžã®ã³ã³ããã¹ãã¿ã€ãã§ååãªå Žåã§ããClass.contextTypeã¯ç¶æ¿ãäžæããŸãã HOCã«ã€ããŠãåãããšãèšããŸãã
ã³ã³ããŒãã³ãéã§ã³ãŒããåå©çšããããã«ãç¶æ¿ãããã³ã³ããžã·ã§ã³ãæšå¥šããããšã«ã€ããŠãããã¥ã¡ã³ãã§ããªãæ確ã«ããŠããŸãã ãããè¶ ããŠãç§ã¯ããªããèšã£ãŠããããšãæ¬åœã«ç解ããŠããŸããã
contextType
APIã¯ãééããªãcomponentDidMount
ã³ã³ããã¹ãå€ã«ç°¡åã«ã¢ã¯ã»ã¹ã§ããããã«ããŸãïŒããããã®ã¹ã¬ããã®ç®çã§ãïŒã
ç¶æ¿ãããã³ã³ããžã·ã§ã³ãæšå¥šããããšã«ã€ããŠãããã¥ã¡ã³ãã§ããªãæ確ã«ããŠããŸã...
åºããã...
ç§ãä»èŠåŽããŠããã®ã¯ãå®è£ ããµããŒãããããã«å¿ èŠãªäžé£ã®å ±éæ©èœãåããã³ã³ããŒãã³ãã®ãã¡ããªãŒããããšããããšã§ãã ã³ã³ããã¹ãããããé€ããŠããã¹ãŠãç¶æ¿ã«ãã£ãŠå®å šã«ã¢ãã«åãããŠããŸãã
ãã®ãããªç¶æ³ã§ã®ã¿ã³ã³ããã¹ããæ··ä¹±ãããããã«æãããããšãèãããšãã³ã³ããã¹ãAPIã¯ããªãã€ã©ã€ã©ããŸãã
...ããããã®ã¹ã¬ããã®å 容ã§ã...
ã¯ãããã®ã³ã¡ã³ãã¯å°ã話é¡ããå€ããŠããŸãã
Context Classã§contextTypeãå€æŽãããšãreduxã¹ãã¢ãå£ããŸãïŒ/
React 16.6ã¯ãcomponentDidMountã§æ°ããã³ã³ããã¹ããç°¡åã«èªã¿åãããšãã§ããã¯ã©ã¹çšã®æ°ããcontextTypeAPIãè¿œå ããããšã«æ³šæããŠãã ããã
ãããã³ã³ããŒãã³ãã§åäžã®ã³ã³ããã¹ãã䜿çšããã ãã§ããå Žåã¯ãcontextTypeã䟿å©ãªãªãã·ã§ã³ã§ãã
MyCoolComponent.contextType
ã«å²ãåœãŠãåã«ã³ã³ããã¹ããäœæããæ¹æ³ã¯ãããŸãããïŒ
ç§ãèªãã ã®ã¯ãä»ã®ãšããã次ã®ããšãã§ããã³ã³ããŒãã³ããå¿ èŠãªå Žåã§ãã
aïŒè€æ°ã®ã³ã³ããã¹ããæ¶è²»ãã
bïŒ render
以å€ã®ã¡ãœããã§ãããã®ã³ã³ããã¹ãããã®ãã®ã䜿çšãã
ããã¯ãã©ãããŒãã³ã³ããã¹ããæ¶è²»ããåã«å°éå ·ãæž¡ããšãã説æããããã¿ãŒã³ã«åºå·ããŠããããšãæå³ããŸã
çæ³çãªç¶æ³ã¯ããã®ãããªãã®ãæžããŠãäž¡æ¹ã®äžçãæ倧éã«æŽ»çšã§ããããšã ãšæããŸãïŒã€ãŸããã¯ã©ã¹å šäœã§è€æ°ã®ã³ã³ããã¹ããå©çšã§ããŸãïŒã
MyCoolComponent.contextType = composeContexts(OneContext, TwoContext, RedContext, BlueContext)
ãããè¡ãæ¹æ³ã¯ãããŸããïŒ
ããã¯renderã¡ãœããã§ã¯æ©èœããŸãããä»ã®ã¡ãœããã§ã¯æ©èœããŸããã
ã¡ãã£ãšãããã
ã¯ã©ã¹ã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§æ°ããã³ã³ããã¹ãAPIã䜿çšããå¯èœæ§ã¯ãããŸããïŒ
ãããžã§ã¯ããv15.xããv16.xã«ç§»è¡ããŠããŸããã¿ã¹ã¯ã®1ã€ã¯ãæ°ããã³ã³ããã¹ãAPIã䜿çšããããšã§ãã
ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ãcss-modules + isomorphic-style-loaderã䜿çšããŸããåŸè
ã¯ãã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ã·ãŒããDOMã«æ¿å
¥ããããã®ããã€ãã®APIãå
¬éããŸãã
V15ã§ã¯ããããã®APIãå€ãã³ã³ããã¹ãAPIã«é 眮ããåã³ã³ããŒãã³ãã次ã®ãããªæ¹æ³ã§ååŸã§ããããã«ããŸãã
class MyComp extends Component {
static contextTypes = {
insertCss: PropTypes.func
}
....
componentWillMount () {
// insert a style tag for this component
this.removeCss = this.context.insertCss(myStyles)
}
}
V15ã§ã¯ããããcomponentWillMountã«é 眮ã§ããŸãã ããã«ãããã¬ã³ããªã³ã°åã«ã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ãæ£ãããªããŸãã
ãã ããV16ã§ã¯ãcomponentWillMountã¯å®å
šã§ã¯ãªããšããŒã¯ãããŠãããå°æ¥çã«ã¯éæšå¥šã«ãªããŸãã
ãããã£ãŠãåœé¢ã®èãã¯ãcontext.insertCssåŒã³åºããã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«å
¥ããããšã§ãã
ããããææžããèŠããšã
contextTypesãã³ã³ããŒãã³ãå ã§å®çŸ©ãããŠããå Žåã次ã®ã©ã€ããµã€ã¯ã«ã¡ãœããã¯è¿œå ã®ãã©ã¡ãŒã¿ãŒã§ããã³ã³ããã¹ããªããžã§ã¯ããåãåããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒå°éå ·ãã³ã³ããã¹ãïŒ
ãã®äœ¿çšæ³ïŒ2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠã³ã³ããã¹ãã䜿çšïŒãéæšå¥šã«ãªããŸãã
MyComp.contextType = StyleContextãå²ãåœãŠãŠãæ°ããã³ã³ããã¹ãAPIãè©ŠããŸãã
ããã§ããthis.contextãã³ã³ã¹ãã©ã¯ã¿ãŒã§æªå®çŸ©ã§ããããšãããããŸããã
class MyComp extends Component {
static contextType = StyleContext
constructor (props) {
super(props)
console.log(this.context) // undefined
}
}
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã³ã³ããã¹ãã䜿çšããæ¹æ³ã«é¢ããå®çšçãªã¬ã€ãã¯ãããŸããïŒ
äœãã¢ããã€ã¹ïŒ
ã¡ãã£ãšãããã
ã¯ã©ã¹ã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã§æ°ããã³ã³ããã¹ãAPIã䜿çšããå¯èœæ§ã¯ãããŸããïŒãããžã§ã¯ããv15.xããv16.xã«ç§»è¡ããŠããŸããã¿ã¹ã¯ã®1ã€ã¯ãæ°ããã³ã³ããã¹ãAPIã䜿çšããããšã§ãã
ç§ãã¡ã®ãããžã§ã¯ãã§ã¯ãcss-modules + isomorphic-style-loaderã䜿çšããŸããåŸè ã¯ãã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ã·ãŒããDOMã«æ¿å ¥ããããã®ããã€ãã®APIãå ¬éããŸããV15ã§ã¯ããããã®APIãå€ãã³ã³ããã¹ãAPIã«é 眮ããåã³ã³ããŒãã³ãã次ã®ãããªæ¹æ³ã§ååŸã§ããããã«ããŸãã
class MyComp extends Component { static contextTypes = { insertCss: PropTypes.func } .... componentWillMount () { // insert a style tag for this component this.removeCss = this.context.insertCss(myStyles) } }
V15ã§ã¯ããããcomponentWillMountã«é 眮ã§ããŸãã ããã«ãããã¬ã³ããªã³ã°åã«ã³ã³ããŒãã³ãã®ã¹ã¿ã€ã«ãæ£ãããªããŸãã
ãã ããV16ã§ã¯ãcomponentWillMountã¯å®å šã§ã¯ãªããšããŒã¯ãããŠãããå°æ¥çã«ã¯éæšå¥šã«ãªããŸãã
ãããã£ãŠãåœé¢ã®èãã¯ãcontext.insertCssåŒã³åºããã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«å ¥ããããšã§ããããããææžããèŠããšã
contextTypesãã³ã³ããŒãã³ãå ã§å®çŸ©ãããŠããå Žåã次ã®ã©ã€ããµã€ã¯ã«ã¡ãœããã¯è¿œå ã®ãã©ã¡ãŒã¿ãŒã§ããã³ã³ããã¹ããªããžã§ã¯ããåãåããŸãã
ã³ã³ã¹ãã©ã¯ã¿ãŒïŒå°éå ·ãã³ã³ããã¹ãïŒ
ãã®äœ¿çšæ³ïŒ2çªç®ã®ãã©ã¡ãŒã¿ãŒãšããŠã³ã³ããã¹ãã䜿çšïŒãéæšå¥šã«ãªããŸãã
MyComp.contextType = StyleContextãå²ãåœãŠãŠãæ°ããã³ã³ããã¹ãAPIãè©ŠããŸãã
ããã§ããthis.contextãã³ã³ã¹ãã©ã¯ã¿ãŒã§æªå®çŸ©ã§ããããšãããããŸãããclass MyComp extends Component { static contextType = StyleContext constructor (props) { super(props) console.log(this.context) // undefined } }
ã³ã³ã¹ãã©ã¯ã¿ãŒã§ã³ã³ããã¹ãã䜿çšããæ¹æ³ã«é¢ããå®çšçãªã¬ã€ãã¯ãããŸããïŒ
äœãã¢ããã€ã¹ïŒ
contextTypeã䜿çšãã代ããã«ããã®ããã«ããããšãã§ããŸã
class MyComponent extends React.Component {
render(){
const {
//props including context props
} = this.props;
return(<View />);
}
};
const withContext = () => (
<MyContext.Consumer>
{ (contextProps) => (<MyComponent {...contextProps}/>)}
</MyContext.Consumer>
);
export default withContext;
ç§ã®ããã«ã¬ã³ããªã³ã°é¢æ°ã®å€ã§ããã䜿çšããã®ã«èŠåŽããŠãã人ã¯ããµãã³ã³ããŒãã³ãã§ä»¥äžã䜿çšããŠãã ããã
äŸãã°ïŒ
const context = useContext(yourContext)
MainComponent.Subcomponent = () => {
const context = useContext(context)
useEffect(()=> {
console.log(context)
})
}
æãåèã«ãªãã³ã¡ã³ã
äœåãªã©ãããŒã®ããã«æããããšæ°ããã³ã³ããã¹ããé«éåããçç±ã§ãã ããªãŒã«æ瀺çãªã©ãããŒããŒãããªãå ŽåãæŽæ°ãå¿ èŠãªã³ã³ããŒãã³ãããã°ãããèŠã€ãããããšã¯ã§ããŸããã
ã©ã€ããµã€ã¯ã«ã§ã³ã³ããã¹ãã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåã¯ããããå°éå ·ãšããŠäœ¿çšããŠãã ããã
ããã¯ã
contextTypes
å®çŸ©ãšã»ãŒåãè¡æ°ã§ãã