æ°ããæŠå¿µã¯ãªãããã¹ãŠå€ããã®ã§ãã
ãªãdvaïŒ
äžå®æéã®èªç¿ãŸãã¯ãã¬ãŒãã³ã°ã®åŸã誰ããreduxã®æŠå¿µãç解ãããã®ããŒã¿ãããŒå¶åŸ¡ã«ãã£ãŠã¢ããªã±ãŒã·ã§ã³ãããå¶åŸ¡ãããããããžãã¯ãããæ確ã«ããããšãã§ããããšãèªèã§ããã¯ãã§ãã
ããããéåžžããã®ãããªè³ªåããããŸããæŠå¿µãå€ãããŠãã¬ãã¥ãŒãµãŒããµã¬ãããã³ã¢ã¯ã·ã§ã³ããã¹ãŠåé¢ãããŠããŸãïŒãµããã¡ã€ã«ïŒã
ããã«é¢ããåé¡ã¯æ¬¡ã®ãšããã§ãã
ãããŠä»ã®ããã€ãïŒ
ãããŠãdvaã¯ãããã®åé¡ã解決ããããã«äœ¿çšãããŸãã
dvaã¯ãæ¢åã®ã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ïŒredux + react-router + redux-sagaãªã©ïŒã«åºã¥ã軜éããã±ãŒãžã§ãããæ°ããæŠå¿µãå°å ¥ããããšãªããã³ãŒãã®åèšã¯100è¡æªæºã§ãã ïŒelmãšchooã«è§ŠçºãããŸãããïŒ
dvaã¯ãã¬ãŒã ã¯ãŒã¯ã§ãããã©ã€ãã©ãªã§ã¯ãããŸãããemberjsãšåæ§ã«ãåã³ã³ããŒãã³ãã®èšè¿°æ¹æ³ãæ確ã«ç€ºãããããŒã ã«ãšã£ãŠããå¶åŸ¡ãããããªããŸãããŸããdvaã¯ãpeerDependenciesã§ããreactãšreact-domãé€ãä»ã®ãã¹ãŠã®äŸåé¢ä¿ãã«ãã»ã«åããŸãã
dvaã®å®è£ ã§ã¯ãæ°ããæ§æãäœæããã®ã§ã¯ãªããã«ãŒã¿ãŒã®å®çŸ©ãreact-routerã®JSXæ§æãªã©ã®äŸåé¢ä¿ã©ã€ãã©ãªèªäœã®æ§æã䜿çšããŠãã ããïŒåçæ§æã¯ããã©ãŒãã³ã¹ã®èæ ®äºé ã§ããããµããŒããããŸãïŒåŸã§ïŒã
ãã®æ žãšãªãã®ã¯ã app.model
ã¡ãœãããæäŸããããšã§ãããã®ã¡ãœããã¯ã次ã®ããã«ãreducerãinitialStateãactionãããã³sagaãäžç·ã«ã«ãã»ã«åããããã«äœ¿çšãããŸãã
app.model({
namespace: 'products',
state: {
list: [],
loading: false,
},
subscriptions: [
function(dispatch) {
dispatch({type: 'products/query'});
},
],
effects: {
['products/query']: function*() {
yield call(delay(800));
yield put({
type: 'products/query/success',
payload: ['ant-tool', 'roof'],
});
},
},
reducers: {
['products/query'](state) {
return { ...state, loading: true, };
},
['products/query/success'](state, { payload }) {
return { ...state, loading: false, list: payload };
},
},
});
dvaã®åã¯ãéåžžã sagas/products.js
ã reducers/products.js
ãããã³actions/products.js
ãäœæããŠããããããã®ãã¡ã€ã«ãåãæ¿ããŸãã
ãããã®ã¢ãã«ã®ããŒã玹ä»ããŸã:(reduxãredux-sagaã®ã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã«ãã§ã«ç²ŸéããŠããããšãåæãšããŠããŸãïŒ
äŸãåç §ããŠãã ããã
devtool
ãããã¹ã¯ããã®ãµããŒãéçºããŒã«ã¬ãã«ã®ãµããŒãïŒ
ãŸã é©å¿ãããŠããªãããããªãã¬ãŒã¹ã¡ã³ãã«å ããŠãredux-devtoolãcsslivereloadãªã©ã®ä»ã®ãã®ã¯ãã¹ãŠäºææ§ããããŸãã
ãã«ãç°å¢ã§ãã§ã«å©çšå¯èœã§ããïŒ
ã§ããã
以åã®redux+redux-sagaã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã®ãã¹ãŠã®æ©èœãå«ãŸããŠããŸããïŒ
ã¯ãã
ãã©ãŠã¶ã®äºææ§ïŒ
redux-sagaã䜿çšãããŠãããããIE8ã¯ããããµããŒãããŠããŸããã ïŒåŸã§ããšãã§ã¯ãã¬ã€ã€ãŒã§ãµã³ã¯ããããã¹ããªãã¶ãŒããã«ãªã©ãæ¡åŒµããŠãµããŒãããããšãæ€èšããŸãïŒ
reduxã«ãã£ãŠçãçããšãããããšã¯ãåã«çŠé³ã§ããããã¯ããŸãã«ãã·ã³ãã«ã§ãšã¬ã¬ã³ãã§ãã倧ãã«è³è³ãããŸãïŒ ïŒ ïŒ
ãšããã§ãä»æ¥ãå€åœäººã誀ã£ãŠãã€ãã¿ãŒã«åæçš¿ããã®ãèŠãŠãå€åœäººãæžãããšæã£ãã®ã§ãããAlipayã®åçŽçã«ãªããšã¯æã£ãŠããŸããã§ããð
å¹æã®æ¡å€§ã楜ãã¿ã«ããŠããŸã
Alipayã®æ¬çªç°å¢ã¯ãã®ã¢ãŒããã¯ãã£ã䜿çšããŠããŸããïŒ
@besteric dvaããªãªãŒã¹ãããã°ããã§ããŸã é©çšãããŠããŸãããããã®èåŸã«ããã¢ããªã±ãŒã·ã§ã³ã¢ãŒããã¯ãã£ã¯ãã°ããã®é䜿çšãããŠããŸãã
ã¬ãã¥ãŒãµãŒã¯æ¬¡ã®ããã«æžãããšãã§ããŸãïŒ
const reducer = (state, { type, payload }) => {
switch (type) {
case 'products/query':
return { ...state, loading: true, };
case 'products/query/success':
return { ...state, loading: false, list: payload };
default
return state;
}
}
app.model({
reducer
})
ããã«ãããããã€ãã®é«æ¬¡ã®æ¹æ³ãã¬ãã¥ãŒãµãŒã«é©çšããããšãå¯èœã«ãªããŸãã
è³è³ãç§ã¯ããã€ãã®ãã¢ãæžããŸããããããŠãã äžã€ã®åé¡ããããŸããã¢ãã«ã¯äœ¿çšããããšãã§ããã ãã§ãapp.model(Model1);
app.model(Model2);
çµã¿åãããå®æãããã®ã¯ãã®æ¹æ³ã§ãããå®éãçæ³ã¯app.model([Model1,Model2])
ããçš®ã®
ã³ã³ããŒãã³ãéã§ãã£ã¹ããããæž¡ãã®ã¯é¢åã§ãã次ã®è§£æ±ºçãæ€èšããŠãã ãã
bindActionCreators
ã䜿çšããªãã®ã§ããïŒ
@yesmeckã¬ãã¥ãŒãµãŒã®é«åºŠãªäœ¿çšæ³ã®ç¹å®ã®ã·ããªãªã¯redo/undo
ã ãã§ããïŒdvaã®æè»æ§ãé«ããããªãã®ã§ãå°æ¥çã«ã¢ããªã³ãä»ããŠè¿œå ããããšãæ€èšããŸãã
ãããžã§ã¯ãã§ã¯å€ãã®ããšã䜿çšããŸããããšãã°ãè€æ°ã®ã¬ãã¥ãŒãµãŒã®é¡äŒŒéšåãé«ã¬ãã«ã®ã¡ãœããã«æœåºããŠå ã®ã¬ãã¥ãŒãµãŒãå€æŽããŸãããŸããã«ãŒãæã«ã¬ãã¥ãŒãµãŒãç¶æ ããªã»ããã§ããããã«ããé«ã¬ãã«ã®ã¡ãœããããããŸããå€æŽããããã³ãã®https://github.com/erikras/multireducer
@ Tinker404ã¢ãã«ãåå¥ã«å®£èšããæ¹ãæ確ã§ãããè¿œå ãšåé€ãç°¡åã«ãªããšæããŸããç§ã¯ãããæžããŸãïŒ
app.model(require('../models/a'));
app.model(require('../models/b'));
@JimmyLvã¯ãå人çã«actionCreatorã䜿çšããã dispatch
ã®ã¿ã䜿çšããããšã奜ã¿ãŸãã
@yesmeckããããŸãããããäžåºŠèããŸãã
ã«ãŒããå€æŽããããšãã«ã¬ãã¥ãŒãµãŒãç¶æ ããªã»ããã§ããããã«ããé«æ¬¡ã®æ¹æ³ããããŸã
ãã®ã·ããªãªã¯ã subscriptions
ã§ã«ãŒãã£ã³ã°ã®å€æŽããµãã¹ã¯ã©ã€ãããã¢ã¯ã·ã§ã³ã«ãã£ãŠç¶æ
ããªã»ããããããšã§ãããé©åã ãšæããŸãããŸãã¯ãã¬ãã¥ãŒãµãŒãšã³ãã³ãµãŒæ³ã䜿çšããããšã«å©ç¹ã¯ãããŸããïŒ
ãã®ã·ããªãªã¯ããµãã¹ã¯ãªãã·ã§ã³ã®ã«ãŒãã£ã³ã°å€æŽããµãã¹ã¯ã©ã€ãããŠãããã¢ã¯ã·ã§ã³ãéããŠç¶æ ããªã»ããããããšã§ãããé©åã ãšæããŸãã
ãã®å Žåããªã»ããããå¿ èŠã®ããåã¬ãã¥ãŒãµãŒã¯ããªã»ããããžãã¯ãäœæããå¿ èŠããããŸããé«ã¬ãã«ã®ã¡ãœããã䜿çšããå Žåã¯ã次ã®æé ãå®è¡ããã ãã§æžã¿ãŸãã
combineReducers({
products: composeReducers({ // composeReducers çå®ç°è§äžé¢
recycle(LOCATION_CHANGE, initialState), // recycle çšæ¥åšè·¯ç±ååæ¶é眮ç¶æ
products
})
})
å¥ã®ã·ããªãªã¯ãç§ãããŸããŸãªã¬ãã¥ãŒãµãŒãæœåºããããšã«ã€ããŠè©±ããŠããã®ãšåãããžãã¯ã§ããããšãã°ã補åã®ãªã¹ããšãŠãŒã¶ãŒã®ãªã¹ããããããããã®ã¬ãã¥ãŒãµãŒã¯æ¬¡ã®ããã«ãªããŸãã
// reducers/products.js
const reducer = (state, { type, action}) => {
switch (type) {
case 'products/FETCH_SUCCESS':
return {
...state,
loading: false,
list: payload
}
default:
return state
}
}
// reducers/users.js
const reducer = (state, { type, payload}) => {
switch (type) {
case 'users/FETCH_SUCCESS':
return {
...state,
loading: false,
list: payload
}
default:
return state
}
}
ããã§ã¯ã2ã€ã®ã¬ãã¥ãŒãµãŒã¯ã»ãŒåããªã®ã§ããããæœåºããŠãªã¹ãã¬ãã¥ãŒãµãŒãäœæããŸãã
const list = (actionType) => {
return (state, { type, payload }) => {
switch (type) {
case actionType:
return {
...state,
loading: false,
list: payload
}
break;
default:
return state
}
}
}
次ã«ã composeReducers
ãå®è£
ããŠãããã3ã€ã®ã¬ãã¥ãŒãµãŒãçµã¿åãããŸãã
function composeReducers(...reducers) {
return (state, action) => {
if (reducers.length === 0) {
return state
}
const last = reducers[reducers.length - 1]
const rest = reducers.slice(0, -1)
return rest.reduceRight((enhanced, reducer) => reducer(enhanced, action), last(state, action))
}
}
ãã®ããã«ããŠã補åãªã¹ããšãŠãŒã¶ãŒãªã¹ãã®ã¬ãã¥ãŒãµãŒã¯æ¬¡ã®ããã«ãªããŸãã
// reducers/products.js
const reducer = (state, { type, payload}) => {
// å
¶ä»é»èŸ
}
export default composeReducer(reducer, list('products/FETCH_SUCCESS'))
// reducers/users.js
const reducer = (state, { type, payload}) => {
// å
¶ä»é»èŸ
}
export default composeReducer(reducer, list('users/FETCH_SUCCESS'))
ãªã¹ãã¯åãªãäŸã§ãããå®éããããžã§ã¯ãã«ã¯åãããžãã¯ãæã€å€ãã®ã¬ãã¥ãŒãµãŒããããŸãã
@yesmeckð ãã¬ãã¥ãŒãµãŒãšã³ãã³ãµãŒã®åœ¹å²ã¯ä»¥åã¯éå°è©äŸ¡ãããŠããŸããã
@sorryccãªãããªãã¯èšãããšãã§ããŸããïŒ dispatch
æ¯èŒã§æ瀺çã«åŒã³åºãããŸãããïŒ
@ Tinker404ã¢ãã«ãåå¥ã«å®£èšããæ¹ãæ確ã§ãããè¿œå ãšåé€ãç°¡åã«ãªããšæããŸããç§ã¯ãããæžããŸãïŒ
app.modelïŒrequireïŒ'../ models / a'ïŒïŒ;
app.modelïŒrequireïŒ'../ models / b'ïŒïŒ;
ãŸããäžåºŠã«è€æ°ã®ã¢ãã«ãæž¡ãããšãã§ããæ¹æ³ãææ¡ããŸãã倧èŠæš¡ãªãããžã§ã¯ãã«ã¯å€ãã®ã¢ãã«ãå«ãŸããå ŽåããããŸããçŸåšããã¹ãŠã®ã¢ãã«ãã€ã³ããŒãïŒã€ã³ããŒãïŒããŠãããåã¢ãã«ã1ã€ãã€ã¢ãã«åããå¿ èŠããããŸããããã¯ããŸã䟿å©ã§ã¯ãããŸãããçŸåšã®æ¹æ³å·çã®ïŒ
// modelsæ¯äžªæ件倹ïŒæåŸå€model
import models from './models';
models.forEach((m)=>{
app.model(m);
});
// models.js
const context = require.context('./', false, /\.js$/);
const keys = context.keys().filter(item => item !== './index.js');
const models = [];
for (let i = 0; i < keys.length; i++) {
models.push(context(keys[i]));
}
export default models;
ãšãŠãD.VAã§ãã
ãŠãŒã¶ãŒããã·ã¥ããŒãã§antdãã©ãŒã ã³ã³ããŒãã³ãã®äœ¿çšãèŠã€ããŸããããçŽç²ãªã³ã³ããŒãã³ãã«ã¯äœ¿çšã§ããªãããšãèŠããŠããŸãããä»ã¯å¯èœã§ããïŒ
@coderingå¶éãããããšãèŠããŠããŸããããantdã®åé¡ã¯https://github.com/ant-design/ant-design/issuesã§å°ããããšãã§ããŸãã
https://github.com/react-component/form/blob/master/README.md
泚ã«èšèŒãããŠããŸãã
ããã«ã¡ã¯ãããªãã®dvaã䜿çšããããšæããŸããçŸåšãReact Webpack Reduxã¹ãã£ãã©ãŒã«ãã£ã³ã°ã«ãã£ãŠçæããããã£ã¬ã¯ããªæ§é ã䜿çšããŠããŸããäŸã®ãŠãŒã¶ãŒããã·ã¥ããŒãã®äŸãåç §ããŠã³ãŒããå€æŽããŸããããéå§åŸã«äœããããŸãããç§ã¯ãããã©ãã«ããããèŠã€ããŸããïŒäœããããŸããããªãã£ããç§ã®ãããžã§ã¯ãã¢ãã¬ã¹ïŒ https ïŒ//github.com/baiyulong/lenovo_parts
@baiyulongãŠãŒã¶ãŒããã·ã¥ããŒãã®ãã£ã¬ã¯ããªæ§é ã«åºã¥ããŠçŽæ¥å®è¡ããŠã¿ãŸãããïŒ
@sorryccçŸåšããŠãŒã¶ãŒããã·ã¥ããŒãã®ãã£ã¬ã¯ããªæ§é ã䜿çšããŠããŸããdvaã«ãŒãã£ã³ã°ã«ç¹å¥ãªåŠçãæžã蟌ã¿ã¯ãããŸããïŒ
export default function({ history }) {
return (
<Router history={history}>
<IndexRoute component={HomePage} />
<Route path='/' component={HomePage}>
<Route path='/create' component={CreateOrder} />
</Route>
</Router>
)
}
ç§ãæžãããã®ã«ãŒããããŒã ããŒãžã¯ã§ããŸããç§ã¯<Link to='/create'>Create</Link>
ãªã³ã¯ãæžããŸããããããã¯ãªãã¯ããåŸã«CreateOrderã³ã³ããŒãã³ãã«è¡ãããšãã§ããŸãã
@baiyulongdvaã®ã«ãŒããæžãç¹å¥ãªæ¹æ³ã¯ãããŸãããè©ŠããŠã¿ãŠãã ããã
@nikoguã©ããããããšããå ¥ãåã«ãªã£ãåŸã¯å æ°ã«ãªããŸã
ããã«ã¡ã¯ãdvaã¯ã¢ãã«ã®ãããããŒãã£ã³ã°ããµããŒãã§ããŸããïŒ
@ kkkf1190ã¯ãããæ€èšããŠããããµããŒãããäºå®ã§ãã
ð
ããããšããšèšãããã£ãã ãã§ãã ã ã
vuejsã®vue-cliã®è¶³å Žã¯ãšãŠãè¯ããšãã€ãæã£ãŠããŸãããããããèªãã åŸãç§ã®èãæ¹ã¯äžå€ããŸããã
ãšãŠãçŽ æµãªãã¬ãŒã ïŒãã°ããç 究ããŠããŸããã @sorryccYundaã«2ã€ã®è³ªåãããããšæããŸãã
@ freemember007
@sorryccé«éã¬ãã¥ãŒãµãŒããµããŒãããããã®ãœãªã¥ãŒã·ã§ã³ã¯ãããŸããïŒç§ãã¡ã®ãããžã§ã¯ãã¯ãåå©çšã®ããã«å€ãã®é«æ¬¡ã¬ãã¥ãŒãµãŒã䜿çšããŠããŸã
@ancheelã§ãµããŒããããŠãããã°ããŒãã«ãŸãã¯ããŒã«ã«ã«ããããšãã§ããŸãããŠãŒã¹ã±ãŒã¹ãåç §ããŠãã ããïŒ https ïŒ//github.com/dvajs/dva/blob/master/test/reducers-test.js
ã¢ãã«ã®ç¶æ
ãå€æŽããåŸãã¢ãã«ãå床å€æŽããæ¹æ³ããã®åé¡ã¯åžžã«çºçããŸã
antd.jsïŒ32924èŠåïŒsetStateïŒ...ïŒïŒæ¢åã®ç¶æ
é·ç§»äžïŒ render
ãŸãã¯å¥ã®ã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒå
ãªã©ïŒã¯æŽæ°ã§ããŸãããRenderã¡ãœããã¯ãpropsãšstate;ã³ã³ã¹ãã©ã¯ã¿ãŒã®çŽç²é¢æ°ã§ããå¿
èŠããããŸããå¯äœçšã¯ã¢ã³ããã¿ãŒã³ã§ããã componentWillMount
ã«ç§»åã§ããŸãã
éåžžã«ãšããµã€ãã£ã³ã°ã§ããæ¬çªç°å¢ã§äœ¿çšããŠã¿ãŠãã ãããåŒãç¶ãæé©åãšæ¹åãè¡ã£ãŠãã ããã
ããã匱äœåïŒ
ãããã£ããããããšãïŒïŒ
@sorryccãµãŒããŒãµã€ãã¬ã³ããªã³ã°ã®ãµããŒãã楜ãã¿ã«ããŠããŸãïŒ
@mountainmoonã«ãã£ãŠãµããŒããããŠããŸããhttpsïŒ //github.com/sorrycc/dva-boilerplate-isomorphicãåç §ããŠãã ããã
è»èŒªã®æ³¢ãæ¥ãŸããïŒ+1ïŒ
ããã«ã¡ã¯ãç§ã¯ãã®dvaã®åŠç¿ã«ã€ããŠé£çµ¡ãåããŸãããæ°æ¥éã³ãŒããèªãã åŸãå¿ã®äžã§ããã€ã質åããããŸãã質åãããã®ã§ããã
ããªãã®ãã¢ã¯ãã¹ãŠã·ã³ã°ã«ããŒãžã¢ããªã±ãŒã·ã§ã³ã§ããããšãããããŸãããããããã¯ãã¹ãŠéçºäžã®ãã«ãããŒãžã¢ããªã±ãŒã·ã§ã³ã§ãããã«ãããŒãžã¢ããªã±ãŒã·ã§ã³éçºã§ã«ãŒãã£ã³ã°ã䜿çšãããŠããªãå Žåã代ããã«ã³ã³ããŒãã³ããããŒãããæ¹æ³ãå°ããããšæããŸãã銬鹿ã«å°ãããã«ãŒãã£ã³ã°ã䜿çšããªããããå°ãæ··ä¹±ããŸãããã®ãããã¢ãã«ã«èšå®ãããŠãããªã¹ããŒã¯ãããªã¬ãŒããå Žæãæ確ã§ã¯ãããŸããã
history.listenïŒlocation => {
ifïŒlocation.pathname ==='/ users'ïŒ{
æ¥éïŒ{
ã¿ã€ãïŒ'querySuccess'ã
ãã€ããŒãïŒ{}
}ïŒ
}
}ïŒ
PSïŒquerySuccessã¡ãœããã§ããŒã¿ãããŒãããexport default connectïŒmapStateToPropsïŒïŒUsersïŒ;ã䜿çšãããšããšã©ãŒãå ±åãããŸãã
connect.jsïŒ41 Uncaught TypeErrorïŒã¯ã©ã¹ãé¢æ°ãšããŠåŒã³åºãããšã¯ã§ããŸãã
äžç¬ãã«ã¿ãããªæãã§ã説æããŠãããããããããªããããããšãïŒ
ãªãdvaïŒ è±èªã§ãé¡ãããŸã
ç§ã¯ãã®æžãæ¹ãæ¬åœã«å¥œãã§ã¯ãããŸããã
@coderingã¯ããŠãŒã¶ãŒããã·ã¥ããŒãã§ã®antdãã©ãŒã ã³ã³ããŒãã³ãã®äœ¿çšã«ã€ããŠèšåããŸããããçŽç²ãªã³ã³ããŒãã³ãã«ã¯äœ¿çšã§ããªãããšãèŠããŠããŸããä»ã¯å¯èœã§ããïŒ
ç§ãããã«æãééããŸãããçŽç²é¢æ°ã³ã³ããŒãã³ãã®å ŽåãgetFieldDecoratoré¢æ°ã¯props.form.getFieldDecoratorããååŸã§ããŸãããextendsã䜿çšããŠã³ã³ããŒãã³ããäœæãããšãååŸã§ããŸãã
ç¥ã解決çãæã£ãŠãããã©ããã¯ããããŸãã@sorrycc
åãããŒãžãè±èªã§ç«ã¡äžããŠããã ããŸãããïŒ ãããç解ããããšã¯ã§ããŸããããªãdvaãå¿ èŠãªã®ã§ããã
ããã«ã¡ã¯ã倧èŠæš¡ãªãããžã§ã¯ãã®å Žåããã®ç¶æ ã¯éåžžã«å€§ãããåŠçãéåžžã«é¢åã«ãªããŸããè€æ°ã®ã¢ãã«ã«åå²ããå¿ èŠããããŸããïŒ
@ yazhou-zyzç§ã¯ããªããšåãåé¡ãæ±ããŠããŸãïŒ
èŠåïŒsetStateïŒ...ïŒïŒæ¢åã®ç¶æ
é·ç§»äžïŒrenderãŸãã¯å¥ã®ã³ã³ããŒãã³ãã®ã³ã³ã¹ãã©ã¯ã¿ãŒå
ãªã©ïŒã¯æŽæ°ã§ããŸãããrenderã¡ãœããã¯propsãšstateã®çŽç²é¢æ°ã§ããå¿
èŠããããŸããã³ã³ã¹ãã©ã¯ã¿ãŒã®å¯äœçšã¯ã¢ã³ããã¿ãŒã³ã§ããã componentWillMountã«ç§»åã§ããŸãã
ã©ããã£ãŠè§£æ±ºããã®ãèããŠã¿ãŸããïŒ
åŠã³
å匷ãç¶ãã
dvaã¯ã建èšãããžã§ã¯ãã«ãšã£ãŠéåžžã«åèã«ãªã䟡å€ããããŸãã
ãç²ãæ§ã§ããã
è±èªã®ããã¥ã¡ã³ãã¯ã©ãã«ãããŸããïŒ ç¿»èš³ãšã³ãžã³ã䜿çšããŠãããã¯ã翻蚳ããããšã«ã¯åé¡ããããç解ãååã§ã¯ãããŸããã è±èªã§ãããªããã¡ã¯äžçã«å°éããããšãã§ããŸãã é 匵ã£ãŠãã ãã!! ïŒãã±ããïŒ
dvaã¯React-native0.47.Xããã³React16.0.0ããŒãžã§ã³ã§ã¯è©ŠãããŸãã
@vecoldã¯ãæåŸ ã³ãŒãããšã©ãŒã¡ãã»ãŒãžã¯äœ¿çšã§ããªããšèšã£ãŠãåžžã«äœ¿çšã§ããŸãã
ããã¥ã¡ã³ãã®è±èªç¿»èš³ãå
¥æã§ããå¯èœæ§ã¯ãããŸããïŒ
ããããšãïŒ
ããžãã¹ã³ãŒãã§ã¯ããã®ãããªäŸãäžè¬çã§ããããŒã«ã«ç¶æ ã®æŽæ°ã¯å šäœã«åœ±é¿ãäžããå¯èœæ§ããããŸããåã¬ã³ããªã³ã°ããå¿ èŠã®ãªãå€ãã®å Žæãåã¬ã³ããªã³ã°ããããããããŒãžã®ããã©ãŒãã³ã¹ãå€§å¹ ã«äœäžããŸãããã®é¢æ°ãè¿œå ããŠãredux connectãäŸåããŠããç¶æ ãèªåçã«åæããäžèŠãªmapStateToPropsã®èšç®ãæžãããŠåã¬ã³ããªã³ã°ããããšã¯ã§ããŸããïŒð
ãšãŠãè¯ã
ããããåäžã®ããŒãžãäœæãããå Žåã¯ããã¹ãŠã®ããŒãžãäœæããŸã
_éå ¬åŒç¿»èš³_
Reduxã¯è¯ãã§ãã ããããæŠå¿µãå€ãããŠãã¬ãã¥ãŒãµãŒããµã¬ãã¢ã¯ã·ã§ã³ãåé¢ãããŠããŸãïŒç°ãªããã¡ã€ã«ã«åå²ãããŠããŸãïŒ
ããã¯ãæ¢åã®ãã¬ãŒã ã¯ãŒã¯ïŒredux + react-router + redux-saga ...ïŒã®ã©ã€ãã©ãããŒã§ãã æ°ããæŠå¿µã¯å«ãŸããŠããŸããã <100è¡ã®ã³ãŒãã ïŒelmãšchooã«è§ŠçºãããŸãããïŒ
ããã¯ãã¬ãŒã ã¯ãŒã¯ã§ãããã©ã€ãã©ãªã§ã¯ãããŸããã Ember.jsãšåæ§ã«ãåéšåã®èšè¿°æ¹æ³ãå¶éããŸãã ããŒã ã¯ãŒã¯ãããå¶åŸ¡ãããããªããŸãã Dvaã¯ãreactãšreact-domãé€ããã¹ãŠã®äŸåé¢ä¿ãpeerDependenciesãšããŠã«ãã»ã«åããŸã
ãã®å®è£ ã¯ãå¯èœãªéãæ°ããæ§æãå°å ¥ããŸããã äŸåé¢ä¿ãåå©çšããŸãã ããšãã°ãã«ãŒã¿ãŒã®å®çŸ©ã¯ãreact-routerã®JSXãšãŸã£ããåãã§ãã
ã³ã¢æ©èœã¯app.model
ã§ãã ããã¯ãreducerãinitialStateãactionãsagaãå®å
šã«ã«ãã»ã«åããŸãã
app.model({
namespace: 'products',
state: {
list: [],
loading: false,
},
subscriptions: [
function(dispatch) {
dispatch({type: 'products/query'});
},
],
effects: {
['products/query']: function*() {
yield call(delay(800));
yield put({
type: 'products/query/success',
payload: ['ant-tool', 'roof'],
});
},
},
reducers: {
['products/query'](state) {
return { ...state, loading: true, };
},
['products/query/success'](state, { payload }) {
return { ...state, loading: false, list: payload };
},
},
});
以åã¯sagas/products.js, reducers/products.js actions/products.js
ãäœæããããããåãæ¿ããŠããŸããã
ããŒãã€ã³ãïŒ
rootReducer
ãªããžã§ã¯ãå
ã®reducer
ã®key
$initialState
reducer
äŸãèŠã
devtool
ããããªããŒãEffects
ã¯ããå€ãã®saga
ã¢ãã«ããµããŒãããŸãéçºããŒã«ã¯ãµããŒãããŸããïŒ
redux-devtoolãcsslivereloadãšäºææ§ããããŸãã ããããªããŒãã«ã¯ããã«äœæ¥ãå¿ èŠã§ã
prod envã«é©ããŠããŸããïŒ
æ¿ç¥ããŸãã
redux + redux-sagaã®ãã¹ãŠã®æ©èœãå«ã¿ãŸããïŒ
ã¯ã
ãã©ãŠã¶ã®äºææ§ïŒ
redux-sagaã®ããIE8ã¯ãããŸããã ïŒåŸã§ããšãã§ã¯ãã¬ã€ã€ãŒã®æ¡åŒµæ©èœãšããŠèŠ³å¯å¯èœãªãµã³ã¯ããããã¹ãé©çšããå ŽåããããŸãïŒ
åæ§ã«ããŠãã ãã
['products/query']: function*() {}
['products/query'](state) {}
æ§æã¯äœã§ããïŒé åãé¢æ°åãšããŠäœ¿çšã§ããŸããïŒ
@clemTheDasheré¢æ°åã¯ãJavaScriptã§èšç®ãããããŒïŒé åã§ã¯ãªãïŒã«ããããšãã§ããŸãã ã¡ãœããå®çŸ©ãžã®ãã詳现ãªåç §|
var obj = {
property( parameters⊠) {},
*generator( parameters⊠) {},
async property( parameters⊠) {},
async* generator( parameters⊠) {},
// with computed keys:
[property]( parameters⊠) {},
*[generator]( parameters⊠) {},
async [property]( parameters⊠) {},
// compare getter/setter syntax:
get property() {},
set property(value) {}
};
æ°èŠåå ¥è ã®å ±åãããã«æ¥ãŠãããã³ããšã³ãã®ç¥èãåŠã¶ããã«æžåœã«åãç¶ããŸã
@clemTheDasherããã¯èšç®ãããããããã£ã§ãã
ãªã³ã¯https://github.com/dvajs/dva/tree/master/examples/count404ã¯ãªãã§ããïŒ
åŠã³ïŒ
ç¥ãèŠäžãã
ç¥ã«æè¬ããŸãããªãŒãã³ãœãŒã¹ã«æè¬ããŸã
ç§ã¯ããªããã¡ããåŠã¶ããšãèš±ãããŠããŸãããïŒ
ç§ã¯åŠã³ãŸãããç§ãã¡ã䜿çšããããã®ãã®ãããªäŸ¿å©ãªãã¬ãŒã ã¯ãŒã¯ãæã£ãŠããããšã«æè¬ããŸã
githubã®ãã¢ãªã³ã¯ã®æå¹æéãåããŠããŸãã
@sorrycc dvaã¯ãµãŒããŒåŽã®ã¬ã³ããªã³ã°ããµããŒãããŠããŸããïŒ
ã¬ãã¥ãŒãµãŒã¯æ¬¡ã®ããã«æžãããšãã§ããŸãïŒ
const reducer = (state, { type, payload }) => { switch (type) { case 'products/query': return { ...state, loading: true, }; case 'products/query/success': return { ...state, loading: false, list: payload }; default return state; } } app.model({ reducer })
ããã«ãããããã€ãã®é«æ¬¡ã®æ¹æ³ãã¬ãã¥ãŒãµãŒã«é©çšããããšãå¯èœã«ãªããŸãã
Reduxã®èšè¿°ã¹ã¿ã€ã«ã¯ç°¡æœã§ãç¶æ
ãå€æŽããããã«å¿
èŠãªè¡ã¯1è¡ã ãã§ãããæ°è¡ã®ã³ãŒããæ§æç³è¡£æ§æã§äžç·ã«èšè¿°ãããŠããããã§ãããã ããæ®ãã®ã¹ããŒã¿ã¹ã次ã®ã¹ãããã«é
ä¿¡ããã«ã¯ã ...state
ã䜿çšããå¿
èŠããããŸããããããªããšãã¹ããŒã¿ã¹ãäžå®å
šã«ãªããŸããã€ãŸããreduceãã§ãŒãºäžã«ã誀ã£ãŠæžã蟌ãŸãããšãäžéšã®ç¶æ
ã倱ãããå¯èœæ§ããããŸãã
ããã€ãã®ç¹ã§ãVuexã®ã¢ã€ãã¢ã¯èªã¿ããããããèªç¶ã§ãããã®ãããªãã®ãæžããŠãã ããïŒæ£ç¢ºã§ã¯ãããŸããïŒã
const mutation = {
['products/query'](state) {
state.loading = true
},
['products/query/success'](state, payload) {
state.loading = false
state.list = payload
}
}
ã³ãŒãã«é¢ããŠã¯ãïŒåæçã«ïŒã©ã®ç¶æ ãå€æŽãããã ããæ°ã«ããŸãã Vuexã¯ãŸããå·ã®æ¬¡ã®åè»å°ãžã®é éã®ããã«å€åŽã®å±€ãå ãå¿ èŠããããŸãããããããé éåã«ããã€ãã®é²åŸ¡ãã§ãã¯ïŒæšæž¬ïŒãè¡ãããããããã¯ãæ€ããããŸãã
dvaã®å ¬åŒãŠã§ããµã€ãã®ãµã³ãã«ããŒãžãåºãŠãšã©ãŒãå ±åã§ããªããã©ããç§ã«å°ããŠãã ãããããã¯ã¢ããã°ã¬ãŒãã§ããïŒ
åæ§ã«ããŠãã ãã
['products/query']: function*() {} ['products/query'](state) {}
æ§æã¯äœã§ããïŒé åãé¢æ°åãšããŠäœ¿çšã§ããŸããïŒ
ES6ã§ã¯ããªãã©ã«ã§ãªããžã§ã¯ãïŒåŒïŒããªããžã§ã¯ãã®ããããã£åãšããŠå®çŸ©ã§ããŸããã€ãŸããåŒãè§ãã£ãã§å²ã¿ãŸãã
ãã®ãããª
obj = {
['xxname']: 'what ever you defined',
['xxyy'](args) {
....
}
}
質åããããŸãããproducts/queryãã¯ã¬ãã¥ãŒãµãŒã®åŒã³åºããåŠçããããã«äœ¿çšãããæååãä»ããŠåå空éã«é¢é£ä»ããããŸããåŸã§ããããžã§ã¯ãã倧ãããªã£ãå ŽåïŒæ°çŸã®ã¡ãœãããªã©ïŒãç§ã®åå空éãå€æŽããå¿ èŠãããå Žåã 100ã®ã¡ãœãããå€æŽããã«ã¯ïŒ
@yesmeckð ãã¬ãã¥ãŒãµãŒãšã³ãã³ãµãŒã®åœ¹å²ã¯ä»¥åã¯éå°è©äŸ¡ãããŠããŸããã
ããã§ãµããŒãããããã©ããããããŸãããïŒ
æãåèã«ãªãã³ã¡ã³ã
reduxã«ãã£ãŠçãçããšãããããšã¯ãåã«çŠé³ã§ããããã¯ããŸãã«ãã·ã³ãã«ã§ãšã¬ã¬ã³ãã§ãã倧ãã«è³è³ãããŸãïŒ ïŒ ïŒ
ãšããã§ãä»æ¥ãå€åœäººã誀ã£ãŠãã€ãã¿ãŒã«åæçš¿ããã®ãèŠãŠãå€åœäººãæžãããšæã£ãã®ã§ãããAlipayã®åçŽçã«ãªããšã¯æã£ãŠããŸããã§ããð