<p>dva ์†Œ๊ฐœ</p>

์— ๋งŒ๋“  2016๋…„ 06์›” 24์ผ  ยท  76์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dvajs/dva

์ƒˆ๋กœ์šด ๊ฐœ๋…์€ ์—†๊ณ  ๋ชจ๋‘ ์˜ค๋ž˜๋œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

์™œ dva?

์ผ์ • ๊ธฐ๊ฐ„์˜ ์ž์ฒด ํ•™์Šต ๋˜๋Š” ๊ต์œก ํ›„์— ๋ชจ๋“  ์‚ฌ๋žŒ์ด redux์˜ ๊ฐœ๋…์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ์ด ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ œ์–ด๊ฐ€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋” ์ œ์–ด ๊ฐ€๋Šฅํ•˜๊ณ  ๋…ผ๋ฆฌ๋ฅผ ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ทธ๋Ÿฐ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋…์ด ๋„ˆ๋ฌด ๋งŽ๊ณ  ๋ฆฌ๋“€์„œ, ์‚ฌ๊ฐ€, ์•ก์…˜์ด ๋ชจ๋‘ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค(ํ•˜์œ„ ํŒŒ์ผ).

์ด๊ฒƒ์˜ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • ํŽธ์ง‘ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค๊ณ  ๋ฆฌ๋“€์„œ, ์‚ฌ๊ฐ€, ์•ก์…˜ ์‚ฌ์ด๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ(๋˜๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ)์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํŽธ๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž ๋ชฉ๋ก์„ ์ž‘์„ฑํ•œ ํ›„ ์ œํ’ˆ ๋ชฉ๋ก์„ ์ž‘์„ฑํ•˜๋ ค๋ฉด ๋งŽ์€ ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ผ๋ถ€ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค:

  • ์‚ฌ๊ฐ€์˜ ์“ฐ๊ธฐ๋Š” ๋„ˆ๋ฌด ๋ณต์žกํ•˜๋‹ค ์•ก์…˜์„ ๋“ค์„ ๋•Œ๋งˆ๋‹ค ํฌํฌ -> ์™€์ณ -> ์›Œ์ปค์˜ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•œ๋‹ค
  • ํ•ญ๋ชฉ ์“ฐ๊ธฐ ๋ฌธ์ œ
  • ...

๊ทธ๋ฆฌ๊ณ  dva๋Š” ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

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์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜์— ์ต์ˆ™ํ•˜๋‹ค๊ณ  ๊ฐ€์ •)

  • namespace - rootReducer์— ๊ฒฐํ•ฉํ•  ๋•Œ ๊ฐ์†๊ธฐ์˜ ํ‚ค ๊ฐ’์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
  • state - ๊ฐ์†๊ธฐ์˜ initialState์— ํ•ด๋‹น
  • ๊ตฌ๋… - ์ƒˆ๋กœ์šด ๊ฐœ๋…์˜ [email protected] , dom ์ค€๋น„ ํ›„ ์‹คํ–‰, ์—ฌ๊ธฐ์— ์„ค๋ช… ์—†์Œ, ์ฐธ์กฐ: FRP์— ์ž‘๋ณ„ ์ธ์‚ฌ
  • ํšจ๊ณผ - ์‚ฌ๊ฐ€์— ํ•ด๋‹นํ•˜๊ณ  ์‚ฌ์šฉ์„ ๋‹จ์ˆœํ™”ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ์†๊ธฐ

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๋กœ๋“œ๋งต

  • [x] devtool ํ•ซ์Šค์™‘ ์ง€์›
  • [x] ๋ผ์šฐํ„ฐ๋Š” ๋™์  ๊ตฌ์„ฑ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • [x] ํšจ๊ณผ๋Š” ๋” ๋งŽ์€ ์‚ฌ๊ฐ€ ๋ชจ๋“œ๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • [ ] Effects๋Š” thunk, promise, observable ๋ฐ ๊ธฐํƒ€ ์†”๋ฃจ์…˜์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ํ™•์žฅ์„ ๊ณ ๋ คํ•˜๋ฉฐ ๊ธฐ๋ณธ ๋ชฉ์ ์€ IE8๊ณผ ํ˜ธํ™˜๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • [ ] ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๋””์ŠคํŒจ์น˜ ์ „๋‹ฌ์ด ๋„ˆ๋ฌด ๋ฒˆ๊ฑฐ๋กœ์šฐ๋‹ˆ ๋‹ค์Œ ๊ณ„ํš์„ ๊ณ ๋ คํ•ด๋ณด์„ธ์š”.
  • [x] ๋‹จ์œ„ ํ…Œ์ŠคํŠธ ์†”๋ฃจ์…˜
  • [x] ์ถ”๊ฐ€ ์˜ˆ: todolist, antd-init ์‚ฌ์šฉ์ž, ์ธ๊ธฐ ์ œํ’ˆ

    ์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ

