ãã°ã€ã³ã®æå/ãšã©ãŒãããŒãäœæããããšããŠããŸãããç§ã®äž»ãªé¢å¿äºã¯ããã®ããžãã¯ãã©ãã«é 眮ã§ãããã§ãã
çŸåšã actions -> reducer (switch case with action calling API) -> success/error on response triggering another action
ãŸãã
ãã®ã¢ãããŒãã®åé¡ã¯ãAPIåŒã³åºãããã¢ã¯ã·ã§ã³ãåŒã³åºããšãã«ã¬ãã¥ãŒãµãŒãæ©èœããªãããšã§ãã
ç§ã¯äœãã足ããªãã®ã§ããïŒ
ã¬ãã¥ãŒãµãŒ
import { LOGIN_ATTEMPT, LOGGED_FAILED, LOGGED_SUCCESSFULLY } from '../constants/LoginActionTypes';
import Immutable from 'immutable';
import LoginApiCall from '../utils/login-request';
const initialState = new Immutable.Map({
email: '',
password: '',
}).asMutable();
export default function user(state = initialState, action) {
switch (action.type) {
case LOGIN_ATTEMPT:
console.log(action.user);
LoginApiCall.login(action.user);
return state;
case LOGGED_FAILED:
console.log('failed from reducer');
return state;
case LOGGED_SUCCESSFULLY:
console.log('success', action);
console.log('success from reducer');
break;
default:
return state;
}
}
è¡å
import { LOGIN_ATTEMPT, LOGGED_FAILED, LOGGED_SUCCESSFULLY } from '../constants/LoginActionTypes';
export function loginError(error) {
return dispatch => {
dispatch({ error, type: LOGGED_FAILED });
};
}
/*
* Should add the route like parameter in this method
*/
export function loginSuccess(response) {
return dispatch => {
dispatch({ response, type: LOGGED_SUCCESSFULLY });
// router.transitionTo('/dashboard'); // will fire CHANGE_ROUTE in its change handler
};
}
export function loginRequest(email, password) {
const user = {email: email, password: password};
return dispatch => {
dispatch({ user, type: LOGIN_ATTEMPT });
};
}
APIåŒã³åºã
// Use there fetch polyfill
// The main idea is create a helper in order to handle success/error status
import * as LoginActions from '../actions/LoginActions';
const LoginApiCall = {
login(userData) {
fetch('http://localhost/login', {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: userData.email,
password: userData.password,
}),
})
.then(response => {
if (response.status >= 200 && response.status < 300) {
console.log(response);
LoginActions.loginSuccess(response);
} else {
const error = new Error(response.statusText);
error.response = response;
LoginActions.loginError();
throw error;
}
})
.catch(error => { console.log('request failed', error); });
},
};
export default LoginApiCall;
ããã¯ã»ãŒæ£ããã§ãããåé¡ã¯_çŽç²ãªã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãåŒã³åºããŠãäœããèµ·ããããšãæåŸ ããããšã¯ã§ããªã_ãšããããšã§ãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯ããã£ã¹ãããããå¿ èŠããããã®ãæå®ããé¢æ°ã«ãããªãããšãå¿ããªãã§ãã ããã
// CounterActions
export function increment() {
return { type: INCREMENT }
}
// Some other file
import { increment } from './CounterActions';
store.dispatch(increment()); <--- This will work assuming you have a reference to the Store
increment(); <---- THIS DOESN'T DO ANYTHING! You're just calling your function and ignoring result.
// SomeComponent
import { increment } from './CounterActions';
@connect(state => state.counter) // will inject store's dispatch into props
class SomeComponent {
render() {
return <OtherComponent {...bindActionCreators(CounterActions, this.props.dispatch)} />
}
}
// OtherComponent
class OtherComponent {
handleClick() {
// this is correct:
this.props.increment(); // <---- it was bound to dispatch in SomeComponent
// THIS DOESN'T DO ANYTHING:
CounterActions.increment(); // <---- it's just your functions as is! it's not bound to the Store.
}
}
ããã§ã¯ãããªãã®äŸãèŠãŠã¿ãŸãããã æåã«æ確ã«ããŠããããã®ã¯ãåäžã®ã¢ã¯ã·ã§ã³ãåæçã«ãã£ã¹ãããããã ãã§å¯äœçšããªãå Žåã¯ãéåædispatch => {}
ãã©ãŒã ã¯å¿
èŠãªããšããããšã§ãïŒ loginError
ãšloginRequest
å Žåã¯trueïŒ
ãã®ïŒ
import { LOGIN_ATTEMPT, LOGGED_FAILED, LOGGED_SUCCESSFULLY } from '../constants/LoginActionTypes';
export function loginError(error) {
return dispatch => {
dispatch({ error, type: LOGGED_FAILED });
};
}
export function loginSuccess(response) {
return dispatch => {
dispatch({ response, type: LOGGED_SUCCESSFULLY });
// router.transitionTo('/dashboard');
};
}
export function loginRequest(email, password) {
const user = {email: email, password: password};
return dispatch => {
dispatch({ user, type: LOGIN_ATTEMPT });
};
}
次ã®ããã«ç°¡ç¥åã§ããŸã
import { LOGIN_ATTEMPT, LOGGED_FAILED, LOGGED_SUCCESSFULLY } from '../constants/LoginActionTypes';
export function loginError(error) {
return { error, type: LOGGED_FAILED };
}
// You'll have a side effect here so (dispatch) => {} form is a good idea
export function loginSuccess(response) {
return dispatch => {
dispatch({ response, type: LOGGED_SUCCESSFULLY });
// router.transitionTo('/dashboard');
};
}
export function loginRequest(email, password) {
const user = {email: email, password: password};
return { user, type: LOGIN_ATTEMPT };
}
第äºã«ãããªãã®ã¬ãã¥ãŒãµãŒã¯_å¯äœçšã®ãªãçŽç²é¢æ°_ã§ããã¯ãã§ãã ã¬ãã¥ãŒãµãŒããAPIãåŒã³åºãããšããªãã§ãã ããã
ãã®ïŒ
const initialState = new Immutable.Map({
email: '',
password: '',
isLoggingIn: false,
isLoggedIn: false,
error: null
}).asMutable(); // <---------------------- why asMutable?
export default function user(state = initialState, action) {
switch (action.type) {
case LOGIN_ATTEMPT:
console.log(action.user);
LoginApiCall.login(action.user); // <------------------------ no side effects in reducers! :-(
return state;
case LOGGED_FAILED:
console.log('failed from reducer');
return state;
case LOGGED_SUCCESSFULLY:
console.log('success', action);
console.log('success from reducer');
break;
default:
return state;
}
ãããããã£ãšäŒŒãŠããã¯ãã§ã
const initialState = new Immutable.Map({
email: '',
password: '',
isLoggingIn: false,
isLoggedIn: false,
error: null
});
export default function user(state = initialState, action) {
switch (action.type) {
case LOGIN_ATTEMPT:
return state.merge({
isLoggingIn: true,
isLoggedIn: false,
email: action.email,
password: action.password // Note you shouldn't store user's password in real apps
});
case LOGGED_FAILED:
return state.merge({
error: action.error,
isLoggingIn: false,
isLoggedIn: false
});
case LOGGED_SUCCESSFULLY:
return state.merge({
error: null,
isLoggingIn: false,
isLoggedIn: true
});
break;
default:
return state;
}
æåŸã«ããã°ã€ã³APIåŒã³åºããã©ãã«çœ®ããŸããïŒ
ããã¯ãŸãã«dispatch => {}
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ç®çã§ãã å¯äœçšïŒ
ããã¯åãªãå¥ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãã ä»ã®ã¢ã¯ã·ã§ã³ãšçµã¿åãããŠãã ããïŒ
import { LOGIN_ATTEMPT, LOGGED_FAILED, LOGGED_SUCCESSFULLY } from '../constants/LoginActionTypes';
export function loginError(error) {
return { error, type: LOGGED_FAILED };
}
export function loginSuccess(response) {
return dispatch => {
dispatch({ response, type: LOGGED_SUCCESSFULLY });
router.transitionTo('/dashboard');
};
}
export function loginRequest(email, password) {
const user = {email: email, password: password};
return { user, type: LOGIN_ATTEMPT };
}
export function login(userData) {
return dispatch =>
fetch('http://localhost/login', {
method: 'post',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
email: userData.email,
password: userData.password,
}),
})
.then(response => {
if (response.status >= 200 && response.status < 300) {
console.log(response);
dispatch(loginSuccess(response));
} else {
const error = new Error(response.statusText);
error.response = response;
dispatch(loginError(error));
throw error;
}
})
.catch(error => { console.log('request failed', error); });
}
ã³ã³ããŒãã³ãã§ã
this.props.login(); // assuming it was bound with bindActionCreators before
// --or--
this.props.dispatch(login()); // assuming you only have dispatch from Connector
æåŸã«ããã®ãããªå€§èŠæš¡ãªã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãé »ç¹ã«äœæããå Žåã¯ãpromiseãšäºææ§ã®ããéåæåŒã³åºãçšã®ã«ã¹ã¿ã ããã«ãŠã§ã¢ãäœæããããšããå§ãããŸãã
äžèšã§èª¬æããææ³ïŒ dispatch => {}
眲åãæã€ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒïŒã¯çŸåšReduxã«å«ãŸããŠããŸããã1.0ã§ã¯redux-thunkãšåŒã°ããåå¥ã®ããã±ãŒãžãšããŠã®ã¿å©çšå¯èœã«ãªããŸãã ããªãããããããŠããéãããªãã¯redux-promise-middlewareãŸãã¯redux-promiseããã§ãã¯ããã»ããããã§ãããã
@gaearon ïŒclapïŒããã¯çŽ æŽããã説æã§ããïŒ ;ïŒããã¯ééããªãããã¥ã¡ã³ãã«å«ãŸããã¯ãã§ãã
@gaearonçŽ æŽããã説æïŒ ïŒãããã£ãŒïŒ
@gaearonã©ã®APIåŒã³åºããåŒã³åºããã決å®ããããã«ããžãã¯ãå®è¡ããå¿ èŠãããå Žåã¯ã©ããªããŸããïŒ äžç®æïŒã¬ãã¥ãŒãµãŒïŒã«ããã¹ãã¯ãã¡ã€ã³ããžãã¯ã§ã¯ãªãã§ããïŒ ãããActionã¯ãªãšãŒã¿ãŒã«ç¶æããããšã¯ãä¿¡é Œã§ããå¯äžã®æ å ±æºãå£ãããã«ç§ã«ã¯èãããŸãã ããã«ãã»ãšãã©ã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ããã®å€ã«ãã£ãŠAPIåŒã³åºãããã©ã¡ãŒã¿ãŒåããå¿ èŠããããŸãã ãããããäœããã®æ¹æ³ã§ããžãã¯ããã¹ãããããšãã§ããŸãã ã¬ãã¥ãŒãµãŒïŒã¢ãããã¯ãã©ãã¯ã¹ïŒã§APIåŒã³åºããè¡ãããšã¯ã倧èŠæš¡ãããžã§ã¯ãã§éåžžã«åœ¹ç«ã¡ããã¹ãå¯èœã§ããããšãããããŸããã
ã¬ãã¥ãŒãµãŒïŒã¢ãããã¯ãã©ãã¯ã¹ïŒã§APIåŒã³åºããè¡ãããšã¯ã倧èŠæš¡ãããžã§ã¯ãã§éåžžã«åœ¹ç«ã¡ããã¹ãå¯èœã§ããããšãããããŸããã
ããã¯èšé²/åçãå£ããŸãã å¯äœçšã®ããé¢æ°ã¯ãå®çŸ©äžãçŽç²é¢æ°ããããã¹ããå°é£ã§ãã ãã®ããã«Reduxã䜿çšã§ããŸããããã®èšèšã«ã¯å®å šã«åããŠããŸãã :-)
ãããActionã¯ãªãšãŒã¿ãŒã«ç¶æããããšã¯ãä¿¡é Œã§ããå¯äžã®æ å ±æºãå£ãããã«ç§ã«ã¯èãããŸãã
ãä¿¡é Œã§ããå¯äžã®æ å ±æºããšã¯ãããŒã¿ã1ã€ã®å Žæã«ååšããç¬ç«ããã³ããŒããªãããšãæå³ã
ã©ã®APIåŒã³åºããåŒã³åºããã決å®ããããã«äœããã®ããžãã¯ãå®è¡ããå¿ èŠãããå Žåã¯ã©ããªããŸããïŒ äžç®æïŒã¬ãã¥ãŒãµãŒïŒã«ããã¹ãã¯ãã¡ã€ã³ããžãã¯ã§ã¯ãªãã§ããïŒ
ã¬ãã¥ãŒãµãŒã¯ãã¢ã¯ã·ã§ã³ã«ãã£ãŠç¶æ ãã©ã®ããã«å€æãããããæå®ããŸãã ãããã®ã¢ã¯ã·ã§ã³ãã©ãããçºçãããã«ã€ããŠå¿é ããå¿ èŠã¯ãããŸããã ãããã¯ãã³ã³ããŒãã³ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãèšé²ãããã·ãªã¢ã«åãããã»ãã·ã§ã³ãªã©ããçºçããå¯èœæ§ããããŸããããã¯ãã¢ã¯ã·ã§ã³ã䜿çšãããšããæŠå¿µã®çŸããã§ãã
APIåŒã³åºãïŒãŸãã¯åŒã³åºãããAPIã決å®ããããžãã¯ïŒã¯ãã¬ãã¥ãŒãµãŒã®åã«è¡ãããŸãã ããããReduxãããã«ãŠã§ã¢ããµããŒãããŠããçç±ã§ãã äžèšã®ãµã³ã¯ããã«ãŠã§ã¢ã䜿çšãããšãæ¡ä»¶ã䜿çšããããç¶æ ããèªã¿åãããšãã§ããŸãã
// Simple pure action creator
function loginFailure(error) {
return { type: LOGIN_FAILURE, error };
}
// Another simple pure action creator
function loginSuccess(userId) {
return { type: LOGIN_SUCCESS, userId };
}
// Another simple pure action creator
function logout() {
return { type: LOGOUT };
}
// Side effect: uses thunk middleware
function login() {
return dispatch => {
MyAwesomeAPI.performLogin().then(
json => dispatch(loginSuccess(json.userId)),
error => dispatch(loginFailure(error))
)
};
}
// Side effect *and* reads state
function toggleLoginState() {
return (dispatch, getState) => {
const { isLoggedIn } = getState().loginState;
if (isLoggedIn) {
dispatch(login());
} else {
dispatch(logout());
}
};
}
// Component
this.props.toggleLoginState(); // Doesn't care how it happens
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšããã«ãŠã§ã¢ã¯ãå¯äœçšãå®è¡ããçžäºã«è£å®ããããã«_èšèš_ãããŠããŸãã
ã¬ãã¥ãŒãµãŒã¯åãªãã¹ããŒããã·ã³ã§ãããéåæãšã¯äœã®é¢ä¿ããããŸããã
ã¬ãã¥ãŒãµãŒã¯ãã¢ã¯ã·ã§ã³ã«ãã£ãŠç¶æ ãã©ã®ããã«å€æãããããæå®ããŸãã
ããã¯ç¢ºãã«éåžžã«æå¹ãªãã€ã³ãã§ããããããšãã
ãã®ããŒãžã§ã³ãããã¥ã¡ã³ãã«æ²èŒããããŸã§ãåŸäžã®ããã«åéããŸãã
ïŒ+1ïŒ
ã¬ãã¥ãŒãµãŒã¯ã¹ããŒããã·ã³ã§ãããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã¯äžè¬çã«ïŒãã ãæé»çã«ïŒããã§ãã
ãŠãŒã¶ãŒããéä¿¡ããã¿ã³ã2åã¯ãªãã¯ãããšããŸãã åããŠHTTPãªã¯ãšã¹ãããµãŒããŒïŒã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒå ïŒã«éä¿¡ããç¶æ ããéä¿¡äžãïŒã¬ãã¥ãŒãµãŒå ïŒã«å€æŽããŸãã äºåºŠç®ã¯ãããããããªãã
çŸåšã®ã¢ãã«ã§ã¯ãã¢ã¯ã·ã§ã³ã®äœæè ã¯ãçŸåšã®ç¶æ ã«å¿ããŠãã£ã¹ãããããã¢ã¯ã·ã§ã³ãéžæããå¿ èŠããããŸãã çŸåšãéä¿¡ãããŠããªãå Žåã¯ãHTTPãªã¯ãšã¹ããéä¿¡ãã1ã€ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããŸãããã以å€ã®å Žåã¯ãäœãããªãããå¥ã®ã¢ã¯ã·ã§ã³ïŒèŠåãªã©ïŒããã£ã¹ãããããŸãã
ãããã£ãŠãå¶åŸ¡ãããŒã¯äºå®äž2ã€ã®ã¹ããŒããã·ã³ã«åå²ããããã®ãã¡ã®1ã€ã¯æé»çã§ãå¯äœçšã«æºã¡ãŠããŸãã
ãã®Fluxã¢ãããŒãã¯ãäžè¬çãªWebã¢ããªã®ãŠãŒã¹ã±ãŒã¹ã®å€§éšåãéåžžã«ããŸãåŠçããŠãããšæããŸãã ãã ããè€éãªå¶åŸ¡ããžãã¯ãããå Žåã¯ãåé¡ãçºçããå¯èœæ§ããããŸãã æ¢åã®ãã¹ãŠã®äŸã«ã¯è€éãªå¶åŸ¡ããžãã¯ããªãããããã®åé¡ã¯ããé ãããŠããŸãã
https://github.com/Day8/re-frameã¯ãå¯äžã®FSMãšããŠæ©èœããåäžã®ã€ãã³ããã³ãã©ãŒãæã€ããŸããŸãªã¢ãããŒãã®äŸã§ãã
ããããã¬ãã¥ãŒãµãŒã«ã¯å¯äœçšããããŸãã ãããã£ãŠããã®ãããªå Žåã«ãåçãæ©èœãã©ã®ããã«åŠçãããã¯èå³æ·±ãã§ã-httpsïŒ//github.com/Day8/re-frame/issues/86ã§è³ªåããŸãã
äžè¬çã«ãããã¯æ¬åœã®åé¡ã ãšæããŸããäœåºŠãäœåºŠãçŸããã®ã¯åœç¶ã®ããšã§ãã æçµçã«ã©ã®ãããªè§£æ±ºçãçŸããããèŠãã®ã¯èå³æ·±ãããšã§ãã
ãªãã¬ãŒã ãšå¯äœçšã«ã€ããŠæçš¿ããŠãã ããïŒ
ç§ã®æ¬ã§ã¯ããŸãšããªReduxWebã¢ããªã«ã¯3ã€ã®ç¶æ ã¿ã€ãããããŸãã
1ïŒã³ã³ããŒãã³ãã衚瀺ããŸãïŒthis.stateã«åå¿ããŸãïŒã ããã¯é¿ããã¹ãã§ãããReduxãšã¯å¥ã«ã³ã³ããŒãã³ããåå©çšããã ãã§åå©çšã§ããåäœãå®è£ ãããå ŽåããããŸãã
2ïŒã¢ããªã®å ±æç¶æ ãã€ãŸãRedux.stateã ããã¯ããã¥ãŒã¬ã€ã€ãŒããŠãŒã¶ãŒã«ã¢ããªãæ瀺ããããã«äœ¿çšããŠããç¶æ ã§ããããã¥ãŒã³ã³ããŒãã³ãã¯ããã䜿çšããŠçžäºã«ãéä¿¡ãããŸãã ãŸãããã®ç¶æ ã¯ãActionCreatorãããã«ãŠã§ã¢ããã¥ãŒã®éã§ãéä¿¡ãããããã«äœ¿çšã§ããŸãããããã®æ±ºå®ã¯ããã®ç¶æ ã«äŸåããå¯èœæ§ãããããã§ãã ãããã£ãŠããå ±æããéèŠã§ãã ãã ããå®å šãªã¢ããªã®ç¶æ ã§ããå¿ èŠã¯ãããŸããã ãŸãã¯ããã¹ãŠããã®ã¿ã€ãã®ç¶æ ãšããŠïŒã¢ã¯ã·ã§ã³ã®èŠ³ç¹ããïŒå®è£ ããããšã¯éçŸå®çã ãšæããŸãã
3ïŒä»ã®å¯äœçšã®ããè€éãªã¢ãžã¥ãŒã«/ã©ã€ãã©ãª/ãµãŒãã¹ã«ãã£ãŠä¿æãããŠããç¶æ ã vladarã説æããŠããã·ããªãªãåŠçããããã«ããããèšè¿°ããŸãã ãŸãã¯ãreact-routerã¯å¥ã®äŸã§ãã ç¬èªã®ç¶æ ãæã€ãã©ãã¯ããã¯ã¹ãšããŠæ±ãããšããreact-routerç¶æ ã®äžéšãã¢ããªå ±æç¶æ ïŒRedux.stateïŒã«äžããããšãã§ããŸãã ãã¹ãŠã®ãªã¯ãšã¹ããšãã®ã¿ã€ãã³ã°ãå·§ã¿ã«åŠçããè€éãªHTTPã¢ãžã¥ãŒã«ãäœæããå ŽåãéåžžãRedux.stateã®ãªã¯ãšã¹ãã¿ã€ãã³ã°ã®è©³çŽ°ã«ã¯é¢å¿ããããŸããã ç§ã¯ActionCreators / Middlewareãããã®ã¢ãžã¥ãŒã«ã䜿çšããã ãã§ãããããRedux.stateãšäžç·ã«äœ¿çšããŠæ°ããRedux.stateãååŸããŸãã
ãªã¯ãšã¹ãã®ã¿ã€ãã³ã°ã瀺ããã¥ãŒã³ã³ããŒãã³ããäœæãããå Žåã¯ããã®ç¶æ ãRedux.stateã«ããå¿ èŠããããŸãã
@vladar AC / MWãæé»ã®ã¹ããŒããã·ã³ã§ãããšããããšã§ããïŒ ããã¯ãããèªäœã¯ç¶æ ãä¿æããŠããŸããããããã§ãã©ããå¥ã®å Žæã«ä¿æãããŠããç¶æ ã«äŸåããŠããããã®ç¶æ ãæéãšãšãã«ã©ã®ããã«é²åããããå¶åŸ¡ããžãã¯ãå®çŸ©ã§ããããã§ããïŒ å Žåã«ãã£ãŠã¯ãã¯ããŒãžã£ãšããŠå®è£ ããŠç¬èªã®ç¶æ ãä¿æããæ瀺çãªã¹ããŒããã·ã³ã«ãªãå¯èœæ§ããããšæããŸããïŒ
ãããã¯ãRedux.stateãããããªãã¯ç¶æ ããšåŒã³ãä»ã®ç¶æ ã¯ãã©ã€ããŒããšåŒã¶ããšãã§ããŸãã ç§ã®ã¢ããªãã©ã®ããã«èšèšãããã¯ãäœããã©ã€ããŒãç¶æ ãšããŠãäœããããªãã¯ç¶æ ãšããŠä¿æãããã決å®ããè¡çºã§ãã ã«ãã»ã«åã®è¯ãæ©äŒã®ããã«æããŸãããããã£ãŠãç¶æ ãäºãã«ã©ã®ããã«åœ±é¿ããããå°çã«ãªããªãéããç¶æ ãç°ãªãå Žæã«åå²ããããšã¯åé¡ãªããšæããŸãã
@vladar
ããããã¬ãã¥ãŒãµãŒã«ã¯å¯äœçšããããŸãã ãã®ãããªå Žåã«åœŒããããªãã¬ã€ãæ©èœãã©ã®ããã«æ±ããã¯èå³æ·±ãã§ã
ç°¡åãªåçãå®çŸããã«ã¯ãã³ãŒãã決å®è«çã«ããå¿ èŠããããŸãã ããã¯ãReduxãçŽç²ãªã¬ãã¥ãŒãµãŒãèŠæ±ããããšã«ãã£ãŠéæããããšã§ãã äºå®äžãRedux.stateã¯ã¢ããªãé決å®è«çïŒéåæïŒéšåãšæ±ºå®è«çéšåã«åå²ããŸãã ãã¥ãŒã³ã³ããŒãã³ãã§ã¯ã¬ã€ãžãŒãªããšãããªããšä»®å®ããŠãRedux.stateã®äžã§åäœãåçã§ããŸãã 決å®è«çã³ãŒããå®çŸããããã®æåã®éèŠãªç®æšã¯ãéåæã³ãŒãã移åããã¢ã¯ã·ã§ã³ãã°ãä»ããŠåæã³ãŒãã«å€æããããšã§ãã ããã¯ãFluxã¢ãŒããã¯ãã£ãäžè¬çã«è¡ãããšã§ãã ããããäžè¬çã«ããã¯ååã§ã¯ãªããä»ã®å¯äœçšãŸãã¯å€åããã³ãŒãã¯äŸç¶ãšããŠæ±ºå®è«çåŠçãå£ãå¯èœæ§ããããŸãã
å¯äœçšã®ããã¬ãã¥ãŒãµãŒã䜿çšããŠåçå¯èœæ§ãå®çŸããããšã¯ãéçŸå®çã«å°é£ã§ããããäžå¯èœã§ãããããããŸãã¯å€ãã®ã³ãŒããŒã±ãŒã¹ã§éšåçã«ããæ©èœãããããããã»ãšãã©å®çšçãªå¹æã¯ãããŸããã
ã¿ã€ã ãã©ãã«ãç°¡åã«ããããã«ãReduxã§è¡ãããããã«ã¢ã¯ã·ã§ã³ãåçããã®ã§ã¯ãªãïŒåžžã«é£ããïŒãã¢ããªã®ç¶æ ã®ã¹ãããã·ã§ãããä¿åããŸãã
ã¿ã€ã ãã©ãã«ãç°¡åã«ããããã«ãReduxã§è¡ãããããã«ã¢ã¯ã·ã§ã³ãåçããã®ã§ã¯ãªãïŒåžžã«é£ããïŒãã¢ããªã®ç¶æ ã®ã¹ãããã·ã§ãããä¿åããŸãã
Redux DevToolsã¯ãã¹ãããã·ã§ãããšã¢ã¯ã·ã§ã³ã®äž¡æ¹ãä¿åããŸãã ã¢ã¯ã·ã§ã³ããªãå Žåãã¬ãã¥ãŒãµãŒãããããªããŒãããããšã¯ã§ããŸããã ããã¯ãDevToolsãæå¹ã«ããã¯ãŒã¯ãããŒã®æã匷åãªæ©èœã§ãã
ã¿ã€ã ãã©ãã«ã¯ã_ãã£ã¹ããããããïŒæçµçãªïŒçã®ã¢ã¯ã·ã§ã³ã®ã¬ãã«ã§çºçãã_ãããäžçŽãªã¢ã¯ã·ã§ã³äœæè ã«ã¯åé¡ãªãæ©èœããŸãã ãããã¯ãã¬ãŒã³ãªããžã§ã¯ãã§ãããããå®å šã«æ±ºå®è«çã§ãã ã¯ããAPIåŒã³åºãããããŒã«ããã¯ãããããšã¯ã§ããŸããããåé¡ã¯ãããŸããã ããã«ãã£ãŠçºè¡ãããçã®ã¢ã¯ã·ã§ã³ãããŒã«ããã¯ã§ããŸãã
ããã¯ãããèªäœã¯ç¶æ ãä¿æããŠããŸããããããã§ãã©ããå¥ã®å Žæã«ä¿æãããŠããç¶æ ã«äŸåããŠããããã®ç¶æ ãæéãšãšãã«ã©ã®ããã«é²åããããå¶åŸ¡ããžãã¯ãå®çŸ©ã§ããããã§ããïŒ
ãããããã¯ãŸãã«ç§ãæå³ããããšã§ãã ãã ããå¶åŸ¡ããžãã¯ãéè€ããå¯èœæ§ããããŸãã åé¡ã瀺ãããã®ããã€ãã®ã³ãŒãïŒäžèšã®äŸããããã«ãµããããã¯ãªãã¯ïŒã
function submit(data) {
return (dispatch, getState) => {
const { isSubmitting } = getState().isSubmitting;
if (!isSubmitting) {
dispatch(started(data));
MyAPI.submit(data).then(
json => dispatch(success(json)),
error => dispatch(failure(error))
)
}
}
}
function started(data) {
return { type: SUBMIT_STARTED, data };
}
function success(result) {
return { type: SUBMIT_SUCCESS, result };
}
function failure(error) {
return { type: SUBMIT_FAILURE, error };
}
ãããŠããisSubmittingãç¶æ ãå床ãã§ãã¯ããããã®ã¬ãã¥ãŒãµãŒããããŸã
const initialState = new Immutable.Map({
isSubmitting: false,
pendingData: null,
error: null
});
export default function form(state = initialState, action) {
switch (action.type) {
case SUBMIT_STARTED:
if (!state.isSubmitting) {
return state.merge({
isSubmitting: true,
pendingData: action.data
});
} else {
return state;
}
}
}
ãããã£ãŠã2ã€ã®å Žæã§åãè«çãã§ãã¯ãè¡ãããšã«ãªããŸãã æããã«ããã®äŸã§ã®éè€ã¯æå°éã§ãããããè€éãªã·ããªãªã§ã¯ããããã«ãªããªãå ŽåããããŸãã
æåŸã®äŸã§ã¯ããã§ãã¯ã¯ã¬ãã¥ãŒãµãŒã®å éšã«ããã¹ãã§ã¯ãªããšæããŸãã ããããªããšãããã«äžæŽåã«é¥ãå¯èœæ§ããããŸãïŒããšãã°ãã¢ã¯ã·ã§ã³ã¯èª€ã£ãŠãã£ã¹ããããããŸããç¡èŠãããŸããããæåãã¢ã¯ã·ã§ã³ããã£ã¹ããããããŸãããäºæãããç¶æ ãæ£ããããŒãžãããªãå¯èœæ§ããããŸãïŒã
ïŒãããããªããèšã£ãŠãããã€ã³ãã ã£ãå Žåã¯ç³ãèš³ãããŸãã;-)
ïŒisSubmittingã¯ãSUBMIT_STARTEDã¢ã¯ã·ã§ã³ããã£ã¹ãããããããšããäºå®ã§ãã§ã«ãšã³ã³ãŒããããŠãããããgaeronã«åæããŸãã ã¢ã¯ã·ã§ã³ãäœããã®ããžãã¯ã®çµæã§ããå Žåããã®ããžãã¯ã¯ã¬ãã¥ãŒãµãŒã§è€è£œãããã¹ãã§ã¯ãããŸããã ãã®å Žåãã¬ãã¥ãŒãµãŒã®è²¬ä»»ã¯ãSUBMIT_STARTEDãåä¿¡ãããšãã«ãä»ã®èª°ãããã®SUBMIT_STARTEDã決å®ãã責任ãè² ã£ãŠãããããã¢ã¯ã·ã§ã³ãã€ããŒãã§ç¶æ ãèæ ®ãããæŽæ°ããããšã§ãã
åäžã®æ±ºå®ã«è²¬ä»»ãè² ãåäžã®ãã®ãããããšãåžžã«ç®æãå¿ èŠããããŸãã
ãã®åŸãReducerã¯SUBMIT_STARTEDãã¡ã¯ããããã«æ§ç¯ããè¿œå ã®ããžãã¯ã§æ¡åŒµã§ããŸããããã®ããžãã¯ã¯ç°ãªãå¿ èŠããããŸãã FeïŒ
case SUBMIT_STARTED:
if (goodMood) loading...
else nothing_happens
誰ãäœã«å¯ŸããŠè²¬ä»»ãè² ãã¹ããã決ããã®ã¯é£ããå Žåããããšæ³åã§ããŸãã ActionCreatorãããã«ãŠã§ã¢ãã¹ã¿ã³ãã¢ãã³ã®è€éãªã¢ãžã¥ãŒã«ãã¬ãã¥ãŒãµãŒïŒ
ã¬ãã¥ãŒãµãŒã¯ããããªããŒãã§ããã®ã§ãçŽç²ã«ä¿ã¡ãªãããã§ããã ãå€ãã®æ±ºå®ãäžãããšãç®æããŸãã å¯äœçš/éåæã®æ±ºå®ãå¿ èŠãªå Žåã¯ãAC / MW / somewhere_elseã«ç§»åããŸãã ãŸããã³ãŒãã®åå©çšã«é¢ãããã¹ããã©ã¯ãã£ã¹ãã€ãŸãã¬ãã¥ãŒãµãŒãšããã«ãŠã§ã¢ãã©ã®ããã«é²åãããã«ãäŸåããŸãã
ACã¯state.isSubmittingãçŽæ¥å€æŽã§ããŸããã ãããã£ãŠããã®ããžãã¯ãããã«äŸåããŠããå ŽåãACã¯state.isSubmittingããã®ããžãã¯ãšåæããããšãä¿èšŒããå¿ èŠããããŸãã ACããžãã¯ãstate.isSubmittedãæ°ããããŒã¿ã§trueã«èšå®ããèªã¿åããæ»ã£ãå Žåããã®ããã«èšå®ãããŠããããšãæåŸ ããŸãã ä»ã®è«çã«ãã£ãŠãã®åæãå€ããå¯èœæ§ãããã¹ãã§ã¯ãããŸããã ACTIONã¯åæããªããã£ãèªäœã§ãã åºæ¬çã«ãã¢ã¯ã·ã§ã³ã¯ãããã³ã«ãå®çŸ©ãããããã³ã«ã¯æ確ã«å®çŸ©ãããŠããå¿ èŠããããŸãã
ããããç§ã¯ããªããäœãèšãããšããŠããã®ãç¥ã£ãŠãããšæããŸãã Redux.stateã¯å ±æç¶æ ã§ãã å ±æç¶æ ã¯åžžã«æ³šæãå¿ èŠã§ãã ACããžãã¯ã§ã¯äºæããªãæ¹æ³ã§ç¶æ ãå€æŽããã¬ãã¥ãŒãµãŒã§ã³ãŒããæžãã®ã¯ç°¡åã§ãã ãããã£ãŠãããã€ãã®éåžžã«è€éãªã·ããªãªã§ã¯ãACãšæžéæ©ã®éã®ããžãã¯ãåæãããã®ãé£ããå Žåããããšæ³åã§ããŸãã ããã«ããããã°ã®è¿œè·¡ãšãããã°ãå°é£ã«ãªãå¯èœæ§ããããŸãã ãã®ãããªã·ããªãªã§ã¯ãããžãã¯ãAC /ããã«ãŠã§ã¢ã«éçŽããããžãã¯ããªããã»ãšãã©ãªãæ確ã«å®çŸ©ãããã¢ã¯ã·ã§ã³ã«åºã¥ããŠã¬ãã¥ãŒãµãŒãæãã«åäœãããããšãåžžã«å¯èœã§ãããšç§ã¯ä¿¡ããŠããŸãã
誰ãããã€ã§ãæ°ããã¬ãã¥ãŒãµãŒãè¿œå ããŠãå€ãäŸåACãå£ãããšãã§ããŸãã ACãRedux.stateã«äŸåãããåã«ãããèããŠããå¿ èŠããããŸãã
ãŠãŒã¶ãŒè³æ Œæ å ±ã䜿çšããŠAPIãªã¯ãšã¹ãã«ãã£ãŠè¿ãããèªèšŒããŒã¯ã³ãå¿ èŠãšããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãããŸãã ãã®ããŒã¯ã³ã«ã¯æéå¶éããããäœãã«ãã£ãŠæŽæ°ããã³ç®¡çããå¿ èŠããããŸãã ããªããææ¡ããŠããããšã¯ããã®ç¶æ ãRedux.stateã«å±ããŠããªãããšã瀺ããŠããããã§ããïŒ
ã©ãã«è¡ãã°ããã®ïŒ æŠå¿µçã«ã¯ãäžå€ã®å€éšç¶æ ãšããŠReduxã¹ãã¢ã®ã³ã³ã¹ãã©ã¯ã¿ãŒã«æž¡ãããŸããïŒ
ãããã£ãŠãããã€ãã®éåžžã«è€éãªã·ããªãªã§ã¯ãACãšæžéæ©ã®éã®ããžãã¯ãåæãããã®ãé£ããå Žåããããšæ³åã§ããŸãã
ããã ãããã·ã§ãŒã¹ããããŒã ãšèšã£ãŠããã®ã§ã¯ãããŸããããäžè²«æ§ããªããªãå¯èœæ§ããããŸãã ã¹ããŒããã·ã³ã®ãã€ã³ãã¯ãã€ãã³ãã®åºçŸé åºã«é¢ä¿ãªããã€ãã³ãã«åå¿ããäžè²«æ§ãä¿ã€ããšã§ãã
ACããã®ã€ãã³ãã®é©åãªé åºã«äŸåããŠããå Žåã¯ãç¶æ ãšã³ãžã³ã®äžéšãæé»çã«ACã«ç§»åãããããã¬ãã¥ãŒãµãŒãšçµåããã ãã§ãã
ãã¶ãããã¯å¥œã¿ã®åé¡ãããããŸããããã¹ãã¢/ã¬ãã¥ãŒãµãŒãåžžã«äžè²«ããŠåäœããã©ããã§äžè²«æ§ãä¿ã€ããã«å€éšã®ãã®ã«äŸåããªããšããç§ã¯ã¯ããã«æ°åãè¯ããªããŸãã
ACãRedux.stateã«äŸåãããåã«ãããèããŠããå¿ èŠããããŸãã
è€éãªã±ãŒã¹ã§ã¯ïŒããã€ãã®å¯äœçšãã¬ãã¥ãŒãµãŒ/ã€ãã³ããã³ãã©ãŒã«ç§»åããã«ïŒåé¿ããããšã¯ã§ããªããšæããŸãã
ãããããªããŒããŸãã¯ãªãã¬ã€æ©èœã®åé€ããšãç¶æ ã®1ãæã§ã®ç®¡çããšãããã¬ãŒããªãã®ããã§ãã åŸã®å Žåããªãã¬ãŒã ææ¡ã®ããã«å®éã®FSMãŸãã¯ã¹ããŒããã£ãŒããäœæã§ããŸããåã®å Žåã¯ãçŸåšFluxã«ãããããªã¢ãããã¯ãªå¶åŸ¡ããžãã¯ã§ãã
ç§ã¯ãªãã¬ãŒã ãïŒéãããŠïŒèªã¿ãŸããããããã¯Reduxãšåãçš®é¡ã®ãã®ã§ãããå®è£ ã®è©³çŽ°ãããã€ãç°ãªããŸãã ãªãã¬ãŒã ãã¥ãŒã³ã³ããŒãã³ãã¯ãªãã¶ãŒããã«ã«åºã¥ããŠãããã€ãã³ãã¯ã¢ã¯ã·ã§ã³ã§ãããªãã¬ãŒã ã¯ãã¯ãªãšãŒã¿ãŒã䜿çšããã«ã€ãã³ãïŒã¢ã¯ã·ã§ã³ïŒããªããžã§ã¯ããšããŠçŽæ¥ãã£ã¹ãããããŸãïŒãã¥ãŒã³ã³ããŒãã³ãã§æ§ç¯ãããŸãïŒãã€ãã³ããã³ãã©ãŒã¯çŽç²ã§ãReduxãšåããã®ã§ããã¬ãã¥ãŒãµãŒã
å¯äœçšã®åŠçã«ã€ããŠã¯ããŸãè°è«ãããŠããªãããèŠéããŠããŸããããããã«ãŠã§ã¢ã§åŠçãããŠãããšæããŸãã ãããŠãäž»ãªéãããããŸãã ããã«ãŠã§ã¢ã¯ã€ãã³ããã³ãã©ãŒïŒã¬ãã¥ãŒãµãŒïŒãã©ããããå€éšãããããã䜿çšããŠæ§æããŸãããReduxããã«ãŠã§ã¢ã¯ã¬ãã¥ãŒãµãŒãã©ããããŸããã èšãæããã°ãRe-frameã¯çŽç²ãªã¬ãã¥ãŒãµãŒã«çŽæ¥å¯äœçšããããããReduxã¯ããããåé¢ãããŸãŸã«ããŸãã
ããã¯ããªãã¬ãŒã ã€ãã³ããèšé²ããŠç°¡åã«åçããããšãã§ããªãããšãæå³ããŸãã
èããããäžæŽåã«ã€ããŠè©±ããŠãããšããç§ã¯å ±æç¶æ ãæ ¹æ¬åå ãšèãããªãã¬ãŒã ã«ãåããªã¹ã¯ããããšæããŸãã
éãã¯ãããã«ãŠã§ã¢ãšã¬ãã¥ãŒãµãŒã®çµåã«ãããŸãã ããã«ãŠã§ã¢ããªãã¬ãŒã ã§çµäºãããšãçµæãã€ãã³ããã³ãã©ãŒïŒã¬ãã¥ãŒãµãŒïŒã«çŽæ¥æž¡ããŸãããã®çµæã¯ã€ãã³ã/ã¢ã¯ã·ã§ã³ãšããŠèšé²ãããªããããåçã§ããŸããã Reduxã¯ã¢ã¯ã·ã§ã³ã®åœ¢ã§ä»£ããã«ããã¯ãéã«çœ®ãã ãã ãšæããŸãããããã£ãŠãã¿ã€ãã³ã°ïŒã¢ã¯ã·ã§ã³ã®äœæïŒãå¢ãããããããããå®è¡ããäœå°ãå¢ãã代ããã«ãRe-frameãšåãæè¡ãæè¡çã«éæã§ãããšæããŸããéãã
çµå±ãReduxãRe-frameãšãŸã£ããåãã¢ãããŒããå®è£ ããã®ã劚ãããã®ã¯äœããããŸããã ã¬ãã¥ãŒãµãŒããã©ã¡ãŒã¿ãŒãšããŠåãåãé¢æ°ãäœæãããã®äžã§äœããã®åŠçãè¡ã£ãŠãããçµæã䜿çšããŠã¬ãã¥ãŒãµãŒé¢æ°ãçŽæ¥åŒã³åºããã¬ãã¥ãŒãµãŒããã«ãŠã§ã¢ãªã©ãšåŒã¶ããšãã§ããŸãã DevToolsã倱ããã«ãããªã³ã°ãå¢ããããšãç ç²ã«ããŠãããå°ãç°¡åã«ãããå Žåã§ãã
ããã€ãã®åçŽåïŒã¢ã¯ã·ã§ã³ã®éã®æžå°ïŒããããªãã¬ãŒã ã¢ãããŒãã«å€§ããªå©ç¹ããããã©ãããç§ã¯ãŸã ãã£ãšèããå¿ èŠããããŸãã ç§ã¯ãããããã«èªãã ãšèšã£ãã®ã§ãç§ã¯èªåãééã£ãŠããããšã蚌æããããã«ãªãŒãã³ã§ãã
å®éãç§ã¯å°ãééã£ãŠããŸããã éãã¯ãReduxãšRe-frameã®å®è£ ã§ã¯ãªããå®éã«ã¯ãå¯äœçšãã©ãã«çœ®ãããã«ãããŸãã
ã€ãã³ããã³ãã©ãŒïŒã¬ãã¥ãŒãµãŒïŒã§ãããè¡ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãå¶åŸ¡ãããŒã«åœ±é¿ãäžããããšãçŠæ¢ããå Žåãæè¡çã«ã¯éãã¯ãããŸãããReduxã§ãfsm /ã¹ããŒããã£ãŒãã䜿çšããŠãå¶åŸ¡ãããŒã1ãæã«ãŸãšããããšãã§ããŸãã
ãããå®éã«ã¯ãéãããããŸãã @gaearonã¯ãããéåžžã«ãã説æããŸããïŒReduxã¯ããªãã®ã¬ãã¥ãŒãµãŒãçŽç²ã§ããããšãæåŸ ããŠããŸãããããªããã°ãªãã¬ã€æ©èœãå£ããŸãã ãããã£ãŠãReduxã®èšèšã«åããããããããè¡ãããšã¯æ³å®ãããŠããŸããïŒã¬ãã¥ãŒãµãŒã«å¯äœçšãå ¥ããŸãïŒã
ãªãã¬ãŒã ã§ã¯ãã€ãã³ããã³ãã©ãŒã¯çŽç²ã§ãããšãè¿°ã¹ãŠããŸãããReadmeã§ããHTTPãªã¯ãšã¹ãã¯ã€ãã³ããã³ãã©ãŒã§éå§ããããšè¿°ã¹ãŠããŸãã ãããã£ãŠãããã¯ç§ã«ã¯å°ãäžæ確ã§ããã圌ãã®æåŸ ã¯ç°ãªã£ãŠããããã«èŠããŸããå¯äœçšãã€ãã³ããã³ãã©ãŒã«å ¥ããããšãã§ããŸãã
次ã«ããããããªãã¬ã€ã«ã©ã®ããã«ã¢ãããŒãããããèå³æ·±ãã§ãïŒãããŠãããã¯ç§ãhttps://github.com/Day8/re-frame/issues/86ã§å°ãããã®ã§ãïŒã
ã€ãã³ããã³ãã©ãŒã«å¯äœçšãããå Žåã«ãããè¡ãå¯äžã®æ¹æ³ã¯ã @ tomkis1ãè¿°ã¹ãããšã
ããããªããŒãã¯ããéå»ã®ãã€ãã³ãã«åœ±é¿ãäžããããšãã§ããªãããšãé€ããŠãåŒãç¶ãæ©èœããŸããæéå ã«ç¶æ ã®æ°ãããã©ã³ããçæããã ãã§ãã
ã§ãããããã¶ã€ã³ã®éãã¯åŸ®åŠãããããŸããããç§ã«ãšã£ãŠã¯éèŠã§ãã
å¯äœçšã®ããããã«ãŠã§ã¢ã§çŽç²ãªã€ãã³ããã³ãã©ãŒãäœæããããšã§HTTPãªã¯ãšã¹ããå®è¡ãããšæããŸãã ãã®ã³ã³ããžã·ã§ã³ã¯ãçŽç²ã§ã¯ãªããªã£ãæ°ããã€ãã³ããã³ãã©ãŒãè¿ããŸãããå éšã®ã€ãã³ããã³ãã©ãŒã¯çŽç²ãªãŸãŸã§ãã app-dbïŒç¶æ ïŒã®å€æŽãšå¯äœçšãçµã¿åãããã€ãã³ããã³ãã©ãŒãæ§ç¯ããããšãææ¡ããŠãããšã¯æããŸããã ã³ãŒãããããã¹ãããããããŸãã
ã€ãã³ããã³ãã©ãŒã®çµæãèšé²ããå ŽåãããããªããŒãå¯èœã«ããããšã¯ã§ããŸãããã€ãŸããã³ãŒãããã®å Žã§å€æŽã§ããŸãã ããã«ãŠã§ã¢ã®çµæãèšé²ããå¿ èŠããããããã¯Reduxãè¡ãããšãšãŸã£ããåãã§ã-ãã®çµæãã¢ã¯ã·ã§ã³ãšããŠèšé²ãããããã¬ãã¥ãŒãµãŒã«æž¡ããŸãïŒãããèããŸãïŒã
Re-frameããã«ãŠã§ã¢ã¯ããã¢ã¯ãã£ãã§ãããReduxã¯åå¿æ§ãèš±å¯ããŠãããšèšããŸãïŒã¢ãããã¯ã¬ãã¥ãŒãµãŒã¯ããã«ãŠã§ã¢/ acã®çµæããªãã¹ã³ã§ããŸãïŒã ç§ãæ°ã¥ãå§ããŠããããšã®1ã€ã¯ãFluxãããã«ãŠã§ã¢ã§äž»ã«äœ¿çšãããŠããACã¯ã³ã³ãããŒã©ãŒãšåããã®ã§ãããšããããšã§ãã
ç§ãç解ããããã«ã @ tomkis1ã¯ããã¹ãŠã®åäžã®çªç¶å€ç°ã«å¯ŸããŠå®è¡ãããå Žåã«ããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããšæ³å®ããŠãããããããããæå®ãããééã§ãç¶æ ãä¿åããããšã§ã¿ã€ã
ããããŸãããã¬ãã¥ãŒãµãŒ/ã€ãã³ããã³ãã©ãŒãå®å šã«æ°ããç¶æ ãè¿ãããšã«æ°ä»ããã®ã§ãåãããšãèšããŸããã
@merké±æ«ã¯ããããããã«æ¥ãªãã®ã§ãããããæææ¥ã«ããã«ã€ããŠã®èããæžãããšæããŸãã
ãªãã¬ãŒã ããã¥ã¡ã³ãã§ã¯ãã€ãã³ããã³ãã©ãŒã§ãµãŒããŒãšéä¿¡ããããšãæšå¥šããŠããŸãïŒ https ïŒ
ã€ãŸãããããReduxãšã¯ç°ãªããšããã§ãã ãããŠããã®éãã¯äžèŠãããšãããããæ·±ããã®ã§ãã
ããŒããReduxãšã®éããããããŸããã
éå§ã€ãã³ããã³ãã©ãŒã¯ããããã®HTTPèŠæ±ã®æåæãã³ãã©ãŒãŸãã¯å€±ææãã³ãã©ãŒèªäœãåã«æ°ããã€ãã³ãããã£ã¹ãããããããã«ç·šæããå¿ èŠ
ã€ãã³ããã¢ã¯ã·ã§ã³ã«çœ®ãæããŸãã Reduxã«ã¯ãçŽç²ãªã€ãã³ããã³ãã©ãŒã®ç¹å¥ãªååïŒã¬ãã¥ãŒãµãŒïŒããããŸãã äœãã足ããªãããä»é±æ«ã¯è³ãèœã¡ãŠãããšæããŸãã
ã€ãã³ãã®å®è¡æ¹æ³ïŒãã¥ãŒãšéåæïŒã®ãã倧ããªéããå ãããšãã§ããŸãã Reduxã¯ãç¶æ ã®äžè²«æ§ãä¿èšŒããããã«ãã¢ã¯ã·ã§ã³ã®åæãšã¢ã¯ã·ã§ã³ããšã®ããã¯ã¹ãããã¢ã¯ã·ã§ã³ãå®è¡ãããšæããŸãã ã€ãã³ããä¿åããŠäœåºŠãåçãããšåãçµäºç¶æ ã«ãªããã©ããããããªããããåçå¯èœæ§ã«ããã«åœ±é¿ãäžããå¯èœæ§ããããŸãã ã¢ã¯ã·ã§ã³ãåžžã«çŽç²ãªã³ãŒããããªã¬ãŒããReduxãšã¯ç°ãªããã©ã®ã€ãã³ããå¯äœçšãããªã¬ãŒãããããããªãããããããå®è¡ã§ããªãããšãç¡èŠããŸãã
@vladapç§ãèŠãŠããéããèŠçŽãããšïŒ
1.1ã
2.2ã
3.3ã
éçºãšã¯ã¹ããªãšã³ã¹ã®éãã«ã€ããŠã¯ãéåæã®ãã®ïŒã¿ã€ããŒã䞊åhttpãªã¯ãšã¹ããWebãœã±ãããªã©ïŒãå€æ°ããå Žåã«ã®ã¿è¡šç€ºãããŸãã åæã®ãã®ã«ã€ããŠã¯ãããã¯ãã¹ãŠåãã§ãïŒACã«ã¯å¶åŸ¡ãããŒããªãããïŒã
ç§ã®äž»åŒµãããæ確ã«ããããã«ããã®ãããªè€éãªã·ããªãªã®å®äŸãããã€ãæºåããå¿ èŠããããšæããŸãã
ç§ã¯ããªããæããããããããŸãããããã«ã€ããŠã¯ç³ãèš³ãããŸããããç§ãã¡ã¯1ã€ã®åºæ¬çãªããšã«åæããŸããã ãã¶ãç§ã¯ãªãã¬ãŒã ã®ãµã³ãã«ã³ãŒããèªãã¹ãã§ããç§ã¯ãã€ãClojureãåŠã³ãŸãã ãã¶ãããªãã¯ããããã®ã§ãããªãã¯ãã£ãšç¥ã£ãŠããŸãã ããªãã®åªåã«æè¬ããŸãã
1.1ã
Reduxã§ã¯ãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãµãŒããŒãªã¯ãšã¹ããéå§ããŸãïŒãã®åé¡ã®å ã®è³ªåã«å¯Ÿãã@gaearonã®è¿ä¿¡ãåç §ããŠãã ããïŒã ããªãã®ã¬ãã¥ãŒãµãŒã¯çŽç²ã§ãªããã°ãªããŸãã
ãªãã¬ãŒã ã§ã¯ãã€ãã³ããã³ãã©ãŒïŒãªãã¥ãŒãµãŒïŒã§è¡ããŸãã ã€ãã³ããã³ãã©ãŒïŒåæžè ïŒã«ã¯å¯äœçšãããå¯èœæ§ããããŸã
ç§ã倪åã«ããDocã¯ãã€ãã³ããã³ãã©ãŒã§webapiåŒã³åºããéå§ããæåãããšãã«ã€ãã³ãããã£ã¹ãããããå¿ èŠãããããšãæ瀺çã«ç€ºããŠããŸãã åãã€ãã³ããã³ãã©ãŒã§ãã®ãã£ã¹ããããããã€ãã³ããåŠçããæ¹æ³ãããããŸããã ãã®æåããã€ãã³ãã¯ã«ãŒã¿ãŒã«ãã£ã¹ãããããïŒãã£ã¹ãããã£ãŒãšåãã ãšæããŸãïŒããããåŠçããããã«ããã«å¥ã®ã€ãã³ããã³ãã©ãŒãå¿ èŠã§ãã ãã®2çªç®ã®ã€ãã³ããã³ãã©ãŒã¯çŽç²ã§Reduxã¬ãã¥ãŒãµãŒãšåçã§ãããæåã®ã€ãã³ããã³ãã©ãŒã¯ActionCreatorãšåçã§ãã ç§ã«ãšã£ãŠããã¯åãããšã§ããããç§ã¯æããã«ããã€ãã®éèŠãªæŽå¯ãéããŠããŸãã
éçºãšã¯ã¹ããªãšã³ã¹ã®éãã«ã€ããŠã¯ãéåæã®ãã®ïŒã¿ã€ããŒã䞊åhttpãªã¯ãšã¹ããWebãœã±ãããªã©ïŒãå€æ°ããå Žåã«ã®ã¿è¡šç€ºãããŸãã åæã®ãã®ã«ã€ããŠã¯ãããã¯ãã¹ãŠåãã§ãïŒACã«ã¯å¶åŸ¡ãããŒããªãããïŒã
ç§ãã¡ã¯ããã«åæããŸããã éåæã®ãã®ã¯å®éã«ã¯åé¡ã§ã¯ãããŸãããReduxã§åçããããšã¯ã§ããªããããããã§ã¯éçºçµéšããããŸããã è€éãªçŽç²ãªã¬ãã¥ãŒãµãŒãå€æ°ããå Žåã«éããçŸããŸãã Reduxã§ã¯ãç¶æ Aãããã€ãã®ã¢ã¯ã·ã§ã³ã·ãŒã±ã³ã¹ãã¬ãã¥ãŒãµãŒãååŸããŠåçããç¶æ BãååŸã§ããŸãããã¹ãŠãåãã«ä¿ã¡ãŸãããã¬ãã¥ãŒãµãŒã«ã³ãŒããå€æŽããŠããããªããŒãããç¶æ Aããåãã¢ã¯ã·ã§ã³ã·ãŒã±ã³ã¹ãåçããŸããç¶æ CãååŸããã³ãŒãå€æŽã®åœ±é¿ãããã«ç¢ºèªããŸãã @ tomkis1ã¢ãããŒãã§ã¯ãããè¡ãããšã¯ã§ããŸããã
ãã®äžã«ãã¹ãã·ããªãªãäœæããããšãã§ããŸãã åæç¶æ ãä¿åããã¢ã¯ã·ã§ã³ã·ãŒã±ã³ã¹ãä¿åããã¢ã¯ã·ã§ã³ã·ãŒã±ã³ã¹ãç¶æ Aã«æžãããç¶æ BãååŸããŠã¢ãµãŒãããŸãã 次ã«ãåãç¶æ Bã«ãªããšäºæ³ãããã³ãŒãã«å€æŽãå ãããã¹ãã·ããªãªãåçããŠããããçã§ãããå€æŽã«ãã£ãŠã¢ããªãç ŽæããŠããªãããšã確èªããŸãã ç§ã¯ãããæè¯ã®ãã¹ãã¢ãããŒãã§ãããšã¯èšããŸããããããã¯å¯èœã§ãã
å®éãHaskellersãšåãããã«é¢æ°åããã°ã©ãã³ã°ã®ç±å¿ãªå®è·µè ã§ãããšç§ãèããClojuristsããå°ãªããšãããçšåºŠã®æ§æããªããŠãçŽç²ãªã³ãŒããšå¯äœçšãæ··åããããšãæšå¥šããå Žåãç§ã¯éåžžã«é©ããŸãã
é 延è©äŸ¡/åå¿æ§ã¯ãå¯äœçšã®ããã³ãŒããçŽç²ãªã³ãŒãããå¯èœãªéã移åããããã®åºæ¬çãªææ³ã§ãã é 延è©äŸ¡ã¯ãHaskellãæçµçã«éå®çšçãªé¢æ°åçŽåºŠã®æŠå¿µãé©çšããŠãå®çšçãªäœããå®è¡ããããã°ã©ã ãååŸããæ¹æ³ã§ããå®å šã«çŽç²ãªããã°ã©ã ã§ã¯å€ãã®ããšãã§ããªãããã§ãã ã¢ããæ§æãªã©ã䜿çšããŠãããã°ã©ã å šäœãããŒã¿ãããŒãšããŠäœæããããã€ãã©ã€ã³ã®æåŸã®ã¹ããããçŽç²ã«ä¿ã¡ãã³ãŒãã§å®éã«å¯äœçšãåŒã³åºããªãããã«ããããã«ãããã°ã©ã ã¯äœããã¹ããã«ã€ããŠã®èª¬æãè¿ããŸãã å®è¡æã«æž¡ãããé 延å®è¡ãããŸããåœä»€åŒã³åºãã«ãã£ãŠå®è¡ãããªã¬ãŒãããããšã¯ãããŸããã å°ãªããšããé³¥ã®ã¬ãã«ã®èŠ³ç¹ããé¢æ°åããã°ã©ãã³ã°ãç解ããæ¹æ³ã§ãã ActionCreatorsãšåå¿æ§ã§ã·ãã¥ã¬ãŒããããããªã©ã³ã¿ã€ã ã¯ãããŸããã å 責äºé ããããåœç¶ã®ããšãšæã£ãŠã¯ãããŸãããFPã«ã€ããŠããŸãèªãã§ããªãããšãããããã§äœããã®æš©åšã§ããããšãç§ãç解ããããšã§ãã ãªãã«ãªã£ãŠãããããããŸããããå®éã«ã¯ãã®ç¹ãç解ãããšæããŸãã
åãã€ãã³ããã³ãã©ãŒã§ãã®ãã£ã¹ããããããã€ãã³ããåŠçããæ¹æ³ãããããŸããã
ç§ã¯ãããèšã£ãŠããã®ã§ã¯ãããŸããã ãå¯äœçšããšã¯ãã€ãã³ããã³ãã©ãŒïŒãªãã¥ãŒãµãŒïŒã§HTTPãªã¯ãšã¹ããéå§ããããšãæå³ããŸãã IOã®å®è¡ã¯ãé¢æ°ã®æ»ãã«åœ±é¿ãäžããªãå Žåã§ããå¯äœçšã§ãã æå/ãšã©ãŒãã³ãã©ãŒã§ç¶æ ãçŽæ¥å€æŽãããšããæå³ã§ã®ãå¯äœçšããæå³ããã®ã§ã¯ãããŸããã
ãã®2çªç®ã®ã€ãã³ããã³ãã©ãŒã¯çŽç²ã§Reduxã¬ãã¥ãŒãµãŒãšåçã§ãããæåã®ã€ãã³ããã³ãã©ãŒã¯ActionCreatorãšåçã§ãã
æåã®ãã®ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«çžåœãããšã¯æããŸããã ãã以å€ã®å Žåããªããããè¡ãããã«ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãå¿ èŠãªã®ã§ããïŒ ã¬ãã¥ãŒãµãŒã§ãåãããšãã§ãããšãããïŒ
@ tomkis1ã¢ãããŒãã§ã¯ãããè¡ãããšã¯ã§ããŸããã
åæããŸãã ãããŠãããã¯ç§ããä»ã®ïŒããããããã»ã©åŒ·åã§ã¯ãªãïŒãªãã·ã§ã³ããæžãããšãã«ç§ãæå³ããããšã§ãã
æåã®ãã®ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«çžåœãããšã¯æããŸããã ãã以å€ã®å Žåããªããããè¡ãããã«ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãå¿ èŠãªã®ã§ããïŒ ã¬ãã¥ãŒãµãŒã§ãåãããšãã§ãããšãããïŒ
ActionCreatorsã¯ãçŽç²ãªã¢ããªïŒåçå¯èœïŒããå¯äœçšãåé¢ããããã«äœ¿çšãããŸãã Reduxã¯èšèšãããŠãããããã¬ãã¥ãŒãµãŒã§å¯äœçšãå®è¡ããããšã¯ã§ããŸããïŒå®è¡ãã¹ãã§ã¯ãããŸããïŒã å¯äœçšã®ããã³ãŒããé 眮ã§ããå¥ã®æ§æãå¿ èŠã§ãã Reduxã§ã¯ããããã®æ§æã¯ACãŸãã¯ããã«ãŠã§ã¢ã§ãã ãªãã¬ãŒã ã§èŠãããå¯äžã®éãã¯ãããã«ãŠã§ã¢ã®æ©èœãšããã³ãã©ãŒãããªã¬ãŒãããåã«ã€ãã³ãïŒã¢ã¯ã·ã§ã³ïŒãå€æããããã«ãŠã§ã¢ããªãã¬ãŒã ã«ãªãããšã§ãã
AC /ããã«ãŠã§ã¢ã®ä»£ããã«ãå®éã«ã¯äœã§ã䜿çšã§ããŸã-utilã¢ãžã¥ãŒã«ããµãŒãã¹ïŒAngularãµãŒãã¹ãªã©ïŒãACãŸãã¯ããã«ãŠã§ã¢ã®ããããã§ã€ã³ã¿ãŒãã§ãŒã¹ãããã®APIãã¢ã¯ã·ã§ã³ã«å€æããå¥åã®libãšããŠãã«ãã§ããŸãã ACã¯ããã®ã³ãŒããé 眮ããã®ã«é©åãªå Žæã§ã¯ãããŸãããACã¯ãåŒæ°ããã¢ã¯ã·ã§ã³ãªããžã§ã¯ããæ§ç¯ããåçŽãªäœæè /ãã¡ã¯ããªã§ããå¿ èŠããããŸãã ç§ãçŽç²äž»çŸ©è ã«ãªãããã®ã§ããã°ãå¯äœçšã®ããã³ãŒããããã«ãŠã§ã¢ã«å³å¯ã«é 眮ããæ¹ãããã§ãããã ActionCreatorã¯ãããçš®ã®ã³ã³ãããŒã©ãŒã®è²¬ä»»ãè¡šãæªãçšèªã§ãã ãã ãããã®ã³ãŒãã1ã©ã€ããŒã®webapiåŒã³åºãã§ããå Žåã¯ãåã«ACå ã«é 眮ããåŸåããããåçŽãªã¢ããªã®å Žåã¯åé¡ãããŸããã
ACãããã«ãŠã§ã¢ããµãŒãããŒãã£ã®ã©ã€ãã©ãªã¯ãç§ããµãŒãã¹ã¬ã€ã€ãŒãšåŒã¶ã®ã奜ããªã¬ã€ã€ãŒã圢æããŸãã å ã®FacebookWebApiUtilsã¯ãreact-routerã䜿çšããŠãã®å€æŽããªãã¹ã³ããããããã¢ã¯ã·ã§ã³ã«å€æããŠRedux.stateãæŽæ°ããå Žåãšåãããã«ããã®ã¬ã€ã€ãŒã®äžéšã«ãªããŸããRelayã¯ãµãŒãã¹ã¬ã€ã€ãŒãšããŠäœ¿çšã§ããŸãïŒã¢ããª/ãã¥ãŒã«Reduxã䜿çšãããããïŒç¶æ ïŒã ã»ãšãã©ã®ãµãŒãããŒãã£ã©ã€ãã©ãªã¯çŸåšããã°ã©ã ãããŠããããããªãã¬ã€ã§ã¯ããŸãæ©èœããŸããã æããã«ããã¹ãŠãæåããæžãçŽããããªãã®ã§ãããããŸãã ç§ãããã«ã€ããŠèããã®ã奜ããªã®ã¯ããããã®ã©ã€ãã©ãªããµãŒãã¹ããŠãŒãã£ãªãã£ãªã©ããã©ãŠã¶ç°å¢ãæ¡åŒµããŠãåçå¯èœãªã¢ããªãæ§ç¯ã§ãããã©ãããã©ãŒã ã圢æããããšã§ãã ãã®ãã©ãããã©ãŒã ã¯å¯äœçšã§ãã£ã±ãã§ããå®éã«ããã¯ç§ãæå³çã«å¯äœçšã移åããå Žæã§ãã ãã®ãã©ãããã©ãŒã APIãã¢ã¯ã·ã§ã³ã«å€æããã¢ããªã¯ãããã®ã¢ã¯ã·ã§ã³ãªããžã§ã¯ãããªãã¹ã³ããããšã§éæ¥çã«ãã®ãã©ãããã©ãŒã ã«æ¥ç¶ããŸãïŒäžèšã®æçš¿ã§èª¬æããããšããHaskellã¢ãããŒããã·ãã¥ã¬ãŒãããããšããŸãïŒã ããã¯é¢æ°åããã°ã©ãã³ã°ã®äžçš®ã®ããã¯ã§ãããçŽç²ããéæããæ¹æ³ïŒãããã絶察çãªåŠè¡çæå³ã§ã¯ãªãïŒãå¯äœçšãåŒãèµ·ããæ¹æ³ã§ãã
ç§ãæ··ä¹±ãããå¥ã®ããšããããŸãããç§ã¯ããªãã誀解ããå¯èœæ§ããããŸãã è€éãªããžãã¯ã®å Žåããã¹ãŠã1ãæã«ãŸãšããããšãæçã ãšãã£ããã£ãŠãããšæããŸãã ãŸã£ããéã ãšæããŸãã
ãã®ã¢ã¯ã·ã§ã³ããžãã¹å šäœã¯ãæŠå¿µçã«ã¯DOMã€ãã³ããšäŒŒãŠããŸãã ç§ã¯èªåã®ããžãã¹ã³ãŒãããfeãã©ãŠã¶ãmousemoveã€ãã³ããæ€åºããæ¹æ³ã®ã³ãŒããšæ··ããããããŸãããããªããããããªããšç¢ºä¿¡ããŠããŸãã 幞ããªããšã«ããããã®è²¬ä»»ã¯ååã«åé¢ãããŠãããããç§ã¯addListenerïŒ 'mousemove'ã...ïŒã®äžã§äœæ¥ããããšã«æ £ããŠããŸãã éèŠãªã®ã¯ãç§ã®ããžãã¹ããžãã¯ã«ã€ããŠããã®ãããªé¢å¿ã®åé¢ãå®çŸããããšã§ãã ActionCreatorsãããã«ãŠã§ã¢ã¯ãã®ããã®ããŒã«ã§ãã
ç§ã®ããžãã¹ããŒãºã«ããŸã察å¿ããŠããªãå»æ¢ãããwebapiã«å¯ŸããŠã¢ããªãäœæããããšãæ³åããŠã¿ãŠãã ããã å¿ èŠãªããŒã¿ãååŸããã«ã¯ãããã€ãã®ãšã³ããã€ã³ããåŒã³åºãå¿ èŠããããŸãããããã®çµæã䜿çšããŠæ¬¡ã®åŒã³åºããäœæãããã¹ãŠã®çµæãRedux.stateã§äœ¿çšããæ£èŠã®åœ¢åŒã«ããŒãžããŸãã ãã®ããžãã¯ã¯ã¬ãã¥ãŒãµãŒã«æŒããªãã®ã§ãã¬ãã¥ãŒãµãŒã®ããŒã¿ãäœåºŠãå€æããå¿ èŠã¯ãããŸããã ããã¯ããã«ãŠã§ã¢ã«ãªããŸãã å¹æçã«ã¯ãåä»ãªå»æ¢ãããAPIãåé¢ããçŽ æµãªAPIã«å¯ŸããŠäœæãããããã«ããžãã¹ã¢ããªãéçºããŸãã å®äºããããwebapiãåæ§ç¯ããããã®å€æŽãååŸããŠãããããã«ãŠã§ã¢ãæžãçŽãã ããããããŸããã
ãããã£ãŠããã¹ãŠã1ã€ã®å Žæã«ãŸãšããããšã¯ãç°¡åãªã¢ããªã«ãšã£ãŠã¯ç°¡åã«æããŸãã ããããè€éãªããšãšã¯ãŸã£ããéã«ãé¢å¿ã®åé¢ãæçã§ããããšãããããŸãã ããããããããç§ã¯ããªããèšåããŠããããªãã®ãã€ã³ãããŠãŒã¹ã±ãŒã¹ãç解ããŠããŸããã
å®éãããããç§ã¯ãããŒã¿å€æã®å€ããæ£èŠã®åœ¢åŒããã¬ãã¥ãŒãµãŒã«ç§»åãã代ããã«ã¬ãã¥ãŒãµãŒæ§æã䜿çšããŸããããã«ãããäžè¬çã«çŽç²ãªãã®ã³ãŒãã®åçãšãã¹ããå¯èœã«ãªããŸãã
åãã€ãã³ããã³ãã©ãŒã§ãã®ãã£ã¹ããããããã€ãã³ããåŠçããæ¹æ³ãããããŸããã
ç§ã¯ãããèšã£ãŠããã®ã§ã¯ãããŸããã
webapiåŒã³åºããšã¬ãã¥ãŒãµãŒããžãã¯ãçµã¿åãããŠ1ãæã«ãŸãšããããšæããŸããã 圌ããæåãããšãã«ã€ãã³ãããã£ã¹ãããããããšãææ¡ããŠããã®ã§ãããªãããªãã¬ãŒã ã§ãããããªããšç§ãèšã£ãŠããããšã
webapi->å€ãã®ããžãã¯-> webapi->å€ãã®ããžãã¯-> ...->ã¬ãã¥ãŒãµãŒã®çµæããã§ãŒã³å šäœãã·ã³ã°ã«ã¯ãªãã¯ã§ããªã¬ãŒãããå ŽåããããŸãã ãã®ãããªå Žåãããžãã¯ã®ã»ãšãã©ã¯ããããACã«ããããã¹ãŠã®å¯äœçšãçµäºãããŸã§ãããåå²ããŸããã ããã¯ããªããèšåããŠãããã®ã§ããïŒ
ããã§ç§ãã§ããæåã®ããšã¯ããã¹ã容ææ§ã®ããã«ã§ããã ãå€ãã®ããžãã¯ãçŽç²é¢æ°ã«ç§»åããããšã§ããããããã¯ACã¹ã³ãŒãã§åŒã³åºãããŸãã
éæ¥çã«æ¥ç¶ãããäžé£ã®ã€ãã³ããã³ãã©ãŒãšããŠãããè¡ãå¯èœæ§ã¯å¥œãã§ã¯ãªããšæããŸãã ããã¯çŽæãŸãã¯èŠ³å¯å¯èœãªãã§ãŒã³ã«ãªããŸãã
ããçµéšè±å¯ãªReduxersã¯ããã®èãã«ã€ããŠç°ãªãæèŠãæã€å¯èœæ§ããããŸãïŒ @ gaearon ã @ johanneslumpe ã @ acdlite ã @ emmenko ...ïŒ
@vladapãã®äŒè©±ã¯ããã®åé¡ã®äž»é¡ããé¢ããããŠãããšæããŸãã ããªãã¯ãã§ã«ããã§ç§ã®ã³ã¡ã³ãã®èŠç¹ã«èšåããŸããïŒ
ãããã£ãŠãããã€ãã®éåžžã«è€éãªã·ããªãªã§ã¯ãACãšæžéæ©ã®éã®ããžãã¯ãåæãããã®ãé£ããå Žåããããšæ³åã§ããŸãã
ç°¡åãªäŸïŒ
ç¶æ³1ïŒããŒãžã®ã©ããã«ããã10ã®ããã°äœæè ã®ãªã¹ãããããŸãã ããã§ãããã°ã®æçš¿ã®ã«ããŽãªãåé€ãããŸããã åé€ãæåãããããµãŒããŒãããã®äœæè ã®ãªã¹ããæŽæ°ããŠææ°ã®ç¶æ ã«ããå¿ èŠããããŸãã
ç¶æ³2ïŒå¥ã®ããŒãžã«ããŸãã èè ã®ãªã¹ãã¯ãããŸããããããã10ã®ã³ã¡ã³ãã®ãªã¹ãã¯ãããŸãã ããã°æçš¿ã®äžéšã®ã«ããŽãªãåé€ããããšãã§ããåé€ãæåããå Žåã¯ã³ã¡ã³ãã®ãªã¹ããæŽæ°ããå¿ èŠããããŸãã
ã§ã¯ãç¶æ ãšã³ãžã³ã®ã¬ãã«ã§ãããã©ã®ããã«åŠçããã®ã§ããããã ïŒReactããã¯ã䜿çšããŠæ¯æŽããããšãã§ããŸãããè¯å¥œãªç¶æ ã®ãšã³ãžã³ã¯ããèªäœã§äžè²«æ§ãä¿ã€ããšãã§ããã¯ãã§ãïŒ
ãªãã·ã§ã³ïŒ
AïŒãã®ããžãã¯ãACã«é
眮ããŸãã 次ã«ãACã¯CategoryApi
ïŒåé€ããïŒã«è§Šãã userList
ç¶æ
ãšcommentList
ç¶æ
ïŒçŸåšç¶æ
ã«ãããªã¹ãã確èªããïŒããèªã¿åãã UserListApi
話ããããŸãã CommentListApi
ïŒãªã¹ããæŽæ°ããããïŒ+ãã£ã¹ãããTOP_AUTHORS_UPDATED
ããã³/ãŸãã¯TOP_COMMENTS_UPDATED
ã ãããã£ãŠãåºæ¬çã«3ã€ã®ç°ãªããã¡ã€ã³ã«ã¢ã¯ã»ã¹ããŸãã
BïŒã€ãã³ããã³ãã©ãŒuserList
ãšcommentList
ãŸãã ãããã®ãã³ãã©ãŒã¯äž¡æ¹ãšãDELETE_CATEGORY_SUCCESS
ã€ãã³ãããªãã¹ã³ãã次ã«APIãµãŒãã¹ãåŒã³åºãã次ã«TOP_AUTHORS_UPDATED
/ TOP_COMMENTS_UPDATED
ã€ãã³ãããã£ã¹ãããããŸãã ãããã£ãŠãåãã³ãã©ãŒã¯ãããèªäœã®ãã¡ã€ã³ã®ãµãŒãã¹/ç¶æ
ã«ã®ã¿ã¢ã¯ã»ã¹ããŸãã
ãã®äŸã¯ããããåçŽãããŸããããã®ã¬ãã«ã§ããACã§ã®APIåŒã³åºãã§ã¯ç¶æ³ãæªããªããŸãã
éãã¯ããªãã¬ãŒã ã®ã€ãã³ããã³ãã©ãŒãšã¯ç°ãªããActionCreatorsã¯ããžãã¹ããžãã¯ã®åŠçã«ç©æ¥µçã§ãããšããäºå®ã«ç±æ¥ããŸãã ãŸããDOMã€ãã³ãã«åºã¥ããŠå®è¡ã§ããACã¯1ã€ã ãã§ãã ãã ãããã®ãããã¬ãã«ACã¯ä»ã®ACãåŒã³åºãããšãã§ããŸãã ãã¡ã€ã³ãããé©åã«åé¢ããããã«ãUserListApiãšCommentListApiã«å¥ã ã®ACãèšå®ã§ããŸãããããããé ç·ããACïŒã³ã³ãããŒã©ãŒã®ãããªãã®ïŒãåžžã«ååšããå¿ èŠããããŸãã ãã®éšåã¯éåžžã«å€å žçãªåœä»€åã³ãŒãã§ããããªãã¬ãŒã ã¯å®å šã«ã€ãã³ãããŒã¹ã§ãã å°ãã®äœæ¥ã§ãåªå ã¢ãããŒããã€ãã³ãããŒã¹ããªãã¶ãŒããã«ãcpsãªã©ã«çœ®ãæããããšãã§ããŸãã
@vladapå¥ã®ã¢ãããŒããå®è¡å¯èœãã©ããã確èªããã®ã¯èå³æ·±ãããšã§ããã¬ãã¥ãŒãµãŒã«å¯äœçšãããå ŽåããããŸããããªãã¬ã€ã§ç¡èŠã§ããããã«ããããåé¢ããããšãã§ããŸãã
ã¬ãã¥ãŒãµãŒã®çœ²åã次ã®ããã«å€æŽããããšããŸãã (state, action) => (state, sideEffects?)
ããã§ãsideEffectsã¯ã¯ããŒãžã£ã§ãã 次ã«ãã³ã³ããã¹ããã¬ãŒã ã¯ãŒã¯ã«å¿ããŠããããã®sideEffectsãè©äŸ¡ããããç¡èŠããããšãã§ããŸãïŒåçã®å ŽåïŒã
次ã«ãå ã®åé¡ã®èª¬æã®äŸã¯æ¬¡ã®ããã«ãªããŸãã
export default function user(state = initialState, action) {
switch (action.type) {
case LOGIN_ATTEMPT:
return [state, () => {LoginApiCall.login(action.user)}];
case LOGGED_FAILED:
// do something
return state;
case LOGGED_SUCCESSFULLY:
// do something else
return state;
default:
return state;
}
}
ïŒä»ã®ãã¹ãŠã¯ã»ãšãã©åããŸãŸã§ãïŒ
å°ãªããšãå¶åŸ¡ãããŒã¯1ã€ã®å Žæã«ãããå¯äœçšã¯åžžã«åçŽã§ãïŒéåæãã³ãã©ãŒã§å¥ã®ã¢ã¯ã·ã§ã³/ã€ãã³ããäœæããã ãã§ãããžãã¯ã¯ã¬ãã¥ãŒãµãŒã«ãšã©ãŸããããããå€ãã®ã³ãŒããåçãããŸãïŒã
éåžžã®FSMãŸãã¯ã¹ããŒããã£ãŒãã®ãããªã³ãŒãïŒã¬ãã¥ãŒãµãŒ/ã€ãã³ããã³ãã©ãŒã®æ§æãå«ãïŒãäœæããããšãã§ããŸãã
ãŸããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§äºåå®çŸ©ããã眲åã䜿çšããŠã¯ããŒãžã£ãè¿ãå¿ èŠã¯ãããŸããã
ãã®ã¢ãããŒããã©ã®ãããªåé¡ãåŒãèµ·ããå¯èœæ§ããããã¯ããããŸããããç§ã«ãšã£ãŠã¯è©ŠããŠã¿ã䟡å€ããããŸãã
ã¬ãã¥ãŒãµãŒã®çœ²åã次ã®ããã«å€ãããšèšããŸãïŒïŒstateãactionïŒ=>ïŒstateãsideEffectsïŒïŒããã§ãsideEffectsã¯ã¯ããŒãžã£ãŒã§ãã 次ã«ãã³ã³ããã¹ããã¬ãŒã ã¯ãŒã¯ã«å¿ããŠããããã®sideEffectsãè©äŸ¡ããããç¡èŠããããšãã§ããŸãïŒåçã®å ŽåïŒã
ããã¯å®éãElmã(State, Action) => (State, Request?)
è¡ã£ãŠããã®ãèããã®ãšäŒŒãŠããŸãã ç§ã¯ãŸã äŸãèŠãŠããŸãããã誰ãããããæ¢æ±ããããªããé æ
®ãªãããŠãã ããã
ããããããã€ãã®ã€ã³ã¹ãã¬ãŒã·ã§ã³ãåŸãããã®ããã«å¥ã®ã¢ãããŒãã¯ãã¢ã¯ã¿ãŒã¢ãã«ã®äžã«ã€ãã³ããœãŒã·ã³ã°ãå®è£ ããããšã§ã-Akka Persistance ã PersistentFSM ã ç§ã¯ãããè¯ããšã¯èšããŸããããä»ã®è©Šã¿ãç¥ãããšã¯æªããããŸããã ã¢ã¯ã¿ãŒã¯å¯äœçšã䜿çšã§ããŸãããç§ãæ£ããèŠããŠããã°ãåçæ¹æ³ãæ瀺çã«ã³ãŒãã§èšè¿°ããå¿ èŠãããå ŽåããããŸãã
ãã¶ããåçæ©èœã¯ãã³ãŒããå±ããå Žæã®æ±ºå®ãæªããŠããå¯èœæ§ããããŸãã ããããåçã§ããããã«ãããã®ã§ãã¬ãã¥ãŒãµãŒã«è¡ããªããã°ãªããªãããšèãå§ããŠããããã§ãã 責任/圹å²ã«ãã£ãŠã³ãŒããã¹ã©ã€ã¹ããŠããããããžãã¹ããžãã¯ã人çºçã«ã¹ã©ã€ã¹ããŠåçå¯èœã«ããåŸåããããããå¢çãäžæ確ãªã³ãŒãã«ã€ãªããå¯èœæ§ããããŸãã
ãªãã¬ã€æ©èœãèã«çœ®ããŠãããžãã¹ã³ãŒããäœæããæ¹æ³ãæããŠãã ããã ç§ã¯èªåã®ããžãã¹ããžãã¯ãã¢ã¯ã·ã§ã³ãã°ã®åã«çœ®ããããã1ãæã«çœ®ãããšãç®æããŠããŸãã ããžãã¹ããžãã¯ã¹ããŒããã·ã³ããŸãã¯ç§ã䜿çšãããã®ã¯ãã¹ãŠããã¹ãŠã®é£ããè€éãªæ±ºå®ãè¡ããFACTSïŒã¢ã¯ã·ã§ã³ïŒã®ã¹ããªãŒã ããã§ã«è§£æ±ºãããŠããŸãã ã¬ãã¥ãŒãµãŒã¯äžè¬çã«åçŽãªã¢ããããŒã¿ãŒã§ããããã®äž»ãªè²¬ä»»ã¯ã¢ã¯ã·ã§ã³ãã€ããŒããRedux.stateã«é©çšããæ¹æ³ã§ãã ãããã«ã¯ããã€ãã®ããžãã¯ããããŸãããããæå³ã§ã¯ããã¡ã¯ããç°ãªãæ¹æ³ã§è§£éããŠããã¡ã¯ãïŒã¢ã¯ã·ã§ã³ïŒã¹ããªãŒã ã«é¢ããå¥ã®çš®é¡ã®ãã¥ãŒãååŸãããŠãŒã¶ãŒã«æ瀺ããŸãã
責任ãåæããããã«ãç§ããã®ããã«èããã®ã奜ãã§ãã ãµãŒããŒã«åå®è£ ããããã«èŠæ±ãããå¯èœæ§ã®ããã³ãŒãã¯äœã§ããïŒ Feã¯ãèšç®ã³ã¹ãã®é«ãããžãã¹ããžãã¯ãããããã»ãã¥ãªãã£äžã®çç±ãã€ã³ããªãžã§ã³ã¹ããããã£ãé ããŠãäœéããã€ã¹ãããé©åã«ãµããŒãããŸãã ãã¥ãŒã¬ã€ã€ãŒã«ãã€ã³ããããŠãããããããžãã¯ãã¬ãã¥ãŒãµãŒãããµãŒããŒã«ç°¡åã«ç§»åããããšã¯ã§ããŸããã è€éãªããžãã¹ããžãã¯ãã¢ã¯ã·ã§ã³ãã°ã®åã«èšè¿°ãããŠããå Žåã¯ãåãã¢ã¯ã·ã§ã³ã¹ããªãŒã ã«å€æããRESTåŒã³åºãã«çœ®ãæããããšãã§ãããã¥ãŒã¬ã€ã€ãŒã¯ïŒããããïŒæ©èœããã¯ãã§ãã
æ¬ ç¹ã¯ãAkka Persistanceãšã¯ç°ãªãããã®ã³ãŒããåçããæ¹æ³ããªãããšã§ãã
ãã€ããšã«ã ããã£ãšæ·±ãèŠãŠãããªãã®ææ¡ãã©ã®ããã«æ©èœããããç解ããå¿ èŠããããŸãã
@gaearonElmã«èšåããŠãããŠããããšãã ãã®äŒè©±ïŒ https://gist.github.com/evancz/44c90ac34f46c63a27ae ïŒãåæ§ã®ã¢ã€ãã¢ã§èŠã€ããŸããïŒãã ããã¯ããã«é«åºŠã§ãïŒã
ã¿ã¹ã¯ïŒhttpãdbãªã©ïŒãšãšãã§ã¯ãïŒã¿ã¹ã¯ã®ãã¥ãŒã®ã¿ïŒã®æŠå¿µã玹ä»ããŸãã ãããã£ãŠããã¬ãã¥ãŒãµãŒãã¯å®éã«æ°ããç¶æ ãšå¹æãè¿ãããšãã§ããŸãã
ããã«ã€ããŠã®ã¯ãŒã«ãªããšïŒãããŠç§ã¯ããã«ã€ããŠãã®ããã«èããŠããŸããã§ããïŒ-ã¬ãã¥ãŒãµãŒããã§ãŒã³ããªããã¿ã¹ã¯ãåéã§ããã°-ãããŠåŸã§ãã®ãªã¹ãã«ããã€ãã®é¢æ°ãé©çšããããšãã§ããŸãã httpãªã¯ãšã¹ãããããåŠçããããDBã¯ãšãªããã©ã³ã¶ã¯ã·ã§ã³ã§ã©ãããããã§ãããšããŸãã
ãŸãã¯ããšãã§ã¯ãã®ã»ãã®äžéšã§ããããªãã¬ã€ãããŒãžã£ãŒããšèšãããšãã§ããŸãã
@merkã»ãšãã©ã¯ãã§ã«æžãããŠãããšæããŸãã ãã®çš®ã®èªåŸçãªå¯äœçšã³ãŒãã¯ããããæãããªãããŒã§ãã ã¿ã€ã ãã©ãã«ãåãã³ãŒãã§å®è¡ãããŠãããã€ã³ã¿ãŒãã«ããªãã¬ã€ã¢ãŒãã§éå§ããããšä»®å®ãããšãã€ã³ã¿ãŒãã«ã¯ã¿ã€ã ãã©ãã«ãšåæãããªãããããªãã¬ã€ã§å€§æ··ä¹±ãåŒãèµ·ããå¯èœæ§ããããŸãã
éåžžã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãããŒã¯ã³ãšæå¹æéã®ã«ãŠã³ãããŠã³ããŠãŒã¶ãŒã«æ瀺ããå¿ èŠããªããããæè¡çã«ã¯Redux.stateã«ããå¿ èŠã¯ãããŸããã 管çã¢ããªã¯ãããæã£ãŠããå¿ èŠããããããããŸããã ãããã£ãŠãèªåã«åã£ãæ¹æ³ã§äž¡æ¹ã®æ¹æ³ã§å®è£ ã§ããŸãã
1ã€ã®ãªãã·ã§ã³ã¯ããã°ã€ã³ACã§æå¹æéã®ã«ãŠã³ãããŠã³ãéå§ããããšã§ããããã¯ãç¡éã«å®è¡ãããã¢ããªã§åæ¢ãããããã°ãªãã§ã¯ãªãŒã³ã¢ããããå¿ èŠããããšæããŸãã ééãããªã¬ãŒããããšãããŒã¯ã³ã®ç¢ºèªã«å¿ èŠãªåŠçãå®è¡ãããæéåãã«ãªããšLOGIN_EXPIREDã¢ã¯ã·ã§ã³ããã£ã¹ãããããããªã¹ãã³ã°ã¬ãã¥ãŒãµãŒããŠãŒã¶ãŒã»ãã·ã§ã³ãã¯ãªã¢ããŠå Žæãå€æŽããŸããããã«ãããã«ãŒã¿ãŒã/ loginã«ç§»è¡ããŸãã
ãã1ã€ã¯ããµãŒãããŒãã£ã®libã䜿çšããŠæžå¿µäºé ãå§ä»»ãããã®APIãLOGIN_EXPIREDã¢ã¯ã·ã§ã³ã«å€æããããšã§ãã ãŸãã¯ãç¬èªã«èšè¿°ããŠããã¥ãŒã¬ã€ã€ãŒã§ããŒã¯ã³ãšã«ãŠã³ãããŠã³ã®ç¶æ ãäžèŠãªå Žåã¯ãããã«ä¿æããŸãã
Redux.stateã«ä¿æã§ããŸããããã®ç¶æ ã¯äžå®å®ã§ãã ç¶æ ã倧ãããšãã°ããŒãã«å€æ°ã䜿çšããããã°ã©ãã³ã°ãšåãåé¡ãçºçããå¯èœæ§ããããŸãã ãããŠãããããã¹ãããããšã¯é£ãããããããäžå¯èœã§ãã ã¬ãã¥ãŒãµãŒããã¹ãããã®ã¯ç°¡åã§ãããç¶æ ãªããžã§ã¯ãã®ç¹å®ã®ããŒãæŽæ°ããŠããã¬ãã¥ãŒãµãŒã1ã€ã ãã®å Žåã«æ©èœããããšã蚌æãããŸãã ããã¯ãããŸããŸãªå質ã®éçºè ãå€æ°ãã倧èŠæš¡ãªãããžã§ã¯ãã§ã¯æªåããå¯èœæ§ããããŸãã 誰ã§ãã¬ãã¥ãŒãµãŒãäœæããããšã決å®ã§ããç¶æ ã®äžéšãæŽæ°ããã®ãé©åã§ãããšèããããšãã§ããŸãããã¹ãŠã®å¯èœãªæŽæ°ã·ãŒã±ã³ã¹ã§ãã¹ãŠã®ã¬ãã¥ãŒãµãŒãäžç·ã«ãã¹ãããæ¹æ³ãæ³åããããšã¯ã§ããŸããã
ãŠãŒã¹ã±ãŒã¹ã«ãã£ãŠã¯ããã®ç¶æ ãä¿è·ããããšãçã«ããªã£ãŠããå ŽåããããŸããããã¯ãã°ã€ã³ã§ããããã§ããããã¯éåžžã«éèŠãªæ©èœã§ãããåé¢ããå¿ èŠããããŸãã ãã®ç¶æ ããã¥ãŒã¬ã€ã€ãŒã§å¿ èŠãªå Žåã¯ãreact-routerã®å Žæã®ç¶æ ãããã€ãã®äŸã§Redux.stateã«è€è£œãããã®ãšåæ§ã®æ¹æ³ã§ãRedux.stateã«è€è£œããŸãã å·ãšããŒã ãå°ãããè¡åãè¯ãå Žåã¯ã1ãæã«ãŸãšããŠãåé¡ãããŸããã
@vladar @vladap
ãããŒããã®ãšã«ã ã®èŠç¹ã¯ãããã¯ãŒã«ã§ãïŒ ãŸãã Cycle.jsã®ããã©ã€ããŒãã¢ãŒããã¯ãã£ãŒãæãåºãããŸãã
@merkå®éãèªåŸãã°ã€ã³_EXPIREDã¯ãã¢ã¯ã·ã§ã³ãã°ã®æåŸã«ååŸããããªãã¬ã€ã«ãã£ãŠããã«åŠçããããã¢ã¯ã·ã§ã³ãã°ã«ãŸã£ããå°éããªãããããªãã¬ã€ã«ã¯ããŸã圱é¿ããŸãã-ããããŸãããªãã¬ã€ãã©ã®çšåºŠæ£ç¢ºã«å®è£ ãããŠãããã
@gaeroné«ã¬ãã«ã§ã¯ãElm and Cycleã¯ãæ£ããç解ããŠããã°ã説æããããšããŠãããã¿ãŒã³ãå®è£ ããŠããããã§ãã åºæ¬ãã©ãããã©ãŒã ãæäŸãããã©ãŠã¶ãŒããããŸãããã®ãã©ãããã©ãŒã ããµãŒãã¹ã¬ã€ã€ãŒïŒhttpãdb ...ïŒã§æ¡åŒµããŠãã¢ããªã®ãã©ãããã©ãŒã ãæ§ç¯ããŸãã 次ã«ããµãŒãã¹ã¬ã€ã€ãŒãšçžäºäœçšããçŽç²ãªã¢ããªããµãŒãã¹ã¬ã€ã€ãŒãšéæ¥çã«éä¿¡ã§ããããã«ãããããçš®ã®æ¥çå€ãå¿ èŠã§ããããã«ãããã¢ããªã¯å®è¡ãããããšãèšè¿°ã§ããŸãããå®éã«ã¯å®è¡ãããŸããïŒCycleãã©ã€ããŒã«éä¿¡ãããã¡ãã»ãŒãžãElm Effectsã¿ã¹ã¯ã®ãªã¹ããæã£ãŠããïŒã ç§ã®ã¢ããªã¯ããŒã¿æ§é ã䜿çšããŠãããã°ã©ã ããæ§ç¯ããŠãããšèšããŸãïŒããŒã¿ãã³ãã©ãšããŠã®ã³ãŒããæãåºãããŸãïŒãããã¯å®è¡ã®ããã«ãµãŒãã¹ã¬ã€ã€ãŒã«æž¡ãããã¢ããªã¯ãã®ãããã°ã©ã ãã®çµæã«ã®ã¿é¢å¿ãããããããé©çšãããŸãããã®ç¶æ ã«ã
@merk ïŒããã«ã ããŒã¯ã³ãšãã®æå¹æéãRedux.state /ãŸãã¯ä»ã®jsãµãŒãã¹ã®ã©ããã«é 眮ãããå ŽåããŠãŒã¶ãŒãæ°ããã¿ãã§ã¢ããªãéãããšãã«ããŒã¯ã³ã¯è»¢éãããŸããã ãŠãŒã¶ãŒã¯ããã°ã«èšé²ããããŸãŸã«ãªãããšãæåŸ ããŠãããšæããŸãã ãããã£ãŠããã®ç¶æ ã¯å®éã«ã¯SessionStoreã«ããã¯ãã ãšæããŸãã
ããããªããŠããããŒã¯ã³ã®æå¹æéããŠãŒã¶ãŒæ å ±ã®å³æã¯ãªãŒã³ã¢ãããš/ loginãžã®ç§»è¡ãæå³ããªãå Žåãç¶æ ãåé¢ãããå¯èœæ§ããããŸãã ãŠãŒã¶ãŒãã€ã³ã¿ã©ã¯ã·ã§ã³ã§ãµãŒããŒã«è§ŠããªããŸã§ïŒååãªããŒã¿ããã£ãã·ã¥ãããŠããïŒããŠãŒã¶ãŒã¯äœæ¥ãç¶è¡ã§ãããµãŒããŒãå¿ èŠãšããäœããå®è¡ããå Žåã«ã®ã¿LOGIN_EXPIREDã¢ã¯ã·ã§ã³ãããªã¬ãŒãããŸãã Redux.stateã«åºã¥ãisLoggedç¶æ ã¯ãæå¹ãªããŒã¯ã³ãååšããããšãæå³ããå¿ èŠã¯ãããŸããã Redux.stateã®isLoggedç¶æ ã¯ãã¬ã³ããªã³ã°ãã察象ã決å®ããããã«äœ¿çšãããŸããããŒã¯ã³ã®åšå²ã®ç¶æ ã¯ããã¥ãŒã¬ã€ã€ãŒã«é衚瀺ã«ããŠããã¥ãŒã¬ã€ã€ãŒã«åœ±é¿ãäžãããã®ãé€ããŠãã¢ã¯ã·ã§ã³ããªãã¥ãŒãµãŒãèšè¿°ããã«ãã¢ã¯ã·ã§ã³äœæè ã¬ãã«ã§ã®ã¿ç¶æã§ããŸãã
@vladarç§ã¯ããªãã®äžè¬çãªãã€ã³ããåŸããããããªããšæããŸãã ä»ãŸã§æ°ã¥ããªãã£ããšæããŸãã
ã¬ãã¥ãŒãµãŒããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å¶åŸ¡ãæ»ããããã€ãã®å€ãæž¡ãæ¹æ³ã¯ç°¡åã§ã¯ãããŸããã ãããã®å€ã¯ã¬ã³ããªã³ã°ã«å¿ èŠã§ã¯ãªããäžæçãªãã®ã§ãããããŸãããéåææäœãéå§ããããã«å¿ èŠã§ãããšä»®å®ããŸãããã
actionCreator() {
... getState
... some logic L1
... dispatch({ACTION1})
}
reducer() {
case ACTION1
... some logic L2
... x, y result from L2
... some logic L3
... resulting in new state
... return new state
}
ã¬ãã¥ãŒãµãŒã§èšç®ãããxãyã䜿çšããŠéåææäœãéå§ããæ¹æ³ã«ã¯3ã€ã®ãªãã·ã§ã³ããããŸãã ãããã®ã©ããå®ç§ã§ã¯ãããŸããã
1ïŒããžãã¯ãã¬ãã¥ãŒãµãŒããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ç§»åããããããªããŒãã®ãã¯ãŒãæžãããŸãã ã¬ãã¥ãŒãµãŒã¯ãã ç¶æ ã¢ããããŒã¿ãŒã§ããããããžãã¯L3以éãåããŠããŸãã
2ïŒxãyãRedux.stateã«ä¿åããäžæç/äžæçãªå€ã§æ±æããåºæ¬çã«ãç§ã奜ãã ãšç¢ºä¿¡ããŠããªãã¬ãã¥ãŒãµãŒãšã¢ã¯ã·ã§ã³äœæè ã®éã®ã°ããŒãã«éä¿¡ãã£ãã«ãšããŠäœ¿çšããŸãã å®éã®ç¶æ ã§ããã°åé¡ãªããšæããŸããããã®ãããªå€ã§ã¯åé¡ãããŸããã ã¢ã¯ã·ã§ã³äœæè ã¯æ¬¡ã®ããã«å€æŽãããŸãã
actionCreator() {
... getState
... some logic L1
... dispatch({ACTION1})
// I assume I get updated state if previous dispatch is sync.
// If previous dispatch is async it has to be chained properly.
// If updated state can't be received here after a dispatch
// then I would think there is a flaw.
... getState
... asyncOperation(state.x, state.y)
}
3ïŒxãyãç¶æ ã«ä¿åãããããäžéšã®ã³ã³ããŒãã³ãã®å°éå ·ãšããŠäœ¿çšããcomponentWillReceivePropsã䜿çšããŠãã¥ãŒã¬ã€ã€ãŒã«ãŒãå šäœã«ãã³ããªã³ã°ããŠãæ°ããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãšéåææäœãããªã¬ãŒããŸãã ç§ã«èšãããã°ææªã®éžæè¢ã§ãããããžãã¹ããžãã¯ãããããšããã«åºããŸãã
@vladar
äžè¬ã«ããã®æäœã®çµæãã¢ã¯ã·ã§ã³ãšããŠããã¯ããããã£ã¹ããããããã¬ãã¥ãŒãµãŒã«ãã£ãŠé©çšãããéããéåæãéå§ãããå Žæã¯éèŠã§ã¯ãããŸããã ããã¯åãããã«åäœããŸãã ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãŸãã¯ã¹ãã¢ã§éåæãéå§ããå¿
èŠããããã©ããã¯ãããã©ãã©ãã¯ã¹ã®å Žåãšåãã§ãã
Reduxãåçæã«ãããã®éåæåŒã³åºããèå¥ããŠç¡èŠã§ããå¿ èŠããããŸããããã¯ãŸãã«ããªããææ¡ããŠããããšã§ãã
ã¬ãã¥ãŒãµãŒããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å¶åŸ¡ãæ»ããããã€ãã®å€ãæž¡ãæ¹æ³ã¯ç°¡åã§ã¯ãããŸããã
ãããçç¶ã®äžã€ã ãšæããŸãã 2çªç®ã®äŸã¯ãç§ã®èŠç¹ãéåžžã«ãã瀺ããŠããŸãïŒä»¥äžãåç §ïŒã
ïŒFSMã®äžçã§ã®ïŒç¶æ é·ç§»ã®äžè¬åããããããŒãæ€èšããŠãã ããã
çŸåšã®ç¶æ ãéèŠã§ããããšã«æ³šæããŠãã ããïŒ åãã€ãã³ãããçŸåšã®ç¶æ ã«å¿ããŠç°ãªãçµæã«ã€ãªããå¯èœæ§ããããŸãã ãããŠããã®çµæãã¹ããã3ã§ã®æäœïŒãŸãã¯åŒæ°ïŒã®ã·ãŒã±ã³ã¹ãç°ãªããŸãã
ã€ãŸããããã¯ãã¢ã¯ã·ã§ã³ãåæããŠãããšãã«Fluxã®ç¶æ é·ç§»ãã©ã®ããã«æ©èœããããšã»ãŒåãã§ãã ããªãã®ã¬ãã¥ãŒãµãŒ/ã¹ãã¢ã¯ç¢ºãã«FSMã§ãã
ããããéåæã¢ã¯ã·ã§ã³ã¯ã©ãã§ããïŒ éåæã¢ã¯ã·ã§ã³ã䜿çšããFluxã®äŸã®ã»ãšãã©ã¯ãå転ããŠãããšæããããã®ã§ãã
ãããã£ãŠãçŸåšã®ç¶æ ã¯ç¡èŠãããã¿ãŒã²ããã®ç¶æ ã¯åžžã«åãã§ãããšèŠãªãããŸãã å®éã«ã¯ãäžè²«ããç¶æ é·ç§»ãããŒã¯åãã§ãã ãããŠããã¯ãã®ããã«èŠããå¿ èŠããããŸãïŒACã䜿çšïŒïŒ
ãŸãã«ããªãã®2çªç®ã®äŸã ãããã®ãã¹ãŠã®ã¹ããããåžžã«å¿ èŠã§ãããšèšã£ãŠããã®ã§ã¯ãããŸããã å€ãã®å Žåããããã®äžéšãçç¥ã§ããŸãã ããããè€éãªã±ãŒã¹ã§ã¯ããããããªããè¡åããªããã°ãªããªãæ¹æ³ã§ãã ããã¯ãä»»æã®ç¶æ é·ç§»ã®äžè¬åããããããŒã§ãã ãŸããFSMã®å¢çãAC察ã¬ãã¥ãŒãµãŒ/ã¹ãã¢ã«ç§»åããããšãæå³ããŸãã
ããããå¢çã移åãããšãä»ã®åé¡ãçºçããŸãã
ã»ãšãã©ã®åé¡ã¯ãã»ãšãã©ã®Webã¢ããªã®åçŽãªç¶æ èŠä»¶ã«ãã£ãŠé ãããŠããããšã«æ³šæããŠãã ããã ããããè€éãªã¹ããŒããã«ã¢ããªãããå Žåã¯ãééããªããããã®ç¶æ³ã«çŽé¢ããŸãã
ã»ãšãã©ã®å Žåãããããããããçš®é¡ã®åé¿çãæãä»ãã§ãããã ãã ããç¶æ é·ç§»ããžãã¯ãããé©åã«ã«ãã»ã«åãããFSMãACãšã¬ãã¥ãŒãµãŒã®éã§åé¢ãããŠããªãå Žåã¯ãããããããããåé¿ã§ããŸãã
æ®å¿µãªãããç¶æ
é·ç§»ã®ãå¯äœçšãéšåã¯äŸç¶ãšããŠç¶æ
é·ç§»ã®äžéšã§ãããåå¥ã®ç¬ç«ããããžãã¯ã§ã¯ãããŸããã ãã®ãããç§ã«ãšã£ãŠ(state, action) => (state, sideEffects)
ã¯ããèªç¶ã«èŠããŸãã ãããããã¯ãããreduceãã·ã°ããã£ã§ã¯ãããŸããïŒ
ïŒãããããã¬ãŒã ã¯ãŒã¯ã®ãã¡ã€ã³ã¯ããŒã¿å€æã§ã¯ãªããç¶æ
é·ç§»ã§ãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãŸãã¯ã¹ãã¢ã§éåæãéå§ããå¿ èŠããããã©ããã¯ãããã©ãã©ãã¯ã¹ã®å Žåãšåãã§ãã
ã¯ãããã ããFluxã¯ãéåæã³ãŒã«ããã¯ã§ãã£ã¹ãããïŒïŒããããç¶æ ãçŽæ¥å€æŽããéããã¹ãã¢ã«éåæã®ãã®ã眮ãããšãçŠæ¢ããŠããŸããã ã»ãšãã©ã®å®è£ ãéåæã«ACã䜿çšããããšãæšå¥šãããšããŠãããããã¯äžçš®ã®æèŠããããŸããã å人çã«ã¯ãACãã³ã³ãããŒã©ãŒãšããŠæ±ãæ¹ãFSMã«ç²Ÿç¥çã«ç§»è¡ããããã粟ç¥çã«äŸ¿å©ãªã®ã§ãMVCã圷圿ãšããããšæããŸãã
@vladar
(state, action) => (state, sideEffects)
èãäžã ã€ãŸããcombineReducersé¢æ°ã®æ»ãå€ã®åã[stateãSideEffects]ãŸãã¯[stateã[SideEffects]]ã«å€æŽãããã®ã³ãŒããå€æŽããŠãã¬ãã¥ãŒãµãŒããã®SideEffectsãçµã¿åãããå¿ èŠããããŸãã å ã®ïŒç¶æ ãã¢ã¯ã·ã§ã³ïŒ=>ç¶æ ãªãã¥ãŒãµãŒã¿ã€ãã¯ãcombineReducersãïŒç¶æ ïŒæ»ãå€ã®åã[ç¶æ ]ãŸãã¯[ç¶æ ã[]]ã«åŒ·å¶å€æããããããµããŒãããããŸãŸã«ãªãå¯èœæ§ããããŸãã
次ã«ãReduxã®ã©ããã«SideEffectsãå®è¡ããŠãã£ã¹ãããããå¿ èŠããããŸãã ããã¯ãæ°ããç¶æ ãé©çšããSideEffectsãªã¹ããå®è¡ããŠãã£ã¹ãããããStore.dispatchïŒïŒã§å®è¡ã§ããŸãã çµããã®ãªãçŽ æŽãããååž°ã«å ¥ãããšãã§ãããã©ãããèããŠããŸãã
ãããã¯ãããã«ãŠã§ã¢ã¬ãã«ã®ã©ããã§å®è¡ããããšãã§ããŸãããStore.dispatchã¯ã¢ã¯ã·ã§ã³ãšãšãã«SideEffectsãªã¹ããè¿ãå¿ èŠããããšæããŸãã
@vladar https://github.com/gaearon/redux/issues/291#issuecomment -125267259
@vladar
ã¯ãããã ããFluxã¯ãéåæã³ãŒã«ããã¯ã§ãã£ã¹ãããïŒïŒããããç¶æ ãçŽæ¥å€æŽããéããã¹ãã¢ã«éåæã®ãã®ã眮ãããšãçŠæ¢ããŠããŸããã ã»ãšãã©ã®å®è£ ãéåæã«ACã䜿çšããããšãæšå¥šãããšããŠãããããã¯äžçš®ã®æèŠããããŸããã å人çã«ã¯ãACãã³ã³ãããŒã©ãŒãšããŠæ±ãæ¹ãFSMã«ç²Ÿç¥çã«ç§»è¡ããããã粟ç¥çã«äŸ¿å©ãªã®ã§ãMVCã圷圿ãšããããšæããŸãã
ActionCreatorsãã³ã³ãããŒã©ãŒãšããŠæ±ãã®ã¯è¯ãèãæ¹ã§ã¯ãªãããšã«åæããŸãã è€éãªããžãã¯ã®å Žåãã¬ãã¥ãŒãµãŒããACã«å¶åŸ¡ãæ»ãå¿ èŠããããšèããŠããŸãã®ã¯æ ¹æ¬çãªåå ã§ãã ç§ã¯ãããå¿ èŠãšãã¹ãã§ã¯ãããŸããã ACãéåæãåŠçããå Žåããããã¯ããããèŠæ±ãã³ãã©ãŒã®ããã§ããå¿ èŠããããŸã-ã©ããã§è¡ããã決å®ã«åºã¥ããŠå®è¡ããããã®èŠæ±ã¯ãã¡ã€ã³ã暪æããã¹ãã§ã¯ãããŸããã
ã³ã³ãããŒã©ãšããŠã®åœ¹å²ãåé¿ããããã®å¯äžã®ãªãã·ã§ã³ã¯ãã¹ããŒãã³ã³ããŒãã³ããä»ããŠããžãã¯ãã«ãŒãã£ã³ã°ããActionCreatorsã䜿çšããŠãUIãžã®çŽæ¥å¿çã§ããžãã¯ã®æåã®ã¹ããããå®è¡ããããšã§ãã å®éã®æåã®æ±ºå®ã¯ãRedux.stateããã³/ãŸãã¯ã³ã³ããŒãã³ãã®ããŒã«ã«ç¶æ ã«åºã¥ããŠã¹ããŒãã³ã³ããŒãã³ãã§è¡ãããŸãã
ã«ããŽãªãåé€ããwebapiã䜿çšããŠå¿çããŠä»ã®äœããæŽæ°/åé€ãããšããåã®äŸã®ãã®ã¢ãããŒãã¯ãè¯ããããŸããã ç§ã¯ãããéçºè ã®å¥œã¿ã«åºã¥ããŠç°ãªãæè¡ã®æ··åã«ã€ãªãããšæããŸã-ããã¯ACãã¬ãã¥ãŒãµãŒãã¹ããŒãã³ã³ããŒãã³ãã«ããã¹ãã§ããïŒ ãã¿ãŒã³ãã©ã®ããã«é²åãããèŠãŠã¿ãŸãããã
éåæé話ãåºèããé ãããããã«ãã€ã³ããè³Œå ¥ããŠããŸããã ããããç§ã¯ãããæå¹ã§ãããšã¯æããŸããããªããªããç§èŠã§ã¯ãã©ããã§è€éããå€§å¹ ã«é«ãŸãããã§ãã äžæ¹ãã¹ãã¢/ãªãã¥ãŒãµãŒã§éåæé¢æ°ãå®è¡ããŠãã£ã¹ãããããã ãã®å ŽåããŸãã¯çŽç²ãªã¢ãããŒãã§ãããã®é¢æ°ãããŒã¿ãšããŠåŠçããé ãé¢ããå Žæã§ããªã¬ãŒããéããããã»ã©è€éã§ã¯ãããŸããã
ã¢ã¯ã¿ãŒãåæ§ã«ãéåæãå®è¡ããŠã¡ãã»ãŒãžïŒã¢ã¯ã·ã§ã³ãªããžã§ã¯ãïŒãä»ã®ã¢ã¯ã¿ãŒã«éä¿¡ããããèªåèªèº«ã«éä¿¡ããŠFSMãç¶è¡ãããã§ããŸãã
ããã«ã¯å®çšçãªãã®ããªãããã§ãã®ã§ãç· ãããããŸãã éåæã¢ã¯ã·ã§ã³ããã¥ã¡ã³ãã¯ãã»ãšãã©ã®è³ªåã«çããã¯ãã§ãã å®è¡ã§ããå®éã®ã³ãŒãããªããã°ãçè«çãªè°è«ã¯ç§ã«ã¯äŸ¡å€ããªãããã«æãããŸãã ;-)
@gaearonã¯ãAPIåŒã³åºããåŠçããæ£ããæ¹æ³ãå®è£ ããå®éã®ã³ãŒããreduxã䜿çšããäŸã®1ã€ã«è¿œå ã§ããŸããïŒããã«ãŠã§ã¢ã䜿çšãããå®éã®ãäŸã®å€ïŒïŒ
ãã¹ãŠã®ããã¥ã¡ã³ããèªãã åŸã§ãå®éã®é 眮ã«ã€ããŠè³ªåãããããã®åé¡ãæ°åããããã®å¯äœçšãé 眮ãããã¡ã€ã«ãç解ããã®ã«åé¡ããããŸãhttps://github.com/rackt/redux/issues/291#issuecomment -123010379 ã ããã¯ããã®åé¡ã®ã¹ã¬ããããã®ãæ£ãããäŸã ãšæããŸãã
ãã®åéã®èª¬æãäºåã«æè¬ããŸãã
äžçŽãªã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«ã€ããŠã®éèŠãªèããææããããšæããŸãã
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«éåæåŒã³åºããå ¥ããããšããŸãã¯äžè¬çã«äžçŽãªã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãæã€ããšã¯ãç§ã«ãšã£ãŠå€§ããªæ¬ ç¹ã1ã€ãããŸããããã¯ãã¢ããªã±ãŒã·ã§ã³ã®å¶åŸ¡ããžãã¯ãå®å šã«ã¹ã¯ããã¢ãŠãããããšã¯ãã¹ãã¢ãã¹ã¯ããã¢ãŠãããããšã»ã©åçŽã§ã¯ãªãããã«ãå¶åŸ¡ããžãã¯ããã©ã°ã¡ã³ãåããããšã§ããäœæè ã ç§ã¯åžžã«éåæããã»ã¹ã«ããã«ãŠã§ã¢ã䜿çšããäžçŽãªã¢ã¯ã·ã§ã³äœæè ãå®å šã«åé¿ããã€ããã§ãã
ç§ãéçºããŠããã¢ããªã«ã¯ãå°ãªããšã2ã€ã®ããŒãžã§ã³ããããŸãã1ã€ã¯ãªã³ãµã€ãã®Raspberry Piã§å®è¡ããããã1ã€ã¯ããŒã¿ã«ãå®è¡ããŸãã 顧客ãéå¶ãããããªãã¯ããŒã¿ã«/ããŒã¿ã«çšã«åå¥ã®ããŒãžã§ã³ãååšããå ŽåããããŸãã ç°ãªãAPIã䜿çšããå¿ èŠããããã©ããã¯å®ãã§ã¯ãããŸããããå¯èœãªéããã®å¯èœæ§ã«åããããšèããŠããŸããããã«ãŠã§ã¢ã䜿çšãããšããããå¯èœã«ãªããŸãã
ãããŠç§ã«ãšã£ãŠãã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒéã§APIåŒã³åºããåæ£ããããšããæŠå¿µã¯ãç¶æ ã®æŽæ°ãéäžç®¡çãããšããReduxã®æŠå¿µã«å®å šã«åããŠããŸãã 確ãã«ãAPIãªã¯ãšã¹ããããã¯ã°ã©ãŠã³ãã§å®è¡ãããŠãããšããåãªãäºå®ã¯ãReduxã¹ãã¢ã®ç¶æ ã®äžéšã§ã¯ãããŸããããããã§ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ã§ãããæ£ç¢ºã«å¶åŸ¡ããå¿ èŠããããŸãã ãããŠãReduxã¹ãã¢/ãªãã¥ãŒãµãŒã®ããã«ãå¶åŸ¡ãåæ£ã§ã¯ãªãéäžåãããŠããå Žåã«ãæãæ£ç¢ºã«å¶åŸ¡ã§ããããšãããããŸããã
@ jedwards1211ãŸã ãã§ãã¯ã¢ãŠãããŠããªãå Žåã¯ã httpsïŒ//github.com/redux-effects/redux-effectsã«èå³ããããããããŸããããŸããïŒ569ã§ã®è°è«ã«ãèå³ããããããããŸããã
@gaearonãã£ããããææããŠãããŠããããšãïŒ ãããã«ãããç§èªèº«ã®ããã«ãŠã§ã¢ã䜿çšããããšã¯ãããŸã§ããã»ã©é£ãããããŸããã§ãã:)
Elmã®ãããªã¢ãããŒããäœæããŸããïŒ redux-side-effect ã READMEã¯ã¢ãããŒãã説æããããã代æ¿æ¡ãšæ¯èŒããŸãã
@gregwebs redux-side-effect
奜ãã§ãããè€æ°ã®ç°ãªãã¹ãã¢ã³ã³ãã£ã®ã¥ã¬ãŒã¿ãŒãããå Žåã sideEffect
é¢æ°ãã¬ãã¥ãŒãµãŒã¢ãžã¥ãŒã«ã«ã©ã®ããã«åã蟌ãããšããåé¡ããããããã¹ã¯ããå¯èœãªå¶åŸ¡ããžãã¯ã§ãæ±ãã«ããã§ããããããŸããŸãªãã«ãã§äœ¿çšãããã¢ãžã¥ãŒã«ã
ãã ããé¢çœãããã¯ã䜿çšããããšãã§ããŸãã sideEffect
ãstate
èªäœã«æ ŒçŽããã ãã§ãã¬ãã¥ãŒãµãŒãèªåçã«å©çšã§ããããã«ãªããŸãã ïŒstuck_out_tongue_winking_eyeïŒ
https://github.com/rackt/redux/pull/569/ã®ãããªãã®ã¯ãç§ãåãããæ¹æ³ã«ã»ãŒçæ³çã§ããããã¡ãããæšæºéšåã«ãªããªãéããæ¬çªãããžã§ã¯ãã§ã¯äœ¿çšããããããŸããã APIã®ã
ã¢ã€ãã¢ã¯æ¬¡ã®ãšããã§ããããã«ãŠã§ã¢ã«ã¢ã¯ã·ã§ã³ã«sideEffect
é¢æ°ãåºå®ãããŸãã å°ãããããŒã§ãããã¬ãã¥ãŒãµãŒãéåæã³ãŒããéå§ã§ããããã«ããããã«å¿
èŠãªå¯èœãªéãå°ããªå€æŽïŒ
sideEffectMiddleware.js
ïŒ
export default store => next => action => {
let sideEffects = [];
action.sideEffect = callback => sideEffects.push(callback);
let result = next(action);
sideEffects.forEach(sideEffect => sideEffect(store));
return result;
};
åçŽãªsideEffectã¢ãããŒãã«ã¯è€æ°ã®æ¹æ³ããããŸãã ããªã¢ã³ããè©ŠããŠãå ±åããŠãã ãã
äžèšã®sideEffectMiddleware
ã¢ãããŒãã䜿çšããããã«ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŸããããçµæãšããŠåŸãããã³ãŒãç·šæãæ¬åœã«æ°ã«å
¥ã£ãŠããŸãã sideEffect
é¢æ°ãã©ãããã§ãã¬ãã¥ãŒãµãŒã«ã€ã³ããŒãããå¿
èŠããªãã®ã¯çŽ æŽãããããšã§ãã action
ããŠããã ãã§ãã
@ jedwards1211ããã±ãŒãžã®ããŒãžã§ã³2.1.0ã§ãã³ãŒããactionSideEffectMiddleware
ãšããŠå
¬éããŸããã
@gregwebsãã£ãããïŒ ç§ãå ±åç·šéè ãšããŠãªã¹ãããŠãããŸãããïŒ
@ jedwards1211ããªããè¿œå ãããŸããã ãã¶ãããªãã¯é©åãªãªãã¬ã€ãµããŒããè¿œå ããã§ããã:)ç§ãããã䜿ã£ãŠãããšããã§ã¯ãŸã ãããå©çšããããšã¯ã§ããŸããã
@gaearonèšé²ããã³åçãããã¢ã¯ã·ã§ã³ã¯ãããã«ãŠã§ã¢ããŸã£ããééããªããšæããŸãããïŒ
圌ãã¯ããããŸããããã¯åœŒããèšé²ãããæãŸã§ã«åœŒãããã§ã«æçœãªãªããžã§ã¯ãã§ãããšããããšã ãã§ããããã§ããã«ãŠã§ã¢ã¯éåžžä»å ¥ããŸããã
@gaearonããŒãã ã ããç§ã¯å®éã«ãã®æ©èœãè©ŠããŠããŸããã...ããã€ãã®å¯äœçšããã«ãŠã§ã¢ãèšé²/åçãå£ãã ãããšæããŸããïŒ ããšãã°redux-effects-fetch
ãäŸã«ãšããšããã¬ãŒã³ãªããžã§ã¯ãã®FETCHã¢ã¯ã·ã§ã³ã«å¯ŸããŠajaxãªã¯ãšã¹ããå®è¡ããŸãã
function fetchMiddleware ({dispatch, getState}) {
return next => action =>
action.type === 'FETCH'
? fetch(action.payload.url, action.payload.params).then(checkStatus).then(deserialize, deserialize)
: next(action)
}
ã¬ã³ãŒããFETCHã¢ã¯ã·ã§ã³ã®steps
ãã[success, failure]
ã³ãŒã«ããã¯ãã¯ãªãŒã³ã¢ããããå Žåã redux-effects
ããã«ãŠã§ã¢ã¯ç¶æ
ãå€æŽããã¢ã¯ã·ã§ã³ããã£ã¹ãããããŸããããããã§ãå¿
èŠãããŸãããäžé£ã®ajaxãªã¯ãšã¹ããããªã¬ãŒããããã«åçããŸãã
redux-logger
ãããªãçŽç²ãªãããã«ãŠã§ã¢ïŒè¿œå ã®ã¢ã¯ã·ã§ã³ããã£ã¹ãããããªãïŒããäžçŽãªãããã«ãŠã§ã¢ïŒã¢ã¯ã·ã§ã³ããã£ã¹ãããããå¯èœæ§ãããïŒããåé¢ããæ¹æ³ã¯ãããŸããïŒ
æ®å¿µãªãããç§ã¯redux-effects
詳ãã調ã¹ãŠããªãã®ã§ãããªãã®è³ªåã«çããããšãã§ããŸããã
åé¡ãããŸããããããã«ãããã¬ã³ãŒããŒã¯ãããã«ãŠã§ã¢ãå¯äœçšãå®è¡ãããã©ããã決å®ããããã«äœ¿çšã§ããã¢ã¯ã·ã§ã³ã«ãã©ã°ãè¿œå ããŸããïŒ ç§ã¯èªåã®ããã«ãŠã§ã¢ã§devtoolsãæ£ãããµããŒãã§ããæ¹æ³ãèŠã€ããããšããŠããŸã
ããã§ã¯ãããŸããã devTools()
ã¯ãšã³ãã³ãµãŒæ§æãã§ãŒã³ã®_after_ applyMiddleware
ã«é
眮ããããšäºæ³ããããããã¢ã¯ã·ã§ã³ã«å°éãããŸã§ã«ãããã¯ãæçµçãªãã¢ã¯ã·ã§ã³ã§ããããã以äžã®è§£éã¯å¿
èŠãããŸããã
ããããªãã»ã©ãããã«ãŠã§ã¢ãå¯äœçšãå®è¡ããåŸãã¢ã¯ã·ã§ã³ãããã£ãŒã«ããåé€/埮調æŽããŠãåçæã«ããã«ãŠã§ã¢ãééãããšãã«å¯äœçšãããªã¬ãŒãããªãããã«ããããšãã§ããŸããéçºããŒã«ã§åäœããŸãããïŒ
ãããããã¯è¯ãæ¹æ³ã®ããã§ãã
çŽ æŽããããç§ãåçºããŠãããŠããããšãïŒ
@gaearon @vladar @ jedwards1211https ïŒ ã åºæ¬çã«ã¯elmish (state, action) => (state, sideEffects)
å®è£
ã§ãããã¬ãã¥ãŒãµãŒãã¿ãã«ãè¿ã代ããã«ïŒãã§ã«æ°ä»ããã®ã¯äžå¯èœã§ãïŒãçµæãçæããŸãã
ç§ã¯ããã«ããã§éãã ãããããªããŒããšãªãã¬ã€ã¯å€§äžå€«ã®ããã ã ãããŸã§ã®ãšãããreduxæ©èœãå£ããŠããããšã¯ãããŸããããäžçŽã®reduxerã®äžéšãäœããèŠã€ããå¯èœæ§ããããŸãã :)
ç§ã«ãšã£ãŠãããã¯reduxã¹ã¿ãã¯ãžã®éåžžã«éèŠãªè¿œå ã®ããã«èŠããŸããããã«ãããããžãã¯ãäž»ã«ã¬ãã¥ãŒãµãŒã«é
眮ããŠãå¹æïŒçµæãçŸåšã®ç¶æ
ã ãã«äŸåããªãé·ç§»ã¢ã¯ã·ã§ã³ïŒãå€éšãµãŒãã¹ã«å§ä»»ãããå¹æçã§ãã¹ãå¯èœãªã¹ããŒããã·ã³ã«ããããšãã§ããŸãïŒ Elmã®ã¢ãŒããã¯ãã£ããšãã§ã¯ãããµãŒãã¹ãšã»ãšãã©åãã§ãïŒã
ãã1ã€ã®ã¢ãããŒãã¯redux-sagaã§ããããããžã§ãã¬ãŒã¿ãŒã䜿çšããŸãããå¯äœçšãã¬ãã¥ãŒãµãŒããåé¢ããŸãã
ç§ã¯æå³@minedeljkovicä¿¡ãã@gaearon
ç§ã«ãšã£ãŠãããã¯reduxã¹ã¿ãã¯ãžã®éåžžã«éèŠãªè¿œå ã®ããã«èŠããŸããããã«ãããããžãã¯ãäž»ã«ã¬ãã¥ãŒãµãŒã«é 眮ããŠãå¹æïŒçµæãçŸåšã®ç¶æ ã ãã«äŸåããªãé·ç§»ã¢ã¯ã·ã§ã³ïŒãå€éšãµãŒãã¹ã«å§ä»»ãããå¹æçã§ãã¹ãå¯èœãªã¹ããŒããã·ã³ã«ããããšãã§ããŸãïŒ Elmã®ã¢ãŒããã¯ãã£ããšãã§ã¯ãããµãŒãã¹ãšã»ãšãã©åãã§ãïŒã
https://github.com/yelouafi/redux-saga/ã¯ã redux-thunk
åäœãšéåžžã«ãã䌌ãŠãããããåŸæ¥ã®ã¢ãããŒãã«å¯Ÿããäž»ãªå©ç¹ãšããŠãé·æéå®è¡ããããã©ã³ã¶ã¯ã·ã§ã³ã容æã«ããæ§æç³è¡£æ§æã®ä»£ããã«ã
äžæ¹ã httpsïŒ//github.com/salsita/redux-side-effectsã¯Elmã¢ãŒããã¯ãã£ã«äŒŒãŠããŸãã
ã¯ããredux-sagaãšredux-side-effectsã¯ããžã§ãã¬ãŒã¿ãŒã䜿çšããŠå¯äœçšã宣èšããããããsagasãšreducersãçŽç²ã«ä¿ã¡ãŸãã ããã¯äŒŒãŠããŸãã
ã¬ãã¥ãŒãµãŒã§ããã奜ã2ã€ã®çç±ïŒ
https://github.com/rackt/redux/issues/1139#issuecomment -165419770ã®ç§ã®ã³ã¡ã³ãã¯ã redux-saga
ãããã解決ãããã¢ãã«ãåãå
¥ãã以å€ã«ããã解決ããä»ã®æ¹æ³ããªããããåŒãç¶ãæå¹ã§ãã Elmã¢ãŒããã¯ãã£ã§äœ¿çšãããŸãã
redux-side-effectsã«ã€ããŠã®ç§ã®ãã€ã³ãã匷調ããããšããŠããç°¡åãªèŠç¹ã眮ããŸãïŒ //gist.github.com/minedeljkovic/7347c0b528110889aa50
ç§ã¯ããçŸå®ã®äžçãã§ååã ãšæãæãåçŽãªã·ããªãªãå®çŸ©ããããšããŸããããããã§ããã®è°è«ã®ããã€ãã®ãã€ã³ãã匷調ããŠããŸãã
ã·ããªãªã¯æ¬¡ã®ãšããã§ãã
ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãå人ãŠãŒã¶ãŒããŒã¿ãå
¥åããå¿
èŠãããããŠãŒã¶ãŒç»é²ãéšåããããŸãã ä»ã®å人ããŒã¿ã®äžã§ãåºçå°ã¯åœã®ãªã¹ãããéžæãããŸãã éžæã¯ãåœã®éžæããã€ã¢ãã°ã§å®è¡ããããŠãŒã¶ãŒã¯åœãéžæããéžæã確èªããããã£ã³ã»ã«ããããéžæã§ããŸãã ãŠãŒã¶ãŒãéžæã確èªããããšããŠããããåœãéžæãããŠããªãå Žåã¯ãèŠåããå¿
èŠããããŸãã
ã¢ãŒããã¯ãã£ã®å¶çŽïŒ
ãã®äŒè©±ã«é¢ããèŠç¹ã®æãéèŠãªéšåã¯ãcountrySelectionã¬ãã¥ãŒãµãŒãCONFIRM_SELECTIONã¢ã¯ã·ã§ã³ãåŠçããæ¹æ³ã«ãããŸãã
@gaearon ãç§ã¯äž»ã«ãæšæºã®reduxã«å ããŠreduxã®å¯äœçšãå¶çŽãèæ ®ããæãåçŽãªãœãªã¥ãŒã·ã§ã³ã®è¡šé¢ãæäŸãããšããç§ã®å£°æã«å¯Ÿããããªãã®æèŠãè©äŸ¡ããŸãã
ãã®ã·ããªãªãå®è£ ããããã®å¯èœãªä»£æ¿æ¡ïŒredux-side-effectsã䜿çšããã«ãredux-sagaãredux-thunkããŸãã¯ãã®ä»ã®æ¹æ³ã䜿çšïŒãéåžžã«é©çšãããŸãã
@ tomkis1 ãç§ã¯ããªãã®æèŠãããã«äŒããããš
ïŒãã®èŠç¹https://gist.github.com/minedeljkovic/9d4495c7ac5203def688ã«ã¯ãglobalActionsãåé¿ãããå®è£ ãå°ãç°ãªããŸãããã®ãããã¯ã§ã¯éèŠã§ã¯ãããŸãããã誰ãããã®ãã¿ãŒã³ã«ã€ããŠã³ã¡ã³ãããããšæããããããŸããïŒ
@minedeljkovicèŠç¹ãããããšãã ããªãã®äŸã«ã¯æŠå¿µçãªåé¡ã1ã€ãããŸãã redux-side-effects
ã¯ãå¯äœçšã®ã¿ã«äœ¿çšããããšãç®çãšããŠããŸãã ãã ããããªãã®äŸã§ã¯ãå¯äœçšã¯ãããŸããããé·å¯¿åœã®ããžãã¹ãã©ã³ã¶ã¯ã·ã§ã³ã§ããããã redux-saga
ãã¯ããã«é©ããŠããŸãã @slorberãš@yelouafiã¯ãããã«ãã£ãšå
ã
èšãæããã°ãç§ã«ãšã£ãŠæãæžå¿µãããåé¡ã¯ãã¬ãã¥ãŒãµãŒå
ã®æ°ããã¢ã¯ã·ã§ã³ã®åædispatching
ã§ãïŒhttps://github.com/salsita/redux-side-effects/pull/9#issuecomment-165475991ïŒïŒ
yield dispatch => dispatch({type: COUNTRY_SELECTION_SUCCESS, payload: state.selectedCountryId});
@slorberã«ã¯ãããžãã¹ã®å¯äœçšããšããçšèªãä»ããŠãããšredux-saga
ã¯ããã®ç¹å®ã®åé¡ã解決ããã®ã«åœ¹ç«ã¡ãŸãã
@mindjuiceããªãã®äŸãå®å šã«ç解ãããã©ããã¯ããããŸããããããã§ç€ºãããªã³ããŒãã£ã³ã°ã®äŸã奜ãã§ãïŒ https ïŒ
äœè³ã®ãã¿ãŒã³ã§ã¯ãããã€ãã®æé»çãªããšãæ瀺çã«ããããšãã§ããŸãã
ããšãã°ãã¢ã¯ã·ã§ã³ãå®è¡ããããšã«ãã£ãŠäœãèµ·ãã£ããã説æããã ãã§ïŒç§ã«ãšã£ãŠã¯éå»åœ¢ã§ããå¿
èŠããããããã€ãã³ãã奜ãã§ãïŒãããã€ãã®ããžãã¹ã«ãŒã«ãéå§ãããŠUIãæŽæ°ãããŸãã ããªãã®å Žåããšã©ãŒã®è¡šç€ºã¯æé»çã§ãã äœè³ã§ã¯ã確èªæã«ãåœãéžæãããŠããªãå Žåã¯ãã¢ã¯ã·ã§ã³ãNO_COUNTRY_SELECTED_ERROR_DISPLAYEDããªã©ããã£ã¹ãããããå¯èœæ§ããããŸãã ç§ã¯ãããå®å
šã«æçœã§ããããšã奜ã¿ãŸãã
ãŸããäœè³ã¯ã¢ãã«ã®éã®çµåç¹ãšããŠèŠãããšãã§ããŸãã
ããšãã°ãduck1ãšduck2ããããããããã«ããŒã«ã«ã¢ã¯ã·ã§ã³ããããŸãã 2矜ã®ã¢ãã«ãçµåãããšããã¢ã€ãã¢ãæ°ã«å
¥ããªãå ŽåïŒã€ãŸãã1矜ã®ã¢ãã«ã2矜ç®ã®ã¢ãã«ã®actionsCreatorsã䜿çšããïŒãäœãèµ·ãã£ãã®ãã説æãããŠãããè€éãªããžãã¹ã«ãŒã«ãçžäºã«çµã³ä»ããäœè³ãäœæããããšãã§ããŸããã¢ãã«2矜ã
ãã£ãããããã¯ãã¡ããã¡ãé·ãã¹ã¬ããã§ããããŸã åé¡ã®è§£æ±ºçã¯ãããŸããïŒ
éåæã®action()
ãããã³ãŒãããšã©ãŒã瀺ãããçµæã衚瀺ããå¿
èŠããããšããŸãã
æåã®ã¢ãããŒãã¯ããã次ã®ããã«ããããšã§ãã
// the action call
action().then(dispatch(SUCCESS)).catch(dispatch(FAILURE))
// the reducer
case SUCCESS:
state.succeeded = true
alert('Success')
case FAILURE:
state.succeeded = false
alert('Failure')
ããããã¬ãã¥ãŒãµãŒã«ã¯ãå¯äœçšããå«ãŸããŠãããããRedux-wayã§ã¯ãªãããšãããããŸããïŒãããäœãæå³ããã®ãããããŸããïŒã
ç°¡åã«èšãã°ãæ£ããæ¹æ³ã¯ããããã®alert()
ã¬ãã¥ãŒãµãŒããã©ããã«ç§»åããããšã§ãã
ããã¯ã©ããã«ããããaction
ãšåŒã¶Reactã³ã³ããŒãã³ãã§ããå¯èœæ§ããããŸãã
ã ããä»ç§ã®ã³ãŒãã¯æ¬¡ã®ããã«ãªããŸãïŒ
// the reducer
case SUCCESS:
state.succeeded = true
case FAILURE:
state.succeeded = false
// the React component
on_click: function()
{
action().then
({
dispatch(SUCCESS)
alert('Success')
// do something else. maybe call another action
})
.catch
({
dispatch(FAILURE)
alert('Failure')
// do something else. maybe call another action
})
}
ããã¯ä»ãããè¡ãæ£ããæ¹æ³ã§ããïŒ
ãŸãã¯ãããã«èª¿æ»ããŠãµãŒãããŒãã£ã®ã©ã€ãã©ãªãé©çšããå¿
èŠããããŸããïŒ
Reduxã¯æ±ºããŠåçŽã§ã¯ãããŸããã å®éã®ã¢ããªã®å Žåãç解ããã®ã¯ç°¡åã§ã¯ãããŸããã Mabyeã¯ãæ£ããæ¹æ³ã瀺ãæšæºçãªäŸãšããŠãå®éã®ã¢ããªãªããžããªã®ãµã³ãã«ãå¿ èŠã§ãã
@ Halt-hammerzeitReduxèªäœã¯éåžžã«ã·ã³ãã«ã§ãã çŽããããæçåã¯ãReduxã䜿çšããéã®ã¬ãã¥ãŒãµãŒããã®å¯äœçšã®çµ±å/åé¢ã«é¢ããããŸããŸãªããŒãºãæèŠããæ¥ãŠããŸãã
ãŸããæçåã¯ãReduxã§å¿ èŠãªå¯äœçšãå®è¡ããã®ã¯ããã»ã©é£ãããªããšããäºå®ããçããŠããŸãã ç§èªèº«ã®åºæ¬çãªå¯äœçšããã«ãŠã§ã¢ãããŒã«ããã®ã«çŽ10è¡ã®ã³ãŒãããããããŸããã§ããã ã ããããªãã®èªç±ãåãå ¥ãããæ£ãããæ¹æ³ã«ã€ããŠå¿é ããªãã§ãã ããã
@ jedwards1211 ãReduxèªäœãã«ã¯äŸ¡å€ãæå³ããªãããã®äž»ãªç®çã¯Fluxéçºè ã®æ¥åžžã®åé¡ã解決ããããšã§ããããæå³ããããŸããã ããã¯ãAJAXãçŸããã¢ãã¡ãŒã·ã§ã³ããã®ä»ãã¹ãŠã®_éåžžããã³æåŸ ããã_ãã®ãæå³ããŸã
@ halt-hammerzeitããã«ãã€ã³ãããããŸãã Reduxã¯ç¢ºãã«ãã»ãšãã©ã®äººã«ç¶æ ã®æŽæ°ã管çããæ¹æ³ã«ã€ããŠåæããŠãããããšãç®çãšããŠããããã§ãããããã£ãŠãã»ãšãã©ã®äººãå¯äœçšã®å®è¡æ¹æ³ã«ã€ããŠåæããŠããªãã®ã¯æ®å¿µã§ãã
ãªããžããªã®ãexamplesããã©ã«ããèŠãããšããããŸããïŒ
å¯äœçšãå®è¡ããæ¹æ³ã¯è€æ°ãããŸãããäžè¬çã«ã¯ããã¹ãŠã®äŸã§è¡ãããã«ãReduxã®å€éšãŸãã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®å éšã§å®è¡ããããšããå§ãããŸãã
ã¯ããç§ã¯ç¥ã£ãŠããŸã...ç§ãèšã£ãŠããã®ã¯ããã®ã¹ã¬ããã¯ãå¯äœçšãå®è¡ããããã®æè¯ã®æ¹æ³ã«ã€ããŠã®ïŒå°ãªããšãããã®äººã ã®éã§ïŒã³ã³ã»ã³ãµã¹ã®æ¬ åŠã瀺ããŠããŸãã
ããããã»ãšãã©ã®ãŠãŒã¶ãŒã¯ãµã³ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã䜿çšããŠãããç§ãã¡ã¯åãªãå€ãå€ã§ãã
^圌ãèšã£ãããšã
ç§ã¯ãã¹ãŠã®æé«ã®å¿ãåäžã®æ£ãã解決çã«åæããããšãæã¿ãŸã
9000ã®ç»é¢ãèªãå¿
èŠããªãããã«ç³ã«å»ã¿ãŸã
糞
2016幎1æ7æ¥æšææ¥ãAndyEdwardsã®[email protected]ã¯æ¬¡ã®ããã«æžããŠããŸãã
ã¯ããç§ã¯ç¥ã£ãŠããŸã...ç§ãèšã£ãŠããã®ã¯ããã®ã¹ã¬ããã¯äžè¶³ããŠããããšã瀺ããŠããŸã
ãµã€ããå®è¡ããããã®æè¯ã®æ¹æ³ã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ïŒå°ãªããšãããã®äººã ã®éã§ïŒ
å¹æãâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rackt/redux/issues/291#issuecomment-169751432 ã
ã ãããç§ã¯æšæž¬ãããçŸåšåæãããŠãããã«ãŒã·ã§ã³ã¯ãå®éã«ãã¹ãŠãè¡ãããšã§ã
ã¯ãªãšã€ã¿ãŒã ç§ã¯ããã®ã¢ãããŒãã䜿çšããŠã¿ãŠãæ¬ é¥ãèŠã€ããå Žåã«åããŠ
ããã«æçš¿ããŸã
2016幎1æ7æ¥æšææ¥ãÐОкПлайÐÑÑÑЌПвkuchumovn @ gmail.comã¯æ¬¡ã®ããã«æžããŠããŸãã
^圌ãèšã£ãããšã
ç§ã¯ãã¹ãŠã®æé«ã®å¿ãåäžã®æ£ãã解決çã«åæããããšãæã¿ãŸã
9000ã®ç»é¢ãèªãå¿ èŠããªãããã«ç³ã«å»ã¿ãŸã
糞2016幎1æ7æ¥æšææ¥ãAndy Edwards < [email protected]
<_e i = "16">ã¯ããç§ã¯ç¥ã£ãŠããŸã...ç§ãèšã£ãŠããã®ã¯ããã®ã¹ã¬ããã¯äžè¶³ããŠããããšã瀺ããŠããŸã
ãµã€ããå®è¡ããããã®æè¯ã®æ¹æ³ã«ã€ããŠã®ã³ã³ã»ã³ãµã¹ïŒå°ãªããšãããã®äººã ã®éã§ïŒ
å¹æãâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rackt/redux/issues/291#issuecomment-169751432 ã
ãããšåæ§ã®ã¹ã¬ãããååšããã®ã¯ãReduxãŠãŒã¶ãŒã®1ïŒ ããå¯äœçšã«å¯ŸããŠãã匷åã§çŽç²ãªå®£èšåã®ãœãªã¥ãŒã·ã§ã³ãæ¢ããŠããããã§ãã 誰ãåæã§ããªããšããå°è±¡ãæããªãã§ãã ããã ãµã€ã¬ã³ãããžã§ãªãã£ã¯æèãšçŽæã䜿çšãããã®ã¢ãããŒãã«ã»ãšãã©æºè¶³ããŠããŸãã ããããä»ã®æè¡ãšåæ§ã«ãæ¬ ç¹ãšãã¬ãŒããªãããããŸãã è€éãªéåæããžãã¯ãããå Žåã¯ã代ããã«Reduxãåé€ããŠRxãæ¢çŽ¢ããããšããå§ãããŸãã Reduxãã¿ãŒã³ã¯Rxã§ç°¡åã«è¡šçŸã§ããŸãã
ã¯ããããããšã
2016幎1æ7æ¥ïŒæšææ¥ïŒã«ã¯ããã³ã»ã¢ãã©ã¢ãç£ç£ã®[email protected]ã¯æžããŸããïŒ
ReduxãŠãŒã¶ãŒã®1ïŒ ãæ¢ããŠããã®ã§ããããšåæ§ã®ã¹ã¬ãããååšããŸã
å¯äœçšã®ããã®ãã匷åãª/çŽç²ãª/宣èšåã®ãœãªã¥ãŒã·ã§ã³ã ããªãã§ãã ãã
誰ãããã«åæã§ããªããšããå°è±¡ãæã£ãŠãã ããã ãµã€ã¬ã³ãããžã§ãªãã£ã¯
èããŠçŽæãããã®ã¢ãããŒãã«ã»ãšãã©æºè¶³ããŠããŸãã ããããä»ã®ããã«
æè¡ã«ã¯æ¬ ç¹ãšãã¬ãŒããªãããããŸãã è€éãªéåæããžãã¯ãããå Žå
代ããã«ãReduxãåé€ããŠRxãæ¢çŽ¢ããããšããå§ãããŸãã Reduxãã¿ãŒã³ã¯
Rxã§ç°¡åã«è¡šçŸã§ããŸããâ
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/rackt/redux/issues/291#issuecomment-169761410 ã
@gaearonããããã®éãã§ãã ãããŠãReduxã¯ç§ãã¡ã®ããŸããŸãªã¢ãããŒããã¹ãŠã«å¯Ÿå¿ããã®ã«ååãªæè»æ§ãããããšãæè¬ããŠããŸãïŒ
@ halt-hammerzeitããã§ç§ã®çããèŠãŠãredux-sagaãredux-thunkãããåªããŠããçç±ã説æããŸãïŒ http ïŒ//stackoverflow.com/questions/34570758/why-do-we-need-middleware-for-
@gaearonã¡ãªã¿ã«ãstackoverflowã«é¢ããããªãã®çãã«ã¯ãããã¥ã¡ã³ããšåãæ¬ é¥ããããŸã-ããã¯æãåçŽãªã±ãŒã¹ã ããã«ããŒããŠããŸã
http://stackoverflow.com/questions/34570758/why-do-we-need-middleware-for-async-flow-in-redux/34599594#34599594
å®éã®ã¢ããªã±ãŒã·ã§ã³ã¯ãAJAXãä»ããŠããŒã¿ããã§ããããã ãã§ãªãããšã©ãŒãåŠçããã¢ã¯ã·ã§ã³åŒã³åºãã®åºåã«å¿ããŠããã€ãã®ã¢ã¯ã·ã§ã³ãå®è¡ããå¿
èŠããããŸãã
ããªãã®ã¢ããã€ã¹ã¯ãä»ã®ã€ãã³ããdispatch
ããããšã§ããããã ãã§ãã
ã§ã¯ãã³ãŒããã¢ã¯ã·ã§ã³ã®å®äºæã«ãŠãŒã¶ãŒã«alert()
ãèŠæ±ããå Žåã¯ã©ããªããŸããïŒ
ããã¯ãããã®thunk
ã圹ã«ç«ããªããšããã§ãããçŽæã¯åœ¹ã«ç«ã¡ãŸãã
ç§ã¯çŸåšãåçŽãªpromiseã䜿çšããŠã³ãŒããèšè¿°ããŠããããã®ããã«æ©èœããŸãã
redux-saga
ã«ã€ããŠã®é£æ¥ããã³ã¡ã³ããèªã¿ãŸããã
ãããäœãããã®ãç解ã§ããŸããã§ãããç¬ã
ç§ã¯monads
ããšãªã©ã«ã¯ããŸãèå³ããªãã thunk
ãäœã§ãããã¯ãŸã ããããŸããããŸãããããããã®å¥åŠãªèšèã¯å¥œãã§ã¯ãããŸããã
ããã§ã¯ãReactã³ã³ããŒãã³ãã§Promisesã䜿ãç¶ããŸãã
ããã¥ã¡ã³ãå šäœã§ãµã³ã¯ããã®çŽæãè¿ãããšããå§ãããŸãã
@gaearonããããããç§ã話ããŠããããšã§ãïŒ on_click() { dispatch(load_stuff()).then(show_modal('done')) }
ããã§ååã§ãã
ç§ã¯ããªãããŸã äœããéããŠãããšæããŸãã
redux-thunkã®READMEãã芧ãã ããã
ãæ§æãã»ã¯ã·ã§ã³ã§ããµã³ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒããã§ãŒã³ããæ¹æ³ã瀺ããŸãã
@gaearonãããããã¯ãŸãã«ç§ãããŠããããšã§ãïŒ
store.dispatch(
makeASandwichWithSecretSauce('My wife')
).then(() => {
console.log('Done!');
});
ããã¯ãŸãã«ç§ãäžã§æžãããã®ã§ãïŒ
on_click()
{
dispatch(load_stuff())
.then(() => show_modal('done'))
.catch(() => show_error('not done'))
}
ãã®READMEã»ã¯ã·ã§ã³ã¯ããæžãããŠããŸããthx
ããããããã¯ç§ã®ãã€ã³ãã§ã¯ãããŸããã§ããã makeSandwichesForEverybody
èŠãŠãã ããã ä»ã®ãµã³ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒãåŒã¶ãµã³ã¯ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãã ãããããã¹ãŠãã³ã³ããŒãã³ãã«å
¥ããå¿
èŠããªãçç±ã§ãã 詳现ã«ã€ããŠã¯ããã®ãªããžããªã®async
äŸãåç
§ããŠãã ããã
@gaearonããããããšãã°ãç§ã®æŽŸæãªã¢ãã¡ãŒã·ã§ã³ã³ãŒããã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã«å
¥ããã®ã¯é©åã§ã¯ãªããšæããŸããïŒ
ãã®äŸãèããŠã¿ãŸãããã
button_on_click()
{
this.props.dispatch(load_stuff())
.then(() =>
{
const modal = ReactDOM.getDOMNode(this.refs.modal)
jQuery(modal).fancy_animation(1200 /* ms */)
setTimeout(() => jQuery.animate(modal, { background: 'red' }), 1500 /* ms */)
})
.catch(() =>
{
alert('Failed to bypass the root mainframe protocol to override the function call on the hyperthread's secondary firewall')
})
}
ã©ã®ããã«ãããæ£ããæ¹æ³ã§æžãçŽããŸããïŒ
@ hallt-hammerzeit actionCreatorã«promiseãè¿ããŠãã³ã³ããŒãã³ããããŒã«ã«ã³ã³ããŒãã³ãã®ç¶æ ã䜿çšããŠã¹ãããŒãªã©ã衚瀺ã§ããããã«ããããšãã§ããŸãïŒãšã«ããjqueryã䜿çšããå Žåã¯é¿ããã®ãé£ããïŒ
ãã以å€ã®å Žåã¯ãè€éãªã¿ã€ããŒã管çããŠãredux-sagaã§ã¢ãã¡ãŒã·ã§ã³ãé§åã§ããŸãã
ãã®ããã°æçš¿ãèŠãŠãã ããïŒ http ïŒ
ããããã®å Žåããããã³ã³ããŒãã³ãã«ä¿æããããšã¯åé¡ãããŸããã
ïŒæ³šïŒéåžžãReactã§ã¯ãjQueryã§åœä»€åã衚瀺ãããããããã¹ãŠã«å®£èšåã¢ãã«ã䜿çšããã®ãæåã§ãããã ãã倧ããããšã§ã¯ãããŸãããïŒ
@slorberãããç§ã¯ãã§ã«ç§ã®ããµã³ã¯ãïŒãŸãã¯ããªããããããšåŒã¶ãã®ã¯äœã§ã;ããŒãšãç§ã¯ãã®å¥åŠãªèšèã奜ãã§ã¯ãããŸããïŒããçŽæããã®ãè¿ããŠããã®ã§ãã¹ãããŒãªã©ãæ±ãããšãã§ããŸãã
@gaearonããããŸããã
ãã®ã¹ã¬ããã§ã®ãµããŒãã«æºè¶³ããŠããŸãã ç§ã®çåã¯ä»è§£æ±ºãããããã§ãã
é¢é£ããæ°ãããã£ã¹ã«ãã·ã§ã³ïŒ https ïŒ
@gaearonéåžžã«çŽ æŽããã説æïŒ ïŒãããã£ãŒïŒããããšãïŒ+1ïŒ
æãåèã«ãªãã³ã¡ã³ã
æåŸã«ããã°ã€ã³APIåŒã³åºããã©ãã«çœ®ããŸããïŒ
ããã¯ãŸãã«
dispatch => {}
ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã®ç®çã§ãã å¯äœçšïŒããã¯åãªãå¥ã®ã¢ã¯ã·ã§ã³ã¯ãªãšãŒã¿ãŒã§ãã ä»ã®ã¢ã¯ã·ã§ã³ãšçµã¿åãããŠãã ããïŒ
ã³ã³ããŒãã³ãã§ã