ããšããšã¯ãã³ã®ãã€ãŒãã«è§ŠçºãããŸããã
TL; DR-ãã®ãªããžããªãš
è±å¯ãªäŸãæžãã«ã¯å€ãã®æéãããããïŒãšãããïŒæžã蟌ã¿å¯èœãªAPIãšã³ããã€ã³ããå¿ èŠã§ãã ãã ããéçºè ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããéã«é©åãªåç §ãã¬ãŒã ã確ä¿ããããšãéåžžã«éèŠã ãšç§ã¯æããŠããŸãã ãŸããReduxã§ãã®çš®ã®å ¥éæžãæ±ããŠãããŠãŒã¶ãŒãããããããŸãããã®ããããã®äœæã«è³éãæäŸã§ããããšãããããæããŸãã
ããªããããã«åãçµãããšã«èå³ããããªããããªãããããšlmkã«ã€ããŠæã£ãŠããã§ãããã©ããªèããèããŠã¿ããã§ãïŒ
以äžãåŠçããå ¬åŒã®CRUDã®äŸã欲ããã§ãã
ãããäžå¿ã«ã³ãŒã¹ãäœãããã®ãªããããã¯çŽ æŽãããããšã§ãã ãã ãããµã³ãã«èªäœããã®ãªããžããªã«æäŸãããŠããããšãéèŠã ãšæããŸããããããããšã§ããµã³ãã«ãç¶æããææ°ã®å€æŽãææ°ã®ç¶æ ã«ä¿ã€ããšãã§ããŸãã ãããã£ãŠãæ¢åã®äŸã§äœ¿çšããŠãããã«ãã·ã¹ãã ãšèŠåãšäžèŽããŠããå¿ èŠããããŸãã
ããã¯æå³ããããŸããïŒ
ãŸãã人ã ãAPIããããŒã¿ããã§ããããŠããå Žæã確èªããããšæããŸãã
@gaearonã®ã³ã³ãã³ã/ã³ãŒãã¯ãªãŒãã³ãœãŒã¹ã«ãªãã®ã§ãåé¡ãããŸããã ããŒãžã®ã©ããã«æ»ããªã³ã¯ããé¡ãããŸãïŒïŒïŒç·šé-æ¢åã®ãã«ãã·ã¹ãã /ã³ã³ãã³ã·ã§ã³ã䜿çšããããšãç§ãã¡ã«ãšã£ãŠæãŸããã§ãïŒ
@sebastiandeutschããã«ã€ããŠå°ã詳ãã
ãã°ããåã«ãreact + reduxã monogram ã eccryptoã䜿çšããŠãã¹ã¯ãŒããããŒãžã£ãŒãäœæããããšããå§ãhttpsïŒ //github.com/rackt/redux/issues/1353#issuecomment-178760036ã®ãã¹ãŠã®é ç®ãååã«æºããããšãã§ããŸããã é¢çœããã§ããïŒ
@ vkarpov15
ããã¯éåžžã«èå³æ·±ãããã«èãããŸããããã¡ã€ã³åºæã§ãããšã¯æããŸããã ã»ãšãã©ã®äººã¯äžè¬çãªCRUDã®äŸïŒããããã®ã¢ã€ãã ã«ãªã³ã¯ã§ããç·šéå¯èœãªã¢ã€ãã ã®ãªã¹ããªã©ïŒãèŠãããšæãã§ãããããããŠç§ã¯æå·ã®çŠç¹ãäŸããã芪ãã¿ããããããããããªãã®ã§ã¯ãªãããšå¿é ããŠããŸãã
楜芳çãªã¢ããããŒãã䜿çšããããŒã«ã«/ãªãã©ã€ã³ç·šéã«éåžžã«èå³ããããŸãããã°ããã¯ãããŸãããreduxã¢ããªã®çµéšã¯ããŸããªããè€éãªãã€ãã£ãã¢ããªããå
¥æã§ããŸããã§ããããã»ãŒå®å
šã«ããŒã«ã«/ãªãã©ã€ã³ã§ãã
ãã¶ããã¬ããæžããŠããã«åãçµã¿ã段éçã«è©±ãåãããšãã§ããã§ããããïŒ
ãŸãããã¢ãžã¥ã©ãŒãã¢ããªã¯ã©ãã§ããïŒ
ããã€ãã®ã¢ã€ãã¢ãå
±æããããã«ããªãã©ã€ã³ã®æåã®ã¢ããªãã©ãããã¹ããã«ã€ããŠããã€ãã®ã¢ã€ãã¢ãæžãçããŸãããæéãããã°è©ŠããŠã¿ãŠãã ããã :)
åé¡ãã©ãã»ã©åºãŸã£ãŠããã®ãããã®ã³ãŒã¹ã®éçºè ã®ç®æšã¬ãã«ã¯ããããŸããããreact + reduxã§å®è£ ãããè€éãªã¢ããªã³ã³ããŒãã³ãïŒãã«ãã¹ããããã©ãŒã ããŠã£ã¶ãŒããªã©ïŒãèšèšããæ¹æ³ããããäžã®ã©ããã§èŠãããšæããŸããç¶æ ã¯è€æ°ã®ã¬ãã¥ãŒãµãŒã«ãã£ãŠå¶åŸ¡ãããŠãããããå¥ã®ã¢ããªã§å šäœãšããŠåå©çšã§ããŸãã
@sompylasar ReactReduxãªããžããªã§ããã«é¢ããåé¡ãèªç±ã«äœæããŠãã ããã ããã§ãRedux察å¿ã³ã³ããŒãã³ããåå©çšãŸãã¯åé¢ããããã®ã¢ãããŒãã«ã€ããŠè©±ãåãããšãã§ããŠããããã§ãã
åå¿è ã¬ãã«ã®ã¯ã©ããã®äŸãæ¢ããŠããå Žåã¯ãåžžã«todo-mvcãšããbabel + redux + react + webpackã䜿ãå§ããããã¥ãŒããªã¢ã«ã®è»éããããŸãã ããã«å¥ã®ãã®ã«å€ãã®äŸ¡å€ããããã©ããã¯ããããŸããããæ¯é±ãã®ããŒãã«é¢ããããã€ãã®æ°ããããã°æçš¿ãèªãããšã«ãªããŸãïŒãã ãããããã®ãã¥ãŒããªã¢ã«ãèªåçã«çæããã¢ããªãäœæã§ããŸããïŒïŒpïŒã ç§ã¯ãããäžçŽã¬ãã«ã®ãã¥ãŒããªã¢ã«ã®æ¹ã䟡å€ããããæå·ã«ã€ããŠåŠã¶IMOã¯é åçãªå¯æ¬¡çãªå©ç¹ã«ãªãå¯èœæ§ããããšäž»åŒµããŸãã
åå¿è ã¬ãã«ã®äŸãæ¢ããŠããããã§ã¯ãããŸããããCRUDã®è€éãªéšåïŒããŒãžä»ããæ£èŠåã楜芳çãªæŽæ°ãé¢ä¿ïŒãäŸã®çŠç¹ã«ããå¿ èŠããããŸãã
ããã¯ã«ã¹ã¿ã ãŸãã¯æ¢åã®APIãæ¶è²»ããŸããïŒ ãŸãã¯çµã¿åããïŒ
ããã¯é£ãã質åã§ãã ããããªãã Github APIã¯èšè¿°å¯èœã§ãããæŠå¿µã¯èª°ã«ã§ããªãã¿ããããããè¯ãã¢ã€ãã¢ãããããŸããã @ryanflorenceã䌌ããããªããšã«
ããã§äžäžçŽã®éçºè ã確å®ã«ã¿ãŒã²ããã«ããŸãã åå¿è ã®ã¿ããã¯é£œåç¶æ ã«ãããäžèšã®ãã³ãïŒçŸå®ã®ïŒé£ãããããã¯ãã«ããŒããããšã¯ãã£ãã«ãããŸããã
ç§ã¯ã«ã¹ã¿ã APIãšæ¢åã®APIã®äž¡æ¹ããããã¯ãã®äž¡æ¹ãåãå ¥ããŠããŸããawsã¢ã«ãŠã³ãã§ã«ã¹ã¿ã APIããã¹ãã§ããã°å¹žãã§ãã ãŸããMedium.comã¯ããŒã³çšã®æ¬æ ŒçãªAPIãããã䜿çšã§ããä»ã®ããã€ãã®ã³ãŒã¹çšã«æ§ç¯ããŠããŸããèå³ãããã°ãããã¯ãšã³ãã®ãœãŒã¹ã³ãŒããå©çšã§ããŸãã é¢çœãããªå Žåã¯ã詳现ãå ±æããŠãã ããã
@EricSimonsMediumã¯ããŒã³ã«ã€ããŠãã£ãšç¥ãããã§ãã
@cshenoy確ãã«ã ããã³ããšã³ããšããŠReact / Reduxããããã¯ãšã³ããšããŠNodeã䜿çšãããã«ã¹ã¿ãã¯JSã³ãŒã¹ãæ§ç¯ããŠããŸãã ããã¯ãšã³ãAPIã¯ãããŒã«ã«ã§å®è¡ããããªã人ã®ããã«åå¥ã«ãã¹ãããããããäžèšã®ããè€éãªãããã¯ã®ããã€ããæããã®ã«é©ããŠããå¯èœæ§ããããŸãã ããã£ã¢ã ã¯ããŒã³ã®æ©èœã»ããã«ã¯ã次ã®ãã®ãå«ãŸããŸãã
æçµçãªã³ãŒãããŒã¹ã®ETAã¯ä»é±ã®çµãããŸã§ã«ããã®ã§ããã®é ã«ãã£ãšæ å ±ããããŸãã ãã¹ãŠãã¹ãŒããŒã¢ãžã¥ã©ãŒã«ãªãããã«èšèšãããŠãããããæ©èœãè¿œå ããã®ã¯ç°¡åã§ãã
ã¿ã€ã ã·ãŒãïŒã¿ã€ã ãã©ãã«ãŒïŒã¯ããã©ãã¯ã¹/ãªããã¯ã¹ãšã¯ã©ããã®å€ãã®è€éãªåŽé¢ãå®éã«å®è¡ããŸãã æ°æ¥ããæ°é±éãååŸã«ã¹ã¯ããŒã«ãããšãããŒãžä»ããšãã£ãã·ã¥ãæããã«å¿ èŠã«ãªããŸãã æžã蟌ã¿å¯èœãªAPIããããããããŸãã ã¿ã€ã ãã©ããã³ã°ã ãã§ã¯ãããŸããã ãŠãŒã¶ãŒç®¡çããããžã§ã¯ããšã³ãã£ãã£ãªã©ã
ããã¯çŽ æŽãããããšã ãšæããŸãã ç§ã¯ãããšå°ãèŠåŽããŸãããç¹ã«ããã®äœæéšåã ããšãã°ã次ã®ãããªæ°ããèšäºãäœæããArticlePageã³ã³ããŒãã³ãããããšããŸãã
// shortened version
import { addArticle } from '../actions'
function doAddArticle(props, handleAdded, values, dispatch) {
props.addArticle(values)
.then(handleAdded)
}
class AddArticlePage extends Component {
handleAdded = () => {
this.props.pushState(null, '/articles/')
};
render() {
return (
<div>
<ArticleForm submit={(values, dispatch) => doAddArticle(this.props, this.handleAdded, values, dispatch)} />
</div>
)
}
}
function mapStateToProps(state) {
return {}
}
export default connect(mapStateToProps, {
pushState,
addArticle
})(AddArticlePage)
/articles/{id}/
ããŒãžã«ãªãã€ã¬ã¯ããããå Žåã¯ã©ããªããŸããïŒç¢ºãã«ãç§ã¯æ°ãæããReduxã䜿çšããŠããªãã®ã§ãã°ãããåé¡ãããããŸããããåå¿è ãšããŠã¯ééããªãç§ãã€ãŸããããç§ã®è§£æ±ºçããæ£ããæ¹æ³ãã§ãããšã¯ãŸã æããŠããŸããã
@jonathaningramããªãã¯redux-thunkãèŠãããšããããŸããïŒ äžèšã§è¡ã£ãŠããããšã®ä»£ããã«ãã¢ã¯ã·ã§ã³å ãããã£ã¹ãããã§ããŸã
@babsonmattyepç§ã¯ãã§ã«ããã䜿çšããŠããŸãã ç§ã¯ããã䜿çšããå®éã®äŸã«åºã¥ããŠã¢ããªãäœæããŸããã ãã¶ãç§ã¯ãããå®å šãªæ©èœã«äœ¿çšããŠããŸããã
@jonathaningramäŸãããããšãã ææãããããã«ããªãã€ã¬ã¯ãããžãã¯ãã¢ã¯ã·ã§ã³äœæè ã®ãµã³ã¯ã«ç§»åããããããã«ãŒãæŽæ°ããã£ã¹ãããããå¿ èŠããããŸãã redux-sagaãredux-side-effectsãªã©ãå¯äœçšã管çããæ¹æ³ã¯ä»ã«ããããŸãïŒãªãã€ã¬ã¯ãã¯ããã®ã¢ã¯ã·ã§ã³ã«ãã£ãŠåŒãèµ·ããããç¶æ é·ç§»ã®å¯äœçšã§ãïŒã ããããæ·±ãè°è«ã¯ãã®åé¡ã®ç¯å²å€ã ãšæããŸãã
@sompylasarããããšãã ã¯ããç§ã¯ãã®åé¡ãåé¿ãããã¯ãããŸãããããã®åé¡ããçããæ°ããäŸã«åœ¹ç«ã€ããšãé¡ã£ãŠãreduxã®åå¿è ãšããŠã®ç§ã®ãçŸå®äžçãã®çµéšãå ±æããããšæããŸããã
@EricSimonsç§ã¯å©ããããšã«èå³ããããŸãã ç§ã¯çŸåšãnuclear-jsã䜿çšããŠCRUDã¢ããªãä¿å®ããŠããŸããããã®ã¢ã€ãã¢ã®å€ãã¯reduxã«ããŸãå€æããããšæããŸãã ãã¬ãŒã³ã¹ããŒãã³ã°ããããå Žåã¯ãç¥ãããã ããã
ç§ã¯æè¿ãCRUDïŒover RESTïŒç¶æ
管çã®ãããžã§ã¯ããéå§ããŸããã Marionette/Backbone
ããæ¥ãReact / Reduxãæãäžãå§ãããšããç§ã¯æ¬åœã«RESTã®æ
£ç¿ãéããŸããã
https://github.com/masylum/resting-ducks
解決çãäŸã§ãããã©ããã¯ããããŸããã ãã®ããã«ã¯å³æžé€šã®æ¹ãããŸããããšæããŸãã ç¶æ 管çã¯ã»ãšãã©ã®å Žååãã§ãã2016幎ã«ã¯ãCRUDã³ãŒããäœæããã®ã§ã¯ãªããããžãã¹ããžãã¯ã«çŠç¹ãåœãŠãå¿ èŠããããŸãã
@EricSimonsçŸåšãããŒã¿ã®ããŒãºãæå®ããå ŽæãšããŒã¿ããã§ããããã¿ã€ãã³ã°ã«ã€ããŠãããŸããŸãªãªãã·ã§ã³ãè©äŸ¡ããŠããŸãã 1ã€ã®ãªãã·ã§ã³ã¯ãRelayishãå®è£ ããããšã§ãããå°ãããéãã ãšæããŠããŸãã ç§ããããžã§ã¯ãã®ããã«äœã£ããã®ã¯ãããŒããŒå±æ§ã䜿çšããŠã«ãŒãã§ã®èªã¿èŸŒã¿ã®ããŒãºãæå®ããããšã§ãã
let routes = <Route path='/' component={Layout}>
<IndexRoute component={BooksIndex} />
<Route path='/book/new' component={BooksNew} />
<Route path='/book/:id' component={BooksShow} loader={BooksLoader} />
<Route path='/book/:id/edit' component={BooksEdit} loader={BooksLoader} />
</Route>;
BooksLoaderã¯ã次ã®2ã€ã®é¢æ°ãå®è£ ããã¯ã©ã¹ã§ãã
ããã¯éåžžã«åºæ¬çãªå®è£ äŸã§ãããããã¹ããŒããªãã®ïŒImmutableJS / Mapãªã©ïŒã«ç¢ºå®ã«çœ®ãæããããšãã§ããŸãã
import _ from 'lodash';
import * as Actions from 'actions';
import API from 'api';
export default class BooksLoader {
needsToSyncStore(params, store) {
let books = store.getState().books;
if(books) {
const book = _.findWhere(books.collection, { isbn: params.id });
if(book) {
return false;
}
}
return true;
}
syncStore(params, store) {
let { dispatch } = store;
let api = new API();
let loadBooks = Actions.loadBooks();
return loadBooks(dispatch, store.getState);
};
}
ããŒããŒã¯ãã«ãŒãã«ãã£ãŠæäŸãããç¶æ ãšããã¹ãã容æã«ããreduxç¶æ ããªãŒã®ã¿ãèæ ®ããŸãã
次ã®éšåã¯ãReactRouterã®RenderContextãšããŠäœ¿çšã§ãã@ryanflorence AsyncPropsïŒhttps://github.com/rackt/async-propsïŒã«å€§ãã圱é¿ãåããreactã³ã³ããŒãã³ãã§ããã¹ãã¢ããŒããŒã§ãïŒ httpsïŒ//gist.githubã com / sebastiandeutsch / e6148ca0741cc355248c
ããŒããŒã®ReactRouterã®ã«ãŒãããã§ãã¯ããŠå®è¡ããŠããŸãã ãŸããã³ã³ããã¹ããä»ããŠããŒãç¶æ ãå ¬éããŸãã å®éã«ã¯ã次ã®ããã«ãªããŸãã
<Provider store={store}>
<Router
history={browserHistory}
render={(props) => (
<StoreLoader {...props} store={store} />
)}>
{routes}
</Router>
</Provider>
ã«ãŒãã³ã³ããŒãã³ãïŒãããã¯ã«ãŒã¿ãŒããçŽæ¥åã§ããç¹å¥ãªã³ã³ããŒãã³ãã§ãïŒã§ã¯ã次ã®ãããªã³ã³ããã¹ãã䜿çšã§ããŸãã
export class BooksShow extends React.Component {
static contextTypes = {
storeIsSynchronized: React.PropTypes.bool
};
...
render() {
const { book } = this.props;
if(this.context.storeIsSynchronized) {
/* display components */
} else {
/* display loading spinner */
}
}
export default connect(
(state, props) => {
return {
book: _.findWhere(state.books.collection, { isbn: props.params.id } )
}
},
(dispatch) => ({
actions: bindActionCreators(Actions, dispatch)
})
)(BooksEdit);
@gaearonãããã®ã¢ã€ãã¢ã«ã€ããŠã©ãæããŸããïŒ
@sebastiandeutschç§ã¯ãã®ã¢ãããŒãã奜ãã§ãã ç§ãAsync-Propsãè©ŠããŠããŸããããã§ã®ã¢ã€ãã¢ã¯æ¬åœã«ã¯ãŒã«ã«èŠããŸãã
ãã®äŸã¯ãããŒã¿ãã§ããã®æœè±¡åã«åãããŠèª¿æŽãããã®ã§ã¯ãªããããäžè¬çãªãã®ã§ãããšæ³å®ãããŠãããšæããŸãã Rest APIã®ã¹ãã¢ãšã¢ã¯ã·ã§ã³ãèšå®ããç°¡åãªæ¹æ³ã®åºæ¬çãªäŸãšããŠã httpsïŒ//github.com/optimizely/nuclear-js/tree/master/examples/rest-apiãæ¬åœã«å¥œãã§ãã
ãã£ãã·ã¥ããµããŒãããé²è¡äžã®ãªã¯ãšã¹ããã¹ãã¢ã«ä¿åããããã«æ¡åŒµããŸããïŒãªã¯ãšã¹ããå床è¡ãããå ŽåãåŒã³åºãå ã¯xhrãåéããã®ã§ã¯ãªããåã«å»¶æãããŸããç§ã話ããŠããããšã®ããå ç¢ãªäŸã¯ããã«ãããŸãïŒ https ïŒ @ jordangarciaã®æŠå¿µã®ããã€ããã³ããŒããŠå€§æåãåããŸãããããã§ã®ã¢ãããŒãã¯ãããŸãæ©èœãããšæããŸãã reduxãåæ§ã§ãïŒnormalizrãªã©ã䌎ããŸãïŒã
@EricSimonsã¯ãäž»é¡ãšæžã蟌ã¿å¯èœãªåªããAPIã®æ€çŽ¢ã«é¢ããåé¡ã§ããããããšãç¹å®ã®ã¢ãããŒããæ¢ããŠããŸããïŒ
ç§ã¯äž»ã«äž»é¡ã«èå³ããããŸãïŒææªã®å Žåã人ã ã䜿çšããããã®ç¬èªã®æžã蟌ã¿å¯èœãªAPIããã¹ãã§ããããïŒã äžèšã®ã³ã¡ã³ãæçš¿è ã®çããã«å¿ããæè¬ããŸãããããŸã§ã®ãšããããã®è°è«ã¯çŽ æŽãããã£ãã§ãã ãããã®äŸã§ã«ããŒãã¹ãããšã«ã€ããŠãããå€ãã®èã/ã¢ã€ãã¢ãèããããšæããŸãã
åèãŸã§ã«@ dan-weaverãšããã«åãçµãããšã«èå³ã®ããä»ã®äººãã¡-é æ ®ãªãç§ã«ã¡ã¢ãæ®ã£ãŠãã ãã
Meteorã®äžçã«ã¯ãMeteorã«é¢ããæ¬ããçãŸãã1ã€ã®å€§ããªãªãŒãã³ãœãŒã¹ã®ãµã³ãã«ãããžã§ã¯ãããããŸãã ãã®ãããžã§ã¯ãã¯Telescopeã§ãRedditãHackerNewsã«äŒŒãWebã¢ããªã±ãŒã·ã§ã³ã§ãã Reduxã«åæ§ã®äŸãããã°ãããã¯çŽ æŽãããããšã§ãã å€ãã®éçºè ã¯ããã®æ¬ãèªã¿ããããšäžç·ã«æé é¡ã®ããå°ããªããŒãžã§ã³ãæ§ç¯ããããšã«ãã£ãŠMeteorãåŠã³ãŸããã Telescopeã®ãããªã¢ããªã±ãŒã·ã§ã³ã¯ãã»ãšãã©ã®éçºè ããã§ã«ç²ŸéããŠããã¢ããªã±ãŒã·ã§ã³ã§Danãæèµ·ãããã¹ãŠã®ãããã¯ãã«ããŒããŸãïŒHacker NewsãRedditãªã©ã®ããïŒã
ç§ã¯æ°ã¶æåã«webapp *ã§åæ§ã®ã¢ããªã±ãŒã·ã§ã³ã®åºç€ãäœãå§ããŸããã ãã®ãããžã§ã¯ãã«ã¯ããã«ãããã»ã¹ãcssã¢ãžã¥ãŒã«ãèªèšŒãAPIçšã®åå¥ã®ãµãŒããŒãMongoDBããµãŒããŒåŽã¬ã³ããªã³ã°ãGraphQLãªã©ããã§ã«ã»ããã¢ãããããŠããŸãïŒãã ããå°ãå€ããªã£ãŠããããããã«äœæ¥ãå¿ èŠã§ããããå®è¡ã§ããå¯èœæ§ããããŸãïŒããè¯ãïŒã ããã«ãã¬ãã¥ãŒãµãŒã®åå²ããããŸããããã¯ãä»ã®äŸã«ã¯ãªããšæããŸãã æ¬ ããŠãã倧ããªç¹ã¯ãããŒã¿ãã§ããã楜芳çãªæŽæ°ããªã¢ã«ã¿ã€ã ããŒã¿ã«å¯Ÿããåªãããœãªã¥ãŒã·ã§ã³ã§ãã ãŸãã2ãæã¯ãã¹ãŠãçŸåšã©ãã ãéãé²ãã§ããããšããç¹ã§æ°žé ã®ããã«èŠããã®ã§ãå°ãæ代é ãã§ã:)
ã³ãŒã¹ã®äŸãäœæããããã®éå§ç¹ãå¿ èŠãªå Žåã¯ããããã_webapp_ãã€ã³ã¹ãã¬ãŒã·ã§ã³ã«ãªãå¯èœæ§ããããŸãã ãããŠãReduxã§è¡ãããŠããæé é¡ã«äŒŒããã®ãèŠããã§ãã
* _ããŠããŠãã©ã«ãã«ã¯ãè¡ãããã¢ãŒããã¯ãã£/決å®ã«é¢ããæ å ±ãå«ãŸããŠããŸãã_
_è£è¶³ïŒ_ Reduxã«ã¯ããŒã¿ãã§ããã®ã¹ããŒãªãŒããªãããšã«æ°ä»ããã®ã§ãçŸåšãReduxãšçµ±åããRelayã«äŒŒãã·ã¹ãã ãäœæããŠããŸãã ããããç§ã2ãæé_webapp_ãæŽæ°ããŠããªãçç±ã§ãã ãã®ã·ã¹ãã ã®äœæã«æåããå Žåã¯ã_webapp_ãç¶è¡ããŸãã
çŽé¢ããŠããåé¡ã®1ã€ã¯ãReduxã®ã¬ãã«ãéåžžã«äœãããããã®åšãã«ã¢ããªã±ãŒã·ã§ã³ãå®éã«ã©ã®ããã«æ§ç¯ãããã«ã€ããŠã¯ãŸã£ããæèŠãåãããŠããªãããšã§ãã ãããã£ãŠãreduxãšæçµçãªãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®éã«æå¹ãªæœè±¡åãéåžžã«å€ããããããåŠç¿ããã³ãŒãããŒã¹ã®äŸã1ã€ã ãç¶æã§ãããã©ããã¯ããããŸããã ããã¯ããã®ã¹ã¬ããã§ã®è°è«ã®äžéšã«ãã£ãŠäŸç€ºãããŠããŸããããã§ã¯ãããŒã¿ã®èªã¿èŸŒã¿ã«é¢ããããŸããŸãªå¯èœæ§ãæ確ãªåè ãªãã§æ瀺ãããŠããŸããã¢ããªã±ãŒã·ã§ã³ã®èŠæš¡ã倧ããç°ãªããããæ£ããæ¹æ³ã¯
ãã®ãããDanãåè¿°ãããã¹ãŠã®é«åºŠãªæ©èœãå¿ èŠãšããä»æ§ã«ã_The_Advanced TODOMVCofReduxããèæ¡ããããšãæãŸããã
åé²ããã«ã€ããŠããã®é«åºŠãªã¢ããªã±ãŒã·ã§ã³ãæŠå¿µå®èšŒãšããŠäœ¿çšã§ãããããå€ãã®æœè±¡å/ã©ã€ãã©ãª/ãã¬ãŒã ã¯ãŒã¯_around_ReduxãèŠãããããã«ãªããšæããŸãã å®éãæéã®çµéãšãšãã«ãããã¯éReduxåºæã«ãªãããã«ãã©ã³ãåãå€æŽãããå¯èœæ§ããããŸãã
APIã®é¢ã§ã¯ãããçš®ã®æšæºïŒ JSON-APIã¯éæ£èŠåãšé¢ä¿ã®èšè¿°ã«åªããåºç€ãæäŸããŸãïŒã«åŸããæçµçã«ã¯ãã®åã«GraphQLãµãŒããŒãé 眮ããããšãæãã§ããŸãã
ãããã³ãã¥ããã£ãšããŠã©ã®ããã«æ§æãããŠãããã«ã€ããŠã¯ãã¢ããªã±ãŒã·ã§ã³ä»æ§ããµãŒããŒå®è£ ãããã³çŸåšã®ãã¹ãŠã®å®è£ ã®ãªã¹ã/æ¯èŒãã£ãŒããå«ãã³ã¢ãªããžããªãäœæã§ãããšæããŸãã
äžæ¹ã§ãéšåçã«é¢é£ããŠããŸãããããã§ã®ç¹å®ã®ãããã¯ãããReduxã®ç¯å²ãæ確ã«ããããšã§ãã®åé¡ãåªå ããã®ããããšæããŸã-äœã¬ãã«ã®æ§è³ªã匷調ããŸãã
远䌞ç§ã¯ãçŸå®ã®äžçReduxã®ã話ãã§æ¥ããŠãããã³ãã³ã«åå¿DïŒããã«ïŒç§ã¯ããŸãããã°ãæã§ãããé«åºŠãªåé¡ãæ¢æ±ããæéãååŸããŸãå ŽåïŒã®ã§ãå€ãèŠãŸã
ç§ã¯ããã«åãçµãã€ããã§ããtodoãªã¹ãã§ã¯ãªãã䜿ãããããã³ã¡ã³ãããã説æãããReduxã¢ããªã±ãŒã·ã§ã³ãæ°åè ã«æäŸããããšã¯çŽ æŽãããã¢ã€ãã¢ã ãšæããŸãã ããã«é¢ããäœæ¥ã¯ãŸã @EricSimonsã§éå§ãããŠããŸããïŒ
redux
ã®å®åæãæžãããããã䜿ã£ãŠçŸå®äžçãæ§ç¯ããæ¹æ³ã«ã€ããŠã¯ãåæ§ã®è³ªåãããããããããã§ãã ç§ã¯ããã§æžããïŒãšãããïŒããªãè¯ã解決çãèŠã€ãããšæããŸãïŒ
https://medium.com/@timbur/react -automatic-redux-providers-and-replicators-c4e35a39f1
TL; DRïŒ propTypes
åºã¥ããŠãã³ã³ããŒãã³ãã«èªåçã«äžèŽããredux
ãããã€ããŒãäœæã§ããŸãã æ¬åœã«å¿
èŠãªã®ã¯ã components
ãã£ã¬ã¯ããªã providers
ãã£ã¬ã¯ããªãããã³ãªãã·ã§ã³ã§ããæšå¥šãããthemes
ãã£ã¬ã¯ããªã ãã§ãã ãã¹ãŠãç°¡åã«äº€æå¯èœã§ãç解ãããããä¿å®å¯èœã§ãæ¡åŒµå¯èœã§ãåå©çšå¯èœã§ãã ã¯ã©ã€ã¢ã³ããšãµãŒããŒã®äž¡æ¹ã®ããããªããŒãããµãŒããŒã¬ã³ããªã³ã°ãªã©ãããã«å€ãã®æ©èœãå«ãŸããŠããŸããä»æ¥ãä»å±ã®ãã€ã©ãŒãã¬ãŒãã«åºã¥ããŠã¢ããªãæåããäœæããŸããããéåžžã¯1æéããããŸãã :)
æ©æ察å¿ã®æ¡çšè ãšããŠã®çµéšããèšãã°ãäŸã§ã¯GithubAPIã䜿çšããããããŸããã
代ããã«ãåçŽãªã«ã¹ã¿ã APIã䜿çšããŠãã ããã ãµãŒãããŒãã£ã«äŸåããããªãã®ã§ã json-server
ç§ã®BottledAPIã®äŸïŒwipïŒã®ããã«èª°ã§ãç¬èªã®ã€ã³ã¹ã¿ã³ã¹ãå®è¡ã§ãããã
ããã«ãããJavascriptãJavaãCïŒãPHPãªã©ã®ä»ã®ã¬ã¹ãããã¯ãšã³ãå®è£ ãå¯èœã«ãªããŸããããã¯ãããªãã®ã¿ãŒã³ããŒãšããŠãéçºã®ããã¯ã¹ã¿ãŒãã«åœ¹ç«ã¡ãŸãã
ãšããã§ãäžèšã®ç§ã®ã³ã¡ã³ãã®ãªã³ã¯å ã«ãããã°ã¢ããªãæ§ç¯ããæ¹æ³ã®è©³çŽ°ããããŸãã æ¥é±äžã«ãŠãŒã¶ãŒèªèšŒãªã©ãè¿œå ããäºå®ã§ãã
ããã«ã¡ã¯ãã¿ããªïŒ ç§ã¯ReactJSãç 究ããŠããŠãReact + Reduxã䜿çšããŠå人çšURLççž®ãµãŒãã¹ã®ããŒãžã§ã³ãéçºããŸããã ç§ã®äŸã§ã¯ãããã³ããšã³ãéçºã«Gulp + Browserify + Babelifyã䜿çšããŠããŸãã ã³ã³ããŒãã³ããšã¢ã¯ã·ã§ã³ã«ã€ããŠãMochaãšEnzymeã䜿çšããŠåäœãã¹ããäœæããŸããã ãã®äŸã«ã¯æ¬¡ã®ãã®ããããŸãã
ã€ã³ã¿ãŒãã§ã€ã¹ãšäœ¿ããããã«ããã€ãã®ãã°ããããŸãã ããããããã¯æ©èœããŠããŸã=ïŒ
ãã¶ã誰ãããããå®éã®äŸã®ããŒã¹ãšããŠäœ¿ãããšãã§ããŸãã
ãã¢ïŒ https ïŒ
ãœãŒã¹ïŒ https ïŒ
ãã®äŸãæ¹åããæ¹æ³ã«ã€ããŠã®ææ¡ãåãå ¥ããŸãã ããããšãïŒ
ããŒãã£ãŒã«ã¯å°ãé ããŸããããReduxäžã«æ§ç¯ãããæ¬æ Œçãªç®¡çWebã¢ããªã±ãŒã·ã§ã³ãç«ã¡äžããŸããã
éåæãžã§ãã«ã¯redux-thunkã䜿çšãããããã¬ãã«ã®ã¬ãã¥ãŒãµãŒããã£ã«ã¿ãªã³ã°ããã ãã§é©ãã¹ãæ¹åïŒ_ã¢ãã€ã«äž_ïŒãæäŸããredux-ignoreã䜿çšããŸãã
Webã¢ããªã¯100ïŒ
å¿çæ§ããããããã¢ãã€ã«ã§ç°¡åã«äœ¿çš/ãã¹ãã§ããŸãã
åã®ã¢ã¯ã·ã§ã³ããããŒã«ããã¯ãããããšã«ããã楜芳çãªæŽæ°ã管çããŸãã 圱é¿ãåããã¬ãã¥ãŒãµãŒã¯ã以åã®ç¶æ ã«æ»ãæ¹æ³ãç¥ã£ãŠãããããéåžžã«åé¢ãããŠå¹ççã§ãã
ãšã«ãããããã«ãªã³ã¯ããããŸãhttp://www.handy-erp.com/en/
ã¢ã«ãŠã³ããäœæããŠãèªåãããã¯ã¢ãŠãããã ãã§ãã
@SebastienDanielããã§ãšãããããŸãïŒ ããã¯çŸãããŠã§ããµã€ãã§ãã reduxã®éšåããããªãã¯ãªããžããªã«é 眮ããŸãããïŒ
ããããšã@gustavohenrique
æ®å¿µãªããããããããœãŒã¹ã¯å
¬éãªããžããªã«ãããŸããã ãã ãã質åãã«ããŒããããã³ãã¥ããã£ãæ¯æŽããããã®ãã¢ãäœæãããããããã«ããœãŒã¹ã䜿çšããããšã¯éåžžã«ãªãŒãã³ã§ãã
ã¢ãžã¥ãŒã«æ§ã®äŸãæ¬åœã«èŠããã§ãã èšå€§ãªéã®æ©èœãåããã¢ããªãæ§ç¯ããŠããå Žåã¯ãåäžè²¬ä»»ã¢ãžã¥ãŒã«ãæ§ç¯ããæ¹æ³ãæ¬åœã«æ¢ããŠããŸãã ããŒã ã«ãšã£ãŠããè¯ããä¿å®æ§ã«ãšã£ãŠããè¯ãã
ãŸããå
±æã³ãŒãããããšãããããŸãïŒ@gustavohenrique
ä»ã®ãã®ïŒ
ãŠãŒã¶ãŒãªã¹ããããããªããšæããŸããïŒ ãã°ã€ã³ããïŒ ç»é²...
reduxã«ã¯ãããã®äŸãå¿
èŠã§ãïŒ
@ggginãš@EricSimonsã«åæããŸãããããã®æ©èœã®æ¬æ Œçãªæ¬çª
èªèšŒïŒã¡ãŒã«/ãã¹ãšoAuthãJWTïŒ
ããã°æçš¿ã®CRUDãšããã°æçš¿ãžã®ã³ã¡ã³ã
ãã©ããŒããŠãããŠãŒã¶ãŒ
ãã¹ãŠã®ããã°ã®ã°ããŒãã«ãã£ãŒããšãã©ããŒããŠãããŠãŒã¶ãŒã®ããã°ã®ãã£ãŒã
ã¿ã°ä»ãã·ã¹ãã
ãŠãŒã¶ãŒãããã¡ã€ã«/ãããã¡ã€ã«æ å ±ã®ç·šé
ããã«å ããŠãåºæ¬çãªåœ¹å²ãŸãã¯æš©éã·ã¹ãã ãçŽ æŽãããã§ãããã GitHubã®ããŒã ãŸãã¯Trelloã®ã¡ã³ããŒã«çžåœãããã®
ã¿ãªãããããã«ã¡ã¯
ç§ã¯éå»æ°é±éã®çµéšã«åºã¥ããŠãå
ç¢ãªredux crud api
ç·©ãææ¡ã«åãçµãã§ããŸããã
https://github.com/ppiekarczyk/redux-crud-api-middleware/blob/master/README.md
ã©ããªãã£ãŒãããã¯ããããããã§ãã ããããšãïŒ
ç§ãä»æ§ç¯ããŠããã¢ããªã±ãŒã·ã§ã³ãããªãŒãã³ãœãŒã¹ã®ãµã³ãã«ãããžã§ã¯ãã«å€æããããšãã§ããŸãã
ã¿ãªãããããã«ã¡ã¯ããµã³ãã«ã³ãŒãããŒã¹ã®ã¬ãã¥ãŒã®æºåãã»ãŒæŽã£ãããšããç¥ããããŸãã ããã¯éåžžã«åŸ¹åºçã§ããã®ã¹ã¬ããã§èª¬æããå®éã®ãŠãŒã¹ã±ãŒã¹ã®ã»ãšãã©ïŒèªèšŒãCRUDãããŒãžä»ããªã©ïŒãã«ããŒããŠããŸãã @ vkarpov15ã«ã¯ããã€ãã®ä»äžããå¿ èŠã§ãããæ¥é±ã®æ©ãææã«æºåãæŽãã¯ãã§ãã
ã³ãŒãããŒã¹ã®ã¬ãã¥ãŒã«ãååããã ããã°å¹žãã§ãã @gaearonããæ°ãæåã«èŠãŠãæ§ããªããšèšã£ãŠããããšãç¥ã£ãŠããŸããããã®ã³ãã¥ããã£ããã®ãã£ãŒãããã¯ã¯ã©ããçŽ æŽããããã®ã«ãªãã§ãããã ãã®ãªããžããªãæåã®ã³ãŒãããŒã¹ã«äœ¿çšããã¬ãã¥ãŒãšå埩ãè¡ããæºåãã§ãããæçµçãªãªããžããªãå ¬åŒã®reduxãªããžããªã«ã·ã³ãžã±ãŒãããŸãã ã¹ã¿ãŒ/ãŠã©ããããæ°è»œã«ã©ãããã³ãŒãããŒã¹ããªã³ã©ã€ã³ã«ãªããã¬ãã¥ãŒã®æºåãã§ãããããã®ã¹ã¬ããã«æŽæ°ãæçš¿ããŸãã
ã©ããªè³ªåã«ãåãã§ãçãããŸããçŽ æŽãããè°è«ãããŠãããããã®ã¿ããªã«æè¬ããŸãïŒ
ããã§ããã æºåãã§ããããé¢é£ããReduxFAQã®è³ªåã«èšåãšãªã³ã¯ãè¿œå ããŠãã ããã
çŽæã©ãããã³ãŒãããŒã¹ã¯https://github.com/GoThinkster/redux-reviewã§ã¬ãã¥ãŒããæºåãã§ããŠãããçããã®ãã£ãŒãããã¯ããåŸ ã¡ããŠããŸãã åé¡ãšPRã¯å€§æè¿ã§ãïŒ
ããã¿ããªãçŽ æŽãããè°è«ãšçŽ æŽãããå®äžçã®äŸã眮ããŠãããŠããããšãã
ãã®ãããªäŸã®ãªã¹ãã«è¿œå ããããã«ãç§ã¯ãã®äŸhttps://github.com/andrewngu/sound-reduxã«åºããããŸãããããã¯ã ã§ãã @gaearonã話ããŠããåºæºã«ã
ãããŠæåŸã«ãçŽ æŽãããå®äŸã@EricSimonsã«ç¹ã«æè¬ããŸãã
ç§ã¯å®éã«ã httpïŒ //redux.js.org/docs/faq/Miscellaneous.html#miscellaneous -real-projectsã§ãå®éã®Reactããã³Reduxã¢ããªã®æ°ãæãFAQãšã³ããªãè¿œå ããŸããã ïŒå®éããã®Sound-Reduxã¢ããªã¯ä»¥åã«èŠãããšããããŸããããªã¹ãã«è¿œå ãããšã¯æããŸãããè¿œå ããå¿ èŠããããŸããïŒ
ãå®éã®ãã¢ããªã®æ°ãèãããšãReduxãªããžããªã«çŽæ¥å€§ããªäŸãè¿œå ããå¿ èŠããªããªã£ããšããçç±ã§ããã®åé¡ã解決ããŸããæã瀺ãã 誰ãããªããžããªã«ç¹å®ã®äŸãç©æ¥µçã«æäŸãããå Žåã¯ãäœããèšã£ãŠãã ããããããåéã§ããŸãã
ãããŠãã¯ããè°è«ãšäŸã«è²¢ç®ããŠããããã¹ãŠã®äººã«æè¬ããŸãïŒ
æãåèã«ãªãã³ã¡ã³ã
以äžãåŠçããå ¬åŒã®CRUDã®äŸã欲ããã§ãã
ãããäžå¿ã«ã³ãŒã¹ãäœãããã®ãªããããã¯çŽ æŽãããããšã§ãã ãã ãããµã³ãã«èªäœããã®ãªããžããªã«æäŸãããŠããããšãéèŠã ãšæããŸããããããããšã§ããµã³ãã«ãç¶æããææ°ã®å€æŽãææ°ã®ç¶æ ã«ä¿ã€ããšãã§ããŸãã ãããã£ãŠãæ¢åã®äŸã§äœ¿çšããŠãããã«ãã·ã¹ãã ãšèŠåãšäžèŽããŠããå¿ èŠããããŸãã
ããã¯æå³ããããŸããïŒ