ã¿ãªããããã«ã¡ã¯ïŒ Peggy Rayzisã«ããReact Apolloã«ããReduxã³ãŒãã®åæžãšããè峿·±ãèšäºã®ç¿»èš³ãå
±æããããšæããŸãã èè
ãšåœŒå¥³ã®ããŒã ãã©ã®ããã«åœŒãã®ãããžã§ã¯ãã§GraphQLãã¯ãããžãŒãå®è£
ãããã«ã€ããŠã®èšäºã 翻蚳ã¯èè
ã®èš±å¯ãåŸãŠå
¬éãããŠããŸãã

Higher Football Leagueã§ã®å®£èšåã¢ãããŒããžã®åãæ¿ã
ç§ã¯ãæé«ã®ã³ãŒãã¯ã³ãŒãã®æ¬ åŠã ãšåŒ·ãä¿¡ããŠããŸãã ã³ãŒããå€ãã»ã©ããã°ãçºçããå¯èœæ§ãé«ããªãããã®ãããªã³ãŒããç¶æããããã«ããå€ãã®æéãè²»ããããŸãã ãã€ã¢ãŒãããããŒã«ãªãŒã°ã§ã¯ãããŒã ãéåžžã«å°ããããããã®ååãéèŠããŠããŸãã ã³ãŒãã®åå©çšãå¢ããããåã«ã³ãŒãã®ç¹å®ã®éšåã®ãµãŒãã¹ã忢ããããšã«ãããå¯èœãªéããã¹ãŠãæé©åããããšããŸãã
ãã®èšäºã§ã¯ãããŒã¿ã®åä¿¡ã«å¯Ÿããå¶åŸ¡ãApolloã«è»¢éããçŽ5,000è¡ã®ã³ãŒããåé€ããæ¹æ³ã«ã€ããŠåŠç¿ããŸã ã ããã«ãApolloã«åãæ¿ããåŸãã¢ããªã±ãŒã·ã§ã³ã¯å¿
èŠãªããŒã¿ã®ã¿ãèŠæ±ããããã«ãªã£ããããã¢ããªã±ãŒã·ã§ã³ã®ããªã¥ãŒã ãéåžžã«å°ãããªã£ãã ãã§ãªãããã宣èšçã«ãªããŸããã
宣èšãšã¯ã©ãããæå³ã§ããããªãããããšãŠãã¯ãŒã«ãªã®ã§ããïŒ å®£èšåããã°ã©ãã³ã°ã¯ç©¶æ¥µã®ç®æšã«çŠç¹ãåœãŠãŠããŸãããåœä»€åããã°ã©ãã³ã°ã¯ãããéæããããã«å¿
èŠãªã¹ãããã«çŠç¹ãåœãŠãŠããŸãã Reactèªäœã¯å®£èšçã§ãã
Reduxã䜿çšããããŒã¿ã®ååŸ
ç°¡åãªArticleã³ã³ããŒãã³ããèŠãŠã¿ãŸãããã
| import React from 'react'; |
| import { View, Text } from 'react-native'; |
| |
| export default ({ title, body }) => ( |
| <View> |
| <Text>{title}</Text> |
| <Text>{body}</Text> |
| </View> |
| ); |
æ¥ç¶ããã<MatchDetail/>
ãã¥ãŒã§<Article/>
ãã¬ã³ããªã³ã°ããäžèŽIDãå°éå
·ãšããŠåãåããšããŸãã GraphQLã¯ã©ã€ã¢ã³ããªãã§ãããè¡ãå Žåã <Article/>
ã¬ã³ããªã³ã°ã«å¿
èŠãªããŒã¿ãååŸããããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
<MatchDetail/>
ãããŠã³ããããããã¢ã¯ã·ã§ã³äœæè
ãåŒã³åºããŠIDã§äžèŽããŒã¿ãååŸããŸãã ã¢ã¯ã·ã§ã³äœæè
ã¯ã¢ã¯ã·ã§ã³ããã£ã¹ãããããŠãããŒã¿åéããã»ã¹ã®éå§ãReduxã«éç¥ããŸãã- ç®çå°ã«å°çããããŒã¿ãè¿éããŠããŸãã 䟿å©ãªæ§é ã§ããŒã¿ãæ£èŠåããŸãã
- ããŒã¿ãæ£èŠåãããåŸãããŒã¿ååŸããã»ã¹ã®å®äºã«ã€ããŠReduxã«éç¥ããå¥ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããŸãã
- Reduxã¯ãªãã¥ãŒãµãŒã§ã¢ã¯ã·ã§ã³ãåŠçããã¢ããªã±ãŒã·ã§ã³ã®ç¶æ
ãæŽæ°ããŸãã
<MatchDetail/>
ã¯ãå°éå
·ãä»ããŠå¿
èŠãªãã¹ãŠã®äžèŽããŒã¿ãåãåãããããããã£ã«ã¿ãªã³ã°ããŠèšäºãã¬ã³ããªã³ã°ããŸãã
<Article/>
ããŒã¿ãååŸããã ãã®å€ãã®ã¹ãããïŒ GraphQLã¯ã©ã€ã¢ã³ãããªããšãããŒã¿ãååŸããæ¹æ³ã«å°å¿µããå¿
èŠããããããã³ãŒããã¯ããã«äžå¯æ¬ ã«ãªããŸãã ãããã <Article/>
åçŽãªã¬ã³ããªã³ã°ã®ããã«ãã¹ãŠã®äžèŽããŒã¿ã転éããããªãå Žåã¯ã©ãã§ããããïŒ å¥ã®ãšã³ããã€ã³ããæ§ç¯ããããããããŒã¿ãåä¿¡ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®å¥ã®ã»ãããäœæã§ããŸããããã®ãªãã·ã§ã³ã¯éåžžã«ç°¡åã«ãµããŒããããªããªãå¯èœæ§ããããŸãã
GraphQLã§åãããšãã§ããæ¹æ³ãæ¯èŒããŠã¿ãŸãããã
<MatchDetail/>
ãæ¬¡ã®ãªã¯ãšã¹ããå®è¡ãã髿¬¡ã³ã³ããŒãã³ãã«æ¥ç¶ãããŠããŸãã
query Article($id: Float!) { match(id: $id) { article { title body } } }
...ãããŠããã ãã§ãïŒ ã¯ã©ã€ã¢ã³ããããŒã¿ãåä¿¡ãããšããã«ãããããå°éå
·ã«æž¡ããããã«<Article/>
éä¿¡ã§ããŸãã ããã¯ãã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããããã«å¿
èŠãªããŒã¿ã®ã¿ã«çŠç¹ãåããããããã¯ããã«å®£èšçã§ãã
ããã¯ãRelayã§ãApolloã§ããGraphQLããŒã¿ã®åä¿¡ãã¯ã©ã€ã¢ã³ãã«å§ä»»ããããšã®å©ç¹ã§ãã ã GraphQLã®æŠå¿µ ããèãå§ãããšããã®ããŒã¿ãååŸããæ¹æ³ãå¿é
ããã®ã§ã¯ãªããã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããå¿
èŠãããå°éå
·ã ããæ°ã«ããããšã«ãªããŸãã
ããæç¹ã§ãã®ã æ¹æ³ ãã«ã€ããŠèããå¿
èŠããããŸãããããã¯ãã§ã«ãµãŒããŒåŽã®æžå¿µäºé
ã§ããããããã£ãŠãããã³ããšã³ãã®è€éãã倧å¹
ã«è»œæžãããŸãã GraphQLãµãŒããŒã¢ãŒããã¯ãã£ãåããŠäœ¿çšããå Žåã¯ãApolloã©ã€ãã©ãªã§ããgraphql-tools
詊ããŠãã ãããããã«ãããã¹ããŒããããgraphql-tools
çã«æ§æã§ããŸãã ç°¡æœã«ããããã«ã仿¥ã¯ããã³ããšã³ãéšåã®ã¿ã«çŠç¹ãåœãŠãŸãã
ãã®æçš¿ã§ã¯Reduxã³ãŒãã®äœ¿çšãåæžããæ¹æ³ã«ã€ããŠèª¬æããŠããŸããããããå®å
šã«ãªããããšã¯ã§ããŸããã Apolloã¯ãã³ãããã®äžã§Reduxã䜿çšããŠããã®ã§ãäžå€æ§ã®æ©æµãåããããšãã§ããã¿ã€ã ãã©ãã«ãããã°ãªã©ã®Redux Dev Toolsã®ãã¹ãŠã®ã¯ãŒã«ãªæ©èœãæ©èœããŸãã æ§æäžã«ã ApolloãReduxã®æ¢åã®ã¹ãã¢ã«æ¥ç¶ããŠãåäžã®ãçå®ã®æºãããµããŒãã§ããŸãã ã¹ãã¢ãæ§æããããã¢ããªã±ãŒã·ã§ã³å
šäœãã©ãããã<ApolloProvider/>
ã³ã³ããŒãã³ãã«ã¹ãã¢ãæž¡ããŸãã ããªãã¿ã®é³ïŒ ãã®ã³ã³ããŒãã³ãã¯ãã¯ã©ã€ã¢ã³ãããããã£ãä»ããŠApolloClient
ã€ã³ã¹ã¿ã³ã¹ãæž¡ãå¿
èŠãããããšãé€ããReduxã®æ¢åã®<Provider/>
ãå®å
šã«çœ®ãæããŸãã
Reduxã³ãŒãã®ã«ãããéå§ããåã«ãGraphQLã®æãæ©èœçãªæ©èœã®1ã€ã§ããã€ã³ã¯ãªã¡ã³ã¿ã«æ¡çšã«ååãä»ããŸã ã ã¢ããªã±ãŒã·ã§ã³å
šäœãäžåºŠã«ãªãã¡ã¯ã¿ãªã³ã°ããå¿
èŠã¯ãããŸããã Apolloãæ¢åã®Reduxã¹ãã¢ãšçµ±åããåŸãã¬ãã¥ãŒãµãŒããåŸã
ã«åãæ¿ããããšãã§ããŸãã ãµãŒããŒåŽã«ãåãããšãåœãŠã¯ãŸããŸããå€§èŠæš¡ãªã¢ããªã±ãŒã·ã§ã³ã§äœæ¥ããŠããå Žåãå®å
šãªç§»è¡ã®æºåãã§ãããŸã§ãçŸåšã®REST APIãšGraphQLã䜵çšã§ããŸãã å
¬æ£ãªèŠåïŒGraphQLã詊ããšããã«ããã®ãã¯ãããžãŒã«å€¢äžã«ãªããã¢ããªã±ãŒã·ã§ã³å
šäœãäœãçŽããããšæããããããŸããã
ç§ãã¡ã®èŠä»¶
ReduxããApolloã«ç§»è¡ããåã«ãApolloãããŒãºãæºãããŠãããã©ãããæ
éã«æ€èšããŸããã æ±ºå®ããåã«æ°ã¥ããã®ã¯æ¬¡ã®ãšããã§ãã
- è€æ°ã®ãœãŒã¹ããã®ããŒã¿ã®éçŽïŒäžèŽã¯4ã€ã®ç°ãªããœãŒã¹ããååŸããããŒã¿ã§æ§æãããŸãïŒã³ã³ãã³ã-REST APIãããçµ±èš-MySQLããŒã¿ããŒã¹ãããã¡ãã£ã¢ããŒã¿-ãããªAPIããã³ãœãŒã·ã£ã«ããŒã¿-Redisã¹ãã¬ãŒãžããã æåã«ããµãŒããŒãã©ã°ã€ã³ã䜿çšããŠãã¯ã©ã€ã¢ã³ãã«éä¿¡ããåã«ãã¹ãŠã®ããŒã¿ã1ã€ã®äžèŽãªããžã§ã¯ãã«åéããŸããã ç§ã¯èšããªããã°ãªããªããããã¯GraphQLãšã»ãŒåãããã«æ©èœããŸãïŒ ããã«æ°ä»ãããšããGraphQLãã¢ããªã±ãŒã·ã§ã³ã®å®ç§ãªåè£ã«ãªãããšãæããã«ãªããŸããã
- ãªã¢ã«ã¿ã€ã ã®éçšäžã®æŽæ°ïŒã©ã€ããããã§ã¯ãéåžž1åããšã«æŽæ°ãåãåããŸãã Apolloã®åã«ããœã±ããã䜿çšããŠæŽæ°ãåŠçãããããããããã¬ãã¥ãŒãµãŒã«ãã£ã¹ãããããŸããã ããã¯æãæãããæ±ºå®ã§ã¯ãããŸããã§ããããè€éãªã·ãŒã±ã³ã¹ãé¿ããããã«äžèŽã®ãªããžã§ã¯ãå
šäœããã£ã¹ããããããããæããšã¬ã¬ã³ãã§ããããŸããã§ããã Apolloã䜿çšãããšãã²ãŒã ã®ã¹ããŒã¿ã¹ã«å¿ããŠãåã³ã³ããŒãã³ãã®ããŒãªã³ã°ééãç°¡åã«ã«ã¹ã¿ãã€ãºã§ããŸãã
- ã·ã³ãã«ãªããŒãžããŒã·ã§ã³ïŒãããã®ãªã¹ããç¡éã«ã¹ã¯ããŒã«ããã¹ã±ãžã¥ãŒã«ããŒãžãäœæãããããé çã®ãªããã®çš®ã®ããŒãžããŒã·ã§ã³ã®é©åãªåŠçãå¿
èŠã§ããã ãã¡ãããç¬èªã®æžéæ©ãäœæããããšãã§ããŸãã ããããApolloãç§ãã¡ã®ããã«ãã¹ãŠã®ããŒãã¯ãŒã¯ãè¡ã
fetchMore
颿°ãæã£ãŠããfetchMore
ããªãèªåã§ãããæžãã®ã§ããããïŒ
Apolloã¯çŸåšã®ãã¹ãŠã®èŠä»¶ãæºãããŠããã ãã§ãªããç¹ã«ããŒãœãã©ã€ãºãããŒããããã«å«ãŸããŠããããšãèæ
®ããŠãå°æ¥ã®ããŒãºã®äžéšãã«ããŒãããšèšããªããã°ãªããŸããã çŸåšããµãŒããŒã¯èªã¿åãå°çšã§ããããŠãŒã¶ãŒã«ãæ°ã«å
¥ãã®ããŒã ãä¿åããããã«ãå°æ¥çã«çªç¶å€ç°ãå°å
¥ããå¿
èŠãããå ŽåããããŸãã ããŒãªã³ã°ã§ã¯è§£æ±ºã§ããªããªã¢ã«ã¿ã€ã ã®ã³ã¡ã³ãããã¡ã³ãšã®ããåãã远å ããå ŽåãApolloã¯ãµãã¹ã¯ãªãã·ã§ã³ããµããŒãããŸã ã
Reduxããã¢ãããž
ã¿ããªãåŸ
ã£ãŠããç¬éïŒ æåã¯ããã®èšäºãæžãããšãèããŠãããšããååŸã®ã³ãŒãäŸã玹ä»ããã ãã§ããããããã2ã€ã®ã¢ãããŒããçŽæ¥æ¯èŒããããšã¯é£ãããšæããŸãïŒç¹ã«Apolloã®åå¿è
åãïŒã 代ããã«ããªã¢ãŒãã³ãŒãå
šäœã®éãèšç®ããApolloã䜿çšããŠã³ã³ããã³ã³ããŒãã³ããäœæãããšãã«é©çšã§ããããªãã¿ã®Reduxã®æŠå¿µãã¬ã€ãããŸãã
åé€ãããã®
- ãããã¬ãã¥ãŒãµãŒïŒã300è¡ã®ã³ãŒãïŒ
- ããŒã¿ã®åä¿¡ãæ
åœããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšãšããã¯ïŒã800è¡ã®ã³ãŒãïŒ
- ãœã±ãããä»ããŠäžèŽã®ã©ã€ãæŽæ°ãã°ã«ãŒãåããã³åä¿¡ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã³ããžãã¹ããžãã¯ïŒã750è¡ã®ã³ãŒãïŒ
- ããŒã«ã«ã¹ãã¬ãŒãžãæ
åœããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšãšããã¯ïŒã1000è¡ã®ã³ãŒãïŒã å®éããããŸã§ã®ãããžã§ã¯ãã§ã¯ãªãã©ã€ã³ãµããŒããå»¶æãããŠããããããã®é
ç®ãäžè¬ãªã¹ãã«å«ããããšã¯å®å
šã«å
¬å¹³ã§ã¯ãããŸããããå床远å ãããå Žåã¯ãApolloã®
fetchPolicy
颿°ãã«ã¹ã¿ãã€ãºããæžéæ©ã - ãã¬ãŒã³ããŒã·ã§ã³ã³ã³ããŒãã³ãããReduxããžãã¯ãåé¢ããReduxã³ã³ããã³ã³ããŒãã³ãïŒã1000è¡ã®ã³ãŒãïŒ
- äžèšã®ãã¹ãŠã«é¢é£ãããã¹ãïŒã1000è¡ã®ã³ãŒãïŒ
æ¥ç¶ïŒïŒâgraphqlïŒïŒ
connect
äœ¿çšæ¹æ³ãç¥ã£ãŠããå ŽåãApolloã®é«æ¬¡graphql
ã¯éåžžã«éŠŽæã¿ã®ãããã®ã«ãªããŸãã connect
ãã³ã³ããŒãã³ããåãå
¥ããŠReduxã¹ãã¢ã«æ¥ç¶ãã颿°ãè¿ãããã«ã graphql
ã³ã³ããŒãã³ããåãå
¥ããŠãããApolloã¯ã©ã€ã¢ã³ãã«ãæ¥ç¶ããã颿°ãè¿ããŸãã å®éã«èŠãŠã¿ãŸãããïŒ
| import React, { Component } from 'react'; |
| import { graphql } from 'react-apollo'; |
| import { MatchSummary, NoDataSummary } from '@mls-digital/react-components'; |
| import MatchSummaryQuery from './match-summary.graphql'; |
| |
| // here we're using the graphql HOC as a decorator, but you can use it as a function too! |
| @graphql(MatchSummaryQuery, { |
| options: ({ id, season, shouldPoll }) => { |
| return { |
| variables: { |
| id, |
| season, |
| }, |
| pollInterval: shouldPoll ? 1000 * 60 : undefined, |
| }; |
| }; |
| }) |
| class MatchSummaryContainer extends Component { |
| render() { |
| const { data: { loading, match } } = this.props; |
| |
| if (loading && !match) { |
| return <NoDataSummary />; |
| } |
| |
| return <MatchSummary {...match} />; |
| } |
| } |
| |
| export default MatchSummaryContainer; |
graphql
æž¡ãããæåã®åŒæ°ã¯MatchSummaryQuery
ã§ãã ããã¯ããµãŒããŒããåä¿¡ããããŒã¿ã§ãã WebpackããŒããŒã䜿çšããŠGraphQL ASTã§ã¯ãšãªãè§£æããŸãããWebpackã䜿çšããªãå Žåã¯ãã¯ãšãªããã³ãã¬ãŒãæååã§ã©ããããApolloãããšã¯ã¹ããŒããããgql
颿°ã«æž¡ãå¿
èŠããããŸãã ã³ã³ããŒãã³ãã«å¿
èŠãªããŒã¿ã®ãªã¯ãšã¹ãã®äŸã次ã«ç€ºããŸãã
| query MatchSummary($id: String!, $season: String) { |
| match(id: $id) { |
| stats { |
| scores { |
| home { |
| score |
| isWinner: is_winner |
| } |
| away { |
| score |
| isWinner: is_winner |
| } |
| } |
| } |
| home { |
| id: opta_id |
| record(season: $season) |
| } |
| away { |
| id: opta_id |
| record(season: $season) |
| } |
| } |
| } |
çŽ æŽãããããªã¯ãšã¹ãããããŸãïŒ æ£ããå®è¡ããã«ã¯ã2ã€ã®å€æ°$id
ãš$season
ã«æž¡ãå¿
èŠããããŸãã ãããããããã®å€æ°ã¯ã©ãã§ååŸã§ããŸããïŒ ããã§ã graphql
颿°ã®2çªç®ã®åŒæ°ãæ©èœããæ§æãªããžã§ã¯ããšããŠæç€ºãããŸãã
ãã®ãªããžã§ã¯ãã«ã¯ã髿¬¡ã³ã³ããŒãã³ãïŒHOCïŒã®åäœãæ§æããããã«æå®ã§ããããã€ãã®ããããã£ããããŸãã æãéèŠãªããããã£ã®1ã€ã¯options
ã§ãã³ã³ããã®å°éå
·ãåãåã颿°ãåãåããŸãã ãã®é¢æ°ã¯ã倿°ããªã¯ãšã¹ãã«æž¡ãããšãã§ããã¿ã€ãvariables
ããããã£ãšãã³ã³ããŒãã³ãã®ããŒãªã³ã°åäœãã«ã¹ã¿ãã€ãºã§ããpollInterval
æã€ãªããžã§ã¯ããè¿ããŸãã id
ãšseason
ãMatchSummaryQuery
ã«æž¡ãããã«ã³ã³ããã®å°éå
·ãã©ã®ããã«äœ¿çšãããã«æ³šç®ããŠMatchSummaryQuery
ã ãã®é¢æ°ãé·ããªããããŠãã³ã¬ãŒã¿ã«çŽæ¥æžã蟌ãããšãã§ããªãå Žåã mapPropsToOptions
ãšåŒã°ããå¥ã®é¢æ°ã«mapPropsToOptions
ãŸãã
mapStateToPropsïŒïŒâmapResultsToPropsïŒïŒ
Reduxã³ã³ãããŒã§mapStateToProps
颿°ã䜿çšãããã®é¢æ°ãæž¡ããŠconnect
ããŠãç¶æ
ã¢ããªã±ãŒã·ã§ã³ãããã®ã³ã³ãããŒã®å°éå
·ã«ããŒã¿ã転éããŸããã Apolloã§ã¯ãåæ§ã®é¢æ°ãå®çŸ©ã§ããŸãã graphql
颿°ã«ä»¥åã«æž¡ããæ§æãªããžã§ã¯ããèŠããŠããŸããïŒ ãã®ãªããžã§ã¯ãã«ã¯ãã1ã€ã®ããããã£ããããŸãprops
ãpropsãå
¥åãšããŠåãåããã³ã³ããã«æž¡ãåã«ããããåŠçãã颿°ãåãåããŸãã ãã¡ããã graphql
ã§çŽæ¥å®çŸ©ã§ããŸãããå¥ã®mapResultsToProps
颿°ãšããŠå®çŸ©ãmapResultsToProps
ã§ãã
ãªãå°éå
·ãåå®çŸ©ããå¿
èŠãããã®ã§ããïŒ GraphQLã¯ãšãªã®çµæã¯ãåžžã«data
ããããã£ã«å²ãåœãŠãããŸãã ãã®ããŒã¿ãã³ã³ããŒãã³ãã«éä¿¡ããåã«èª¿æŽããå¿
èŠãããå ŽåããããŸãã æ¬¡ã«äŸã瀺ããŸãã
| import React, { Component } from 'react'; |
| import { graphql } from 'react-apollo'; |
| import { MatchSummary, NoDataSummary } from '@mls-digital/react-components'; |
| import MatchSummaryQuery from './match-summary.graphql'; |
| |
| const mapResultsToProps = ({ data }) => { |
| if (!data.match) |
| return { |
| loading: data.loading, |
| }; |
| |
| const { stats, home, away } = data.match; |
| |
| return { |
| loading: data.loading, |
| home: { |
| ...home, |
| results: stats.scores.home, |
| }, |
| away: { |
| ...away, |
| results: stats.scores.away, |
| }, |
| }; |
| }; |
| |
| const mapPropsToOptions = ({ id, season, shouldPoll }) => { |
| return { |
| variables: { |
| id, |
| season, |
| }, |
| pollInterval: shouldPoll ? 1000 * 60 : undefined, |
| }; |
| }; |
| |
| @graphql(MatchSummaryQuery, { |
| props: mapResultsToProps, |
| options: mapPropsToOptions, |
| }) |
| class MatchSummaryContainer extends Component { |
| render() { |
| const { loading, ...matchSummaryProps } = this.props; |
| |
| if (loading && !matchSummaryProps.home) { |
| return <NoDataSummary />; |
| } |
| |
| return <MatchSummary {...matchSummaryProps} />; |
| } |
| } |
| |
| export default MatchSummaryContainer; |
ããã§ãããŒã¿ãªããžã§ã¯ãã«ã¯ããªã¯ãšã¹ãã®çµæã ãã§ãªãã data.loading
ã¿ã€ãã®ããããã£ãå«ãŸãããªã¯ãšã¹ãããŸã ã¬ã¹ãã³ã¹ãè¿ããŠããªãããšãããããŸãã ããã¯ã <NoDataSummary/>
è¡ã£ãããã«ãåæ§ã®ç¶æ³ã§å¥ã®ã³ã³ããŒãã³ãããŠãŒã¶ãŒã«è¡šç€ºããå Žåã«åœ¹ç«ã¡ãŸãã
äœæïŒïŒ
Composeã¯Reduxã§äœ¿çšãããæ©èœã ãã§ã¯ãããŸããããApolloã«å«ãŸããŠãããšããäºå®ã«åŒãç¶ã泚æãåããããšæããŸãã 1ã€ã®ã³ã³ããã§äœ¿çšããããã«è€æ°ã®graphql
颿°ãæ§ç¯ãããå Žåã«éåžžã«äŸ¿å©ã§ãã ãã®äžã§ã graphql
ãšãšãã«Reduxã®connect
æ©èœã䜿çšããããšãã§ããŸãïŒ ããŸããŸãªäžèŽç¶æ
ã衚瀺ããããã«ã compose
ã䜿çšcompose
æ¹æ³ã¯æ¬¡ã®ãšããã§ãã
| import React, { Component } from 'react'; |
| import { compose, graphql } from 'react-apollo'; |
| import { NoDataExtension } from '@mls-digital/react-components'; |
| import PostGameExtension from './post-game'; |
| import PreGameExtension from './pre-game'; |
| import PostGameQuery from './post-game.graphql'; |
| import PreGameQuery from './pre-game.graphql'; |
| |
| @compose( |
| graphql(PreGameQuery, { |
| skip: ({ gameStatus }) => gameStatus !== 'pre', |
| props: ({ data }) => ({ |
| preGameLoading: data.loading, |
| preGameProps: data.match, |
| }), |
| }), |
| graphql(PostGameQuery, { |
| skip: ({ gameStatus }) => gameStatus !== 'post', |
| props: ({ data }) => ({ |
| postGameLoading: data.loading, |
| postGameProps: data.match, |
| }), |
| }), |
| ) |
| export default class MatchExtensionContainer extends Component { |
| render() { |
| const { |
| preGameLoading, |
| postGameLoading, |
| gameStatus, |
| preGameProps, |
| postGameProps, |
| ...rest |
| } = this.props; |
| |
| if (preGameLoading || postGameLoading) |
| return <NoDataExtension gameStatus={gameStatus} />; |
| |
| return gameStatus === 'post' |
| ? <PostGameExtension {...postGameProps} {...rest} />; |
| : <PreGameExtension {...preGameProps} {...rest} />; |
| } |
| } |
ã³ã³ããã«è€æ°ã®ç¶æ
ãå«ãŸããå Žåã compose
ããŸãæ©èœããŸãã ããããç¶æ
ã«å¿ããŠã®ã¿å¥ã®ãªã¯ãšã¹ããå®è¡ããå¿
èŠãããå Žåã¯ã©ãã§ããããïŒ ããã§skip
ã¯ãäžèšã®æ§æãªããžã§ã¯ãã§ç¢ºèªã§ããããã«åœ¹ç«ã¡ãŸãã skip
ããããã£ã¯ãpropsãåãåã颿°ãåãå
¥ããå¿
èŠãªåºæºãæºãããªãå Žåã¯ã¯ãšãªã®å®è¡ãã¹ãããã§ããŸãã
ããããã¹ãŠã®äŸã¯ãReduxãç¥ã£ãŠããã°ãããã«Apolloã®éçºã«åå ã§ããããšã瀺ããŠããŸãïŒ ãã®APIã«ã¯Reduxã®æŠå¿µã®å€ããçµã¿èŸŒãŸããŠããŸãããåãçµæãéæããããã«èšè¿°ããå¿
èŠãããã³ãŒãã®éã¯åæžãããŠããŸãã
ã¡ãžã£ãŒãªãŒã°ãµãã«ãŒãã¢ããã«ç§»ããçµéšãããªãã®ã圹ã«ç«ãŠã°å¹žãã§ãïŒ ããŸããŸãªã©ã€ãã©ãªã«é¢ããæ±ºå®ãšåæ§ã«ãã¢ããªã±ãŒã·ã§ã³ã§ã®ããŒã¿ã®åä¿¡ãå¶åŸ¡ããæé©ãªæ±ºå®ã¯ããããžã§ã¯ãã®ç¹å®ã®èŠä»¶ã«ãã£ãŠç°ãªããŸãã ç§ãã¡ã®çµéšã«é¢ããŠè³ªåãããå Žåã¯ã ããã«ã³ã¡ã³ããæ®ããã Twitterã§ãã©ããŒããŠãã ããïŒ
èªãã§ãããŠããããšãïŒ