์๋ก์ด ๊ฐ๋ ์ ์๊ณ ๋ชจ๋ ์ค๋๋ ๊ฐ๋ ์ ๋๋ค.
์ dva?
์ผ์ ๊ธฐ๊ฐ์ ์์ฒด ํ์ต ๋๋ ๊ต์ก ํ์ ๋ชจ๋ ์ฌ๋์ด redux์ ๊ฐ๋ ์ ์ดํดํ ์ ์์ด์ผ ํ๋ฉฐ ์ด ๋ฐ์ดํฐ ํ๋ฆ ์ ์ด๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์ ์ด ๊ฐ๋ฅํ๊ณ ๋ ผ๋ฆฌ๋ฅผ ๋ ๋ช ํํ๊ฒ ๋ง๋ค ์ ์์์ ์ธ์ํ ์ ์์ด์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ทธ๋ฐ ์ง๋ฌธ์ด ์์ต๋๋ค. ๊ฐ๋ ์ด ๋๋ฌด ๋ง๊ณ ๋ฆฌ๋์, ์ฌ๊ฐ, ์ก์ ์ด ๋ชจ๋ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค(ํ์ ํ์ผ).
์ด๊ฒ์ ๋ฌธ์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ผ๋ถ ๋ค๋ฅธ ์ฌ๋๋ค:
๊ทธ๋ฆฌ๊ณ dva๋ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
dva๋ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ(redux + react-router + redux-saga ๋ฑ)๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ฒฝ๋ ํจํค์ง๋ก ์๋ก์ด ๊ฐ๋ ์ ๋์ ํ์ง ์๊ณ ์ด ์ฝ๋๊ฐ 100์ค ๋ฏธ๋ง์ ๋๋ค. (๋๋ฆ ๋๋ฌด์ ์ถ์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค.)
dva๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ ํ๋ ์์ํฌ์ ๋๋ค. emberjs์ ์ ์ฌํ๊ฒ ๊ฐ ๊ตฌ์ฑ ์์๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ช ํํ๊ฒ ์๋ ค์ฃผ๋ฏ๋ก ํ์์ ๋ ์ ์ดํ ์ ์์ต๋๋ค. ๋ํ dva๋ peerDependencies์ธ react ๋ฐ react-dom์ ์ ์ธํ ๋ค๋ฅธ ๋ชจ๋ ์ข ์์ฑ์ ์บก์ํํฉ๋๋ค.
dva ๊ตฌํ์์ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋ง๋ค์ง ๋ง๊ณ ๋ผ์ฐํฐ ์ ์ ๋๋ react-router์ JSX ๊ตฌ๋ฌธ๊ณผ ๊ฐ์ ์ข ์์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฒด ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ญ์์ค(๋์ ๊ตฌ์ฑ์ ์ฑ๋ฅ ๊ณ ๋ ค ์ฌํญ์ด๋ฉฐ ์ง์๋ ์์ ์ ๋๋ค. ๋์ค์).
ํต์ฌ์ ๋ค์๊ณผ ๊ฐ์ด reducer, initialState, action ๋ฐ saga๋ฅผ ํจ๊ป ์บก์ํํ๋ ๋ฐ ์ฌ์ฉ๋๋ app.model
๋ฉ์๋๋ฅผ ์ ๊ณตํ๋ ๊ฒ์
๋๋ค.
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, css livereload ๋ฑ๊ณผ ๊ฐ์ ๋ค๋ฅธ ๊ฒ๋ค์ ๋ชจ๋ ํธํ๋ฉ๋๋ค.
๋น๋ ํ๊ฒฝ์์ ์ด๋ฏธ ์ฌ์ฉํ ์ ์์ต๋๊น?
ํ ์์๋ค.
์ด์ redux + redux-saga ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๊น?
๋ค.
๋ธ๋ผ์ฐ์ ํธํ์ฑ?
IE8์ redux-saga๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ง์ํ์ง ์์ต๋๋ค. (๋์ค์ ํ์ฅ๋ ๋ฐฉ์์ผ๋ก ํจ๊ณผ ๋ ์ด์ด์์ ์ฝํฌ, ์ฝ์, ๊ด์ฐฐ ๊ฐ๋ฅ ํญ๋ชฉ ๋ฑ์ ์ง์ํ๋ ๊ฒ์ ๊ณ ๋ คํ ๊ฒ์ ๋๋ค)
redux๋ก ์ด์๋๋ค๋ ๊ฒ์ ๊ทธ์ ๋ณต์์ผ ๋ฟ์ด์ง ๋๋ฌด ์ฌํํ๊ณ ์ฐ์ํ๋ค ๋์ฐฌ์! ! !
btw ์ค๋ ํธ์ํฐ์ ์ธ๊ตญ์ธ์ด ์ฌ๋ฆฐ๊ฑฐ ์ฐ์ฐํ ๋ดค๋๋ฐ ์ธ๊ตญ์ธ์ด ์ด๊ธ์ธ์ค์์๋๋ฐ ์๋ฆฌํ์ด ๋๊ธ์์ผ์ค์ ๋ชฐ๋๋ค ๐
ํจ๊ณผ ํ๋ ๊ธฐ๋
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 ok, ๋ค์ ์๊ฐํ๊ฒ ์ต๋๋ค.
๊ฒฝ๋ก๊ฐ ๋ณ๊ฒฝ๋ ๋ ๊ฐ์๊ธฐ๊ฐ ์ํ๋ฅผ ์ฌ์ค์ ํ๋๋ก ํ๋ ๊ณ ์ฐจ ๋ฉ์๋๋ ์์ต๋๋ค.
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
}
}
์ฌ๊ธฐ์ ๋ ๊ฐ์ ๋ฆฌ๋์๋ ๊ฑฐ์ ๋์ผํ๋ฏ๋ก ์ด๋ฅผ ์ถ์ถํ๊ณ ๋ชฉ๋ก ๋ฆฌ๋์๋ฅผ ์์ฑํฉ๋๋ค.
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'));
๋ํ ํ๋ฒ์ ์ฌ๋ฌ ๋ชจ๋ธ์ ์ ๋ฌํ ์ ์๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค. ํฐ ํ๋ก์ ํธ์๋ ๋ง์ ๋ชจ๋ธ์ด ์์ ์ ์์ต๋๋ค. ์ง๊ธ์ ๋ชจ๋ ๋ชจ๋ธ์ ์๊ตฌ(๊ฐ์ ธ์ค๊ธฐ)ํ ๋ค์ ๊ฐ ๋ชจ๋ธ์ ํ๋์ฉ ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ๋งค์ฐ ํธ๋ฆฌํ์ง ์์ต๋๋ค. ์ฐ๊ธฐ์:
// 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์ ๋๋ค.
user-dashboard์์ antd form component๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋๋ฐ ์์ component๋ ์ฌ์ฉํ ์ ์๋ ๊ฑธ๋ก ๊ธฐ์ตํ๋๋ฐ ์ง๊ธ ๊ฐ๋ฅํ๊ฐ์?
@codering ์ ํ ์ฌํญ์ด ์๋์ง ๊ธฐ์ต๋์ง ์์ต๋๋ค. antd ๊ด๋ จ ๋ฌธ์ ๋ https://github.com/ant-design/ant-design/issues ์์ ์ง๋ฌธํ ์ ์์ต๋๋ค.
https://github.com/react-component/form/blob/master/README.md
์ฃผ์์ ๋์ ์์ต๋๋ค.
์๋ ํ์ธ์, dva๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ต๋๋ค. ํ์ฌ React Webpack Redux ์ค์บํด๋ฉ์ผ๋ก ์์ฑ๋ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ๊ทํ์ ์์ ์์ user-dashboard ์์ ๋ฅผ ์ฐธ์กฐํ์ฌ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง๋ง ์์ ํ ์๋ฌด ๊ฒ๋ ์์ต๋๋ค. ๋์์ฃผ์ค ์ ์์ต๋๊น? ์ด๋ ์๋์ง ์์๋ด์?๋ญ๊ฐ ์๋ชป๋์์ต๋๋ค. ๋ด ํ๋ก์ ํธ ์ฃผ์: https://github.com/baiyulong/lenovo_parts
@baiyulong ์ฌ์ฉ์ ๋์๋ณด๋์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ง์ ํ์ง ์๋ ์ด์ ๋ ๋ฌด์์ ๋๊น?
@sorrycc ์ง๊ธ user-dashboard ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๊ณ ์๋๋ฐ dva ๋ผ์ฐํ
์ ์ํ ํน๋ณํ ์ฒ๋ฆฌ๋ ๊ธ์ด ์๋์?
export default function({ history }) {
return (
<Router history={history}>
<IndexRoute component={HomePage} />
<Route path='/' component={HomePage}>
<Route path='/create' component={CreateOrder} />
</Route>
</Router>
)
}
๋ด๊ฐ ์ด ์ด ๊ฒฝ๋ก, HomePage๋ ํ ์ ์๊ณ , ๋๋ <Link to='/create'>Create</Link>
๋งํฌ๋ฅผ ์ผ๋ค, ๋๋ ๊ทธ๊ฒ์ ํด๋ฆญํ ํ CreateOrder ์ปดํฌ๋ํธ๋ก ๊ฐ ์ ์๋ค
@baiyulong dva ์ ๊ฒฝ๋ก๋ฅผ ์์ฑํ๋ ํน๋ณํ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ๋ค์์ ์๋ํ์ญ์์ค.
@nikogu ๊ฐ์ฌํฉ๋๋ค. ์ค์ฒฉ์ ํ๊ณ ๋๋ฉด ๊ด์ฐฎ์ ๊ฒ์ ๋๋ค.
์๋ ํ์ธ์, dva๊ฐ ๋ชจ๋ธ์ ํซ ๋ก๋ฉ์ ์ง์ํ ์ ์์ต๋๊น?
@kkf1190 ์ ์ด๋ฅผ ๊ณ ๋ ค ์ค์ด๋ฉฐ ์ง์ํ๊ฒ ์ต๋๋ค.
๐
๊ทธ์ ๊ณ ๋ง๋ค๋ ๋ง์ ํ๊ณ ์ถ์์ต๋๋ค. . .
์์ ๋ถํฐ vuejs์ vue-cli ์ค์บํด๋ฉ์ด ์ฐธ ์ข๋ค๋ ์๊ฐ์ ํ์๋๋ฐ ์ด ๊ธ์ ์ฝ๊ณ ์๊ฐ์ด ์์ ํ ๋ฐ๋์์ต๋๋ค.
์์ฃผ ๋ฉ์ง ํ๋ ์! ์ ์ ์ฐ๊ตฌํ์ต๋๋ค. @sorrycc Yunda์๊ฒ ๋ ๊ฐ์ง ์ง๋ฌธ์ ํ๊ณ ์ถ์ต๋๋ค.
@freemember007
@sorrycc ์ง๊ธ ๊ณ ์ฐจ ๋ฆฌ๋์ ์ง์์ ์ํ ์๋ฃจ์ ์ด ์์ต๋๊น? ์ฐ๋ฆฌ ํ๋ก์ ํธ๋ ์ฌ์ฌ์ฉ ๋๋ฌธ์ ๋ง์ ๊ณ ์ฐจ ๊ฐ์๊ธฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
@ancheel ์์ ์ง์ํ๋ฉฐ ์ ์ญ ๋๋ ๋ก์ปฌ์ด ๋ ์ ์์ผ๋ฉฐ ์ฌ์ฉ ์ฌ๋ก ์ฐธ์กฐ: https://github.com/dvajs/dva/blob/master/test/reducers-test.js
๋ชจ๋ธ์ ์ํ๋ฅผ ์์ ํ ํ ๋ค์ ์์ ํ๋ ๋ฐฉ๋ฒ์ ํญ์ ์ด ๋ฌธ์ ๊ฐ ์ง๊ธ ๋ฐ์ํฉ๋๋ค.
antd.js:32924 ๊ฒฝ๊ณ : setState(...): ๊ธฐ์กด ์ํ ์ ํ ์ค์๋ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค(์: render
๋๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ์์ฑ์ ๋ด์์).๋ ๋ ๋ฉ์๋๋ props ๋ฐ state์ ์์ ํจ์์ฌ์ผ ํฉ๋๋ค. ๋ถ์์ฉ์ ์ํฐ ํจํด์ด์ง๋ง componentWillMount
๋ก ์ด๋ํ ์ ์์ต๋๋ค.
๋งค์ฐ ํฅ๋ฏธ๋กญ์ต๋๋ค. ํ๋ก๋์ ํ๊ฒฝ์์ ์ฌ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ๊ณ์ํด์ ์ต์ ํํ๊ณ ๊ฐ์ ํ ์ ์๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
๋ํํด!
์๊ณ ํ์ จ์ต๋๋ค.๊ฐ์ฌํฉ๋๋ค!!
@sorrycc ์๋ฒ ์ธก ๋ ๋๋ง ์ง์์ ๊ธฐ๋ํฉ๋๋ค!
@mountainmoon ์์ ์ง์ํ๋ฉฐ https://github.com/sorrycc/dva-boilerplate-isomorphic ์ ์ฐธ์กฐํ์ธ์.
๋ฐํด์ ๋ฌผ๊ฒฐ์ด ์๋ค :+1:
์๋
ํ์ธ์, ์ ๋ ์ด dva๋ฅผ ๋ฐฐ์ฐ๊ธฐ ์ํด ์ฐ๋ฝ์ ์ทจํ์ต๋๋ค. ๋ฉฐ์น ๋์ ์ฝ๋๋ฅผ ์ฝ์ ํ ๋ง์์ ๋ช ๊ฐ์ง ์ง๋ฌธ์ด ์์ต๋๋ค. ๋ฌป๊ณ ์ถ์ต๋๋ค.
๊ทํ์ ๋ฐ๋ชจ๋ ๋ชจ๋ ๋จ์ผ ํ์ด์ง ์์ฉ ํ๋ก๊ทธ๋จ์ด์ง๋ง ๋ชจ๋ ๊ฐ๋ฐ ์ค์ธ ๋ค์ค ํ์ด์ง ์์ฉ ํ๋ก๊ทธ๋จ์ธ ๊ฒ์ ๋ดค์ต๋๋ค. ๋ค์ค ํ์ด์ง ์์ฉ ํ๋ก๊ทธ๋จ ๊ฐ๋ฐ์์ ๋ผ์ฐํ
์ด ์ฌ์ฉ๋์ง ์๋ ๊ฒฝ์ฐ ๋์ ๊ตฌ์ฑ ์์๋ฅผ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๋ฌป๊ณ ์ถ์ต๋๋ค. ๋ด๊ฐ ๋ผ์ฐํ
์ ์ฌ์ฉํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ ํผ๋์ค๋ฝ์ต๋๋ค. ๊ทธ๋์ ๋ชจ๋ธ์ ์ค์ ๋ ๋ฆฌ์ค๋๋ ํธ๋ฆฌ๊ฑฐํ ์์น๊ฐ ๋ช
ํํ์ง ์์ต๋๋ค.
history.listen( ์์น => {
if(์์น.๊ฒฝ๋ก๋ช
=== '/์ฌ์ฉ์') {
๋ณด๋ด๋ค({
์ ํ:'querySuccess',
์ ํจ ํ์ฌ๋:{}
})
}
})
์ถ์ : querySuccess ๋ฉ์๋์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๊ณ ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ณธ connect(mapStateToProps)(Users)๋ฅผ ์ฌ์ฉํ ๋ ์ค๋ฅ๋ ๋ณด๊ณ ๋ฉ๋๋ค.
connect.js:41 ์กํ์ง ์์ TypeError: ํด๋์ค๋ฅผ ํจ์๋ก ํธ์ถํ ์ ์์ต๋๋ค.
์์๊ฐ์ ๋ฐ๋ณด๊ฐ ๋ ๊ธฐ๋ถ์ด ๋๋๋ฐ, ๊ท์ฐฎ๊ฒ ์ค๋ช
๋๋ ค๋ ๋ ๋ฐ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค!
์ dva? ์์ด๋ก ๋ง ํด์ฃผ์ธ์
๋๋ ์ด๋ฐ ๋ฐฉ์์ ๊ธ์ฐ๊ธฐ๋ฅผ ๋ณ๋ก ์ข์ํ์ง ์๋๋ค.
@codering user-dashboard์์ antd form ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ค๊ณ ๋ง์ํ์
จ๋๋ฐ ์์ ์ปดํฌ๋ํธ์๋ ์ฌ์ฉํ ์ ์๋ ๊ฑธ๋ก ๊ธฐ์ตํ๋๋ฐ ์ง๊ธ ๊ฐ๋ฅํ๊ฐ์?
์ ๋ ๊ฐ์ฅ ๋ง์ด ์ ํด๋ณด์๋๋ฐ ์์ ํจ์ ์ปดํฌ๋ํธ๋ผ๋ฉด props.form.getFieldDecorator๋ฅผ ํตํด์ getFieldDecorator ํจ์๋ฅผ ์ป์ ์ ์์ต๋๋ค.
๋๋ ์ ์๊ฒ ํด๊ฒฐ์ฑ
์ด ์๋์ง ๋ชจ๋ฅด๊ฒ ๋ค @sorrycc
๊ฐ์ ํ์ด์ง๋ฅผ ์์ด๋ก ์์ํ ์ ์์ต๋๊น? ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ์ดํดํ ์ ์์ผ๋ฉฐ ์ dva๊ฐ ํ์ํฉ๋๊น?
์๋ ํ์ธ์, ๋๊ท๋ชจ ํ๋ก์ ํธ๋ผ๋ฉด ๊ทธ ์ํ๊ฐ ๋งค์ฐ ์ปค์ ์ฒ๋ฆฌํ๊ธฐ๊ฐ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ธ ๊ฒ์ ๋๋ค.์ฌ๋ฌ ๊ฐ์ ๋ชจ๋ธ๋ก ๋ถํ ํด์ผํฉ๋๊น?
@yazhou-zyz ๋๋ ๋น์ ๊ณผ ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค:
๊ฒฝ๊ณ : setState(...): ๊ธฐ์กด ์ํ ์ ํ(์: ๋ ๋ ๋๋ ๋ค๋ฅธ ๊ตฌ์ฑ ์์์ ์์ฑ์ ๋ด์์) ๋์ ์
๋ฐ์ดํธํ ์ ์์ต๋๋ค. ๋ ๋ ๋ฉ์๋๋ props ๋ฐ state์ ์์ํ ํจ์์ฌ์ผ ํฉ๋๋ค. ์์ฑ์ ๋ถ์์ฉ์ ๋ฐํจํด์ด์ง๋ง componentWillMount๋ก ์ด๋ํ ์ ์์ต๋๋ค.
์ด๋ป๊ฒ ํด๊ฒฐํ์
จ๋์ง ์ฌ์ญค๋ณด๊ณ ์ถ์ต๋๋ค.
๋ฐฐ์ฐ๋ค
๊ณ์ ๊ณต๋ถํ๋ค
dva๋ ๊ฑด์ค ํ๋ก์ ํธ์ ํฐ ์ฐธ๊ณ ๊ฐ์น๊ฐ ์์ต๋๋ค.
์ํ์ด~
์์ด๋ก ๋ ๋ฌธ์๋ ์ด๋์์ ์ฐพ์ ์ ์์ต๋๊น ??? ๋ฒ์ญ ์์ง์ผ๋ก ์ฃผ์ ๋ฅผ ๋ฒ์ญํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์๊ณ ์ดํด๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์์ด๋ก ์ฌ๋ฌ๋ถ์ ์ธ๊ณ์ ๋๋ฌํ ์ ์์ต๋๋ค. ์ข์ ์ผ์ ๊ณ์ํ์ญ์์ค! :๋ก์ผ:
dva๋ React-native 0.47.X ๋ฐ React16.0.0 ๋ฒ์ ์์ ์๋๋์ง ์์ต๋๋ค.
@vecold ๋ ์ด๋ ์ฝ๋๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ํญ์ ์ฌ์ฉํ ์ ์์์ต๋๋ค.
๋ฌธ์์ ์์ด ๋ฒ์ญ์ ์ป์ ์ ์๋ ๊ธฐํ๊ฐ ์์ต๋๊น?
๊ฐ์ฌ ํด์!
๋น์ฆ๋์ค ์ฝ๋์์ ์ด๋ฌํ ์๊ฐ ์ผ๋ฐ์ ์ ๋๋ค.๋ก์ปฌ ์ํ ์ ๋ฐ์ดํธ๋ ์ ์ฒด ๋ณธ๋ฌธ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.๋ค์ ๋ ๋๋งํ ํ์๊ฐ ์๋ ๋ง์ ์์น๋ ๋ค์ ๋ ๋๋ง๋์ด ํ์ด์ง ์ฑ๋ฅ์ด ํฌ๊ฒ ์ ํ๋ฉ๋๋ค. ๋ถํ์ํ mapStateToProps ๊ณ์ฐ์ ์ค์ด๊ณ ๋ค์ ๋ ๋๋งํ๊ธฐ ์ํด redux ์ฐ๊ฒฐ์ด ์์กดํ๋ ์ํ๋ฅผ ์๋์ผ๋ก ๋ถ์ํ๊ธฐ ์ํด ์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ์ ์์ต๋๊น ๐
๋งค์ฐ ์ข์
ํ์ง๋ง ๋จ์ผ ํ์ด์ง๋ฅผ ๋ง๋ค๋ ค๊ณ ํ ๋ ๋ชจ๋ ํ์ด์ง๋ฅผ ๋น๋ํฉ๋๋ค.
_๋น๊ณต์ ๋ฒ์ญ_
๋ฆฌ๋์ค๊ฐ ์ข์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋ฌด ๋ง์ ๊ฐ๋ , ๋ถ๋ฆฌ๋ ๊ฐ์๊ธฐ, ๋ฌด์ฉ๋ด ๋ฐ ์์ (๋ค๋ฅธ ํ์ผ๋ก ๋ถํ )์ด ์์ต๋๋ค.
๊ธฐ์กด ํ๋ ์์ํฌ(redux + react-router + redux-saga ...)์ ๋ํ ๋ผ์ดํธ ๋ํผ์ ๋๋ค. ์๋ก์ด ๊ฐ๋ ์ด ํฌํจ๋์ง ์์์ต๋๋ค. < 100์ค ์ฝ๋. (๋๋ฆ ๋๋ฌด์ ์ถ์์ ์๊ฐ์ ๋ฐ์์ต๋๋ค. )
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋๋ผ ํ๋ ์์ํฌ์ ๋๋ค. Ember.js์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ๋ถ๋ถ์ ์์ฑํ๋ ๋ฐฉ์์ ์ ํํฉ๋๋ค. ํ์ํฌ๋ฅผ ์ํด ๋ ์ฝ๊ฒ ์ ์ดํ ์ ์์ต๋๋ค. Dva๋ react ๋ฐ react-dom์ ์ ์ธํ ๋ชจ๋ ์ข ์์ฑ์ peerDependencies๋ก ์บก์ํํฉ๋๋ค.
๊ทธ๊ฒ์ ๊ตฌํ์ ๊ฐ๋ฅํ ํ ์ ๊ฒ ์๋ก์ด ๊ตฌ๋ฌธ์ ๋์ ํฉ๋๋ค. ์ข ์์ฑ์ ์ฌ์ฌ์ฉํฉ๋๋ค. exp.์ ๊ฒฝ์ฐ ๋ผ์ฐํฐ ์ ์๋ 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
๋ฅผ ๋ง๋ค๊ณ ๊ทธ๋ค ์ฌ์ด์์ ์ ํํ๊ณค ํ์ต๋๋ค.
ํต์ฌ:
key
rootReducer
๊ฐ์ฒด์ ์๋ reducer
์ keyinitialState
์ reducer
devtool
ํซ ๋ฆฌ๋ก๋Effects
๋ ๋ ๋ง์ saga
๋ชจ๋ธ์ ์ง์ํฉ๋๋ค.๊ฐ๋ฐ ๋๊ตฌ ์ง์?
redux-devtool, css livereload์ ํธํ๋ฉ๋๋ค. ํซ ๋ฆฌ๋ก๋์ ๋ ๋ง์ ์์ ํ์
์ ํ ํ๊ฒฝ์ ์ข์๊ฐ์?
ํ์คํ
redux + redux-saga์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๊น?
๋ค
๋ธ๋ผ์ฐ์ ํธํ์ฑ?
redux-saga๋ก ์ธํด IE8์ด ์์ต๋๋ค. (๋์ค์ thunk, promise, observable์ ํจ๊ณผ ๋ ์ด์ด์ ํ์ฅ์ผ๋ก ์ ์ฉํ ์ ์์)
์ ์ฌํด์ฃผ์ธ์
['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/count 404์ธ ์ด์ ๋ ๋ฌด์์ ๋๊น?
๋ฐฐ์ฐ๋ค!
์ ์ ๋ฐ๋ผ๋ด
์ ์๊ฒ ๊ฐ์ฌํฉ๋๋ค, ์คํ ์์ค๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค
๋๋ ๋ํฌ๋ค์๊ฒ์ ๋ฐฐ์ธ ์ ์๋ค!
์ฐ๋ฆฌ๊ฐ ์ฌ์ฉํ ์ ์๋ ํธ๋ฆฌํ ํ๋ ์์ํฌ๋ฅผ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
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 ์์ฑ ์คํ์ผ์ ๊ฐ๊ฒฐํ๊ณ ์ํ๋ฅผ ์์ ํ๋ ๋ฐ ํ ์ค๋ง ์์ผ๋ฉด ๋์ง๋ง ๊ตฌ๋ฌธ์ ์คํ์ ํตํด ์ฌ๋ฌ ์ค์ ์ฝ๋๋ฅผ ํจ๊ป ์์ฑํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๋จธ์ง ์ํ๋ฅผ ๋ค์ ์ ๋ฅ์ฅ์ผ๋ก ์ ๋ฌํ๋ ค๋ฉด ...state
๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ํ๊ฐ ์๋ฃ๋์ง ์์ต๋๋ค. ์ฆ, ๋ฆฌ๋์ค ๋จ๊ณ์์ ์๋ชป ์์ฑํ๋ฉด ์ผ๋ถ ์ํ๊ฐ ์์ค๋ ์ ์์ต๋๋ค.
์ด๋ค ๋ฉด์์๋ Vuex์ ์์ด๋์ด๊ฐ ๋ ์ฝ๊ธฐ ์ฝ๊ณ ์์ฐ์ค๋ฝ์ต๋๋ค. ์ด์ ๊ฐ์ด ์์ฑํ์ญ์์ค(์ ํํ์ง ์์).
const mutation = {
['products/query'](state) {
state.loading = true
},
['products/query/success'](state, payload) {
state.loading = false
state.list = payload
}
}
์ฝ๋ ๋ฉด์์ ๋๋ (๋๊ธฐ์ ์ผ๋ก) ์์ ํ๋ ์ํ์๋ง ๊ด์ฌ์ด ์์ต๋๋ค. Vuex๋ ๋ํ state next-stop ๋ฐฐ๋ฌ์ ์ํด ์ธ๋ถ ๋ ์ด์ด๋ฅผ ๋ํํด์ผ ํฉ๋๋ค. ์๋ง๋ ๋ฐฐ๋ฌ ์ ์ ์ผ๋ถ ๋ฐฉ์ด์ ์ธ ๊ฒ์ฌ(์ถ์ธก)๊ฐ ์ํ๋๊ฑฐ๋ ํํฌ๊ฐ ์ฌ์ด์ง ์ ์์ต๋๋ค.
dva ๊ณต์ ํํ์ด์ง์ ์์ ํ์ด์ง๊ฐ ์๋์์ ์๋ฌ๊ฐ ๋๋์ง ๋ฌผ์ด๋ณด๋๋ฐ ์ ๊ทธ๋ ์ด๋์ธ๊ฐ์?
์ ์ฌํด์ฃผ์ธ์
['products/query']: function*() {} ['products/query'](state) {}
๊ตฌ๋ฌธ์ ๋ฌด์์ ๋๊น? ๋ฐฐ์ด์ ํจ์ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๊น?
ES6์์๋ ๋ฆฌํฐ๋ด์ด ๊ฐ์ฒด(ํํ์)๋ฅผ ๊ฐ์ฒด์ ์์ฑ ์ด๋ฆ์ผ๋ก ์ ์ํ ์ ์์ต๋๋ค. ์ฆ, ํํ์์ ๋๊ดํธ ์์ ๋ฃ์ต๋๋ค.
์ ๊ฐ์
obj = {
['xxname']: 'what ever you defined',
['xxyy'](args) {
....
}
}
'products/query'๋ ๋ฆฌ๋์์ ํธ์ถ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ ๋ฌธ์์ด์ ํตํด ๋ค์์คํ์ด์ค์ ์ฐ๊ฒฐ๋๋ค.๋์ค์ ํ๋ก์ ํธ๊ฐ ์๋ฐฑ ๊ฐ ๋ฉ์๋์ ๊ฐ์ด ๋ ์ปค์ง๋ฉด. ๋ด ๋ค์์คํ์ด์ค๋ฅผ ๋ณ๊ฒฝํด์ผ ํ๋ ๊ฒฝ์ฐ. ๋ฐฑ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋ฐ๊พธ๋ ค๋ฉด?
@yesmeck ๐, ๊ฐ์๊ธฐ ์ธํธ์์ ์ญํ ์ ์ด์ ์ ๊ณผ์ ํ๊ฐ๋์์ต๋๋ค.
์ฌ๊ธฐ์ ์ง์์ด ์๋์ง ๋ชจ๋ฅด์ญ๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
redux๋ก ์ด์๋๋ค๋ ๊ฒ์ ๊ทธ์ ๋ณต์์ผ ๋ฟ์ด์ง ๋๋ฌด ์ฌํํ๊ณ ์ฐ์ํ๋ค ๋์ฐฌ์! ! !
btw ์ค๋ ํธ์ํฐ์ ์ธ๊ตญ์ธ์ด ์ฌ๋ฆฐ๊ฑฐ ์ฐ์ฐํ ๋ดค๋๋ฐ ์ธ๊ตญ์ธ์ด ์ด๊ธ์ธ์ค์์๋๋ฐ ์๋ฆฌํ์ด ๋๊ธ์์ผ์ค์ ๋ชฐ๋๋ค ๐