๊ฐœ๋ฐœ ๋„๊ตฌ ์ˆ˜์ค€ ์ง€์›?

์•„์ง ์ ์šฉ๋˜์ง€ ์•Š์€ ํ•ซ ๊ต์ฒด ์™ธ์—๋„ redux-devtool, css livereload ๋“ฑ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์€ ๋ชจ๋‘ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค.

๋นŒ๋“œ ํ™˜๊ฒฝ์—์„œ ์ด๋ฏธ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ•  ์ˆ˜์žˆ๋‹ค.

์ด์ „ redux + redux-saga ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์•„ํ‚คํ…์ฒ˜์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ํฌํ•จํ•ฉ๋‹ˆ๊นŒ?

๋„ค.

๋ธŒ๋ผ์šฐ์ € ํ˜ธํ™˜์„ฑ?

IE8์€ redux-saga๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (๋‚˜์ค‘์— ํ™•์žฅ๋œ ๋ฐฉ์‹์œผ๋กœ ํšจ๊ณผ ๋ ˆ์ด์–ด์—์„œ ์ฝํฌ, ์•ฝ์†, ๊ด€์ฐฐ ๊ฐ€๋Šฅ ํ•ญ๋ชฉ ๋“ฑ์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค)

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

redux๋กœ ์‚ด์•„๋‚œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ์ € ๋ณต์Œ์ผ ๋ฟ์ด์ง€ ๋„ˆ๋ฌด ์‹ฌํ”Œํ•˜๊ณ  ์šฐ์•„ํ•˜๋‹ค ๋Œ€์ฐฌ์–‘! ! !

btw ์˜ค๋Š˜ ํŠธ์œ„ํ„ฐ์— ์™ธ๊ตญ์ธ์ด ์˜ฌ๋ฆฐ๊ฑฐ ์šฐ์—ฐํžˆ ๋ดค๋Š”๋ฐ ์™ธ๊ตญ์ธ์ด ์“ด๊ธ€์ธ์ค„์•Œ์•˜๋Š”๋ฐ ์•Œ๋ฆฌํŽ˜์ด ๋™๊ธ‰์ƒ์ผ์ค„์€ ๋ชฐ๋ž๋„ค ๐Ÿ‘

๋ชจ๋“  76 ๋Œ“๊ธ€

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 ์˜ ๊ฒฝ๋กœ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํŠน๋ณ„ํ•œ ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค.

  1. ์˜ค๋ฅ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ
  2. /create ๊ฒฝ๋กœ์— ์ง์ ‘ ์•ก์„ธ์Šคํ•ด ๋ณด์„ธ์š”.

@nikogu ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ค‘์ฒฉ์„ ํ’€๊ณ  ๋‚˜๋ฉด ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, dva๊ฐ€ ๋ชจ๋ธ์˜ ํ•ซ ๋กœ๋”ฉ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@kkf1190 ์€ ์ด๋ฅผ ๊ณ ๋ ค ์ค‘์ด๋ฉฐ ์ง€์›ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘

๊ทธ์ € ๊ณ ๋ง™๋‹ค๋Š” ๋ง์„ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. . .

์˜ˆ์ „๋ถ€ํ„ฐ vuejs์˜ vue-cli ์Šค์บํด๋”ฉ์ด ์ฐธ ์ข‹๋‹ค๋Š” ์ƒ๊ฐ์„ ํ–ˆ์—ˆ๋Š”๋ฐ ์ด ๊ธ€์„ ์ฝ๊ณ  ์ƒ๊ฐ์ด ์™„์ „ํžˆ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.

์•„์ฃผ ๋ฉ‹์ง„ ํ”„๋ ˆ์ž„! ์ž ์‹œ ์—ฐ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค. @sorrycc Yunda์—๊ฒŒ ๋‘ ๊ฐ€์ง€ ์งˆ๋ฌธ์„ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ์ ํŠธ์—์„œ dva๋ฅผ ์™„๋ฒฝํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
  2. dva+reactjs๊ฐ€ ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์„ ์ž˜ ์ง€์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@freemember007

  1. ๋ฐ˜์‘ ๋„ค์ดํ‹ฐ๋ธŒ ์ง€์›, ์ฐธ์กฐ ์˜ˆ: https://github.com/sorrycc/dva-example-react-native
  2. ์ด๋ก ์ƒ ์„œ๋ฒ„ ์šด์šฉ์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๊ณ , ๊ทธ ๋’ค์— ์žˆ๋Š” redux์™€ react-router ๋ชจ๋‘ SSR์„ ์ง€์›ํ•˜์ง€๋งŒ dva์— ์ ์šฉํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@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 ์—ฐ๊ฒฐ์ด ์˜์กดํ•˜๋Š” ์ƒํƒœ๋ฅผ ์ž๋™์œผ๋กœ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด ์ด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ ๐Ÿ‘

๋งค์šฐ ์ข‹์€
ํ•˜์ง€๋งŒ ๋‹จ์ผ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ค๋ ค๊ณ  ํ•  ๋•Œ ๋ชจ๋“  ํŽ˜์ด์ง€๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

_๋น„๊ณต์‹ ๋ฒˆ์—ญ_

์™œ ๋“œ๋ฐ”?

๋ฆฌ๋•์Šค๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฐœ๋…, ๋ถ„๋ฆฌ๋œ ๊ฐ์†๊ธฐ, ๋ฌด์šฉ๋‹ด ๋ฐ ์ž‘์—…(๋‹ค๋ฅธ ํŒŒ์ผ๋กœ ๋ถ„ํ• )์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ์†๊ธฐ, ํ˜„์ž ๋ฐ ์ž‘์—… ์‚ฌ์ด๋ฅผ ์ž์ฃผ ์ „ํ™˜ํ•ด์•ผ ํ•จ
  2. ๋น„์ฆˆ๋‹ˆ์Šค ๋ชจ๋ธ(๋˜๋Š” ๋„๋ฉ”์ธ ๋ชจ๋ธ)์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐ ๋ถˆํŽธํ•จ. exp.์˜ ๊ฒฝ์šฐ ์ด๋ฏธ user_list๊ฐ€ ์žˆ๊ณ  product_list๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํŒŒ์ผ ์‚ฌ๋ณธ์„ ๋ณต์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์‚ฌ๊ฐ€๋Š” ์“ฐ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋‹จ์ผ ์ž‘์—…์— ๋Œ€ํ•ด ํฌํฌ -> ๊ฐ์‹œ์ž -> ์ž‘์—…์ž๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  4. ์ž…๋ ฅ์ด ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋ณต์žกํ•˜๋‹ค

๋“œ๋ฐ”๊ฐ€ ๋ญ์•ผ?

๊ธฐ์กด ํ”„๋ ˆ์ž„์›Œํฌ(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 ์˜ key
  • ์ƒํƒœ: initialState ์˜ reducer
  • ๊ตฌ๋…: dom์ด ์ค€๋น„๋˜๋ฉด ์‹คํ–‰๋˜๋Š” [email protected] ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…: FRP์—๊ฒŒ ์ž‘๋ณ„ ์ธ์‚ฌ
  • ํšจ๊ณผ: ์‰ฌ์šด ํ˜„์ž
  • ๊ฐ์†๊ธฐ

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

์˜ˆ์‹œ ๋ณด๊ธฐ

๋กœ๋“œ๋งต

  • devtool ํ•ซ ๋ฆฌ๋กœ๋“œ
  • ๋ผ์šฐํ„ฐ์— ๋Œ€ํ•œ ๋™์  ๊ตฌ์„ฑ
  • Effects ๋Š” ๋” ๋งŽ์€ saga ๋ชจ๋ธ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ
  • ๋” ๋งŽ์€ ์˜ˆ: todolist, antd-init ์‚ฌ์šฉ์ž, ์ธ๊ธฐ ์ œํ’ˆ

์ž์ฃผํ•˜๋Š” ์งˆ๋ฌธ

๊ฐœ๋ฐœ ๋„๊ตฌ ์ง€์›?

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 ๐Ÿ‘, ๊ฐ์†๊ธฐ ์ธํ•ธ์„œ์˜ ์—ญํ• ์€ ์ด์ „์— ๊ณผ์†Œ ํ‰๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์ง€์›์ด ์žˆ๋Š”์ง€ ๋ชจ๋ฅด์‹ญ๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