Redux: рдкреНрд░рд╢реНрди: рдПрдХ рд░рд╛рдЬреНрдп рдореЗрдВ рдПрдХ рд░реЗрдбреНрдпреВрд╕рд░ рдореЗрдВ рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБ рдХрд╛ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди

рдХреЛ рдирд┐рд░реНрдорд┐рдд 15 рдЕрдкреНрд░реИрд▓ 2016  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: reduxjs/redux

рдХреНрдпрд╛ рдпрд╣ рдПрдХ рд╡реИрдз рд░реЗрдбрдХреНрд╕ рд░реЗрдбреНрдпреВрд╕рд░ рд╣реИ?

function reducer(state={ byId: {}, ids: [] }, action) {
  switch (action.type) {
    case 'ADD':
      state = { ...state }
      state.byId[action.id] = action.value
      state.ids.push(action.id)
      return state

    default:
      return state
  }
}

рдкреВрд░реЗ рд░рд╛рдЬреНрдп рдХреЛ рдкрд╣рд▓реЗ рдЙрдерд▓реЗ рдХреНрд▓реЛрди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рдирдИ рд╡рд╕реНрддреБ рд╡рд╛рдкрд╕ рдХрд░ рджреА рдЬрд╛рдПрдЧреА, рд▓реЗрдХрд┐рди рдЖрдВрддрд░рд┐рдХ рд╡рд╕реНрддреБрдПрдВ рд╡рд╣реА рд░рд╣рддреА рд╣реИрдВ рдФрд░ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛрддреА рд╣реИрдВред

рдпрд╛ рдХреНрдпрд╛ рдореБрдЭреЗ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдирд╛ рд╣реИ:

function reducer(state={ byId: {}, ids: [] }, action) {
  switch (action.type) {
    case 'ADD':
      return {
        ...state,
        byId: {
          ...state.byId,
          [action.id]: action.value
        },
        ids: [ ...state.ids, action.id ]
      }

    default:
      return state
  }
}

рдкрд╣рд▓реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рдореБрдЭреЗ рдЬреЛ рджреБрд╖реНрдкреНрд░рднрд╛рд╡ рджрд┐рдЦрд╛рдИ рджреЗ рд░рд╣реЗ рд╣реИрдВ, рд╡реЗ DevTools LogMonitor рдореЗрдВ рд╣реИрдВ:

  • рдкрд┐рдЫрд▓реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдПрдХ рдЙрдк-рдиреЛрдб (рдЬреИрд╕реЗ byId ) рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдирд╡реАрдирддрдо рдХреЗ рд╕рдорд╛рди рдорд╛рди рджрд┐рдЦрд╛рдПрдЧрд╛, рднрд▓реЗ рд╣реА рдпрд╣ рдкрд╣рд▓реЗ рдХреБрдЫ рдФрд░ рдерд╛
  • рд╕рдордп рдпрд╛рддреНрд░рд╛ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд░рд╣реА рд╣реИ

рдХреНрдпрд╛ рдпрд╣ LogMonitor рдореЗрдВ рд╕рд┐рд░реНрдл рдПрдХ рдмрдЧ рд╣реИ рдпрд╛ рджреВрд╕рд░рд╛ рддрд░реАрдХрд╛ рд╕рд╣реА рд╣реИ? рдпрджрд┐ рдореИрдВ рдЙрддреНрдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ state = _.cloneDeep(state) рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рддреЛ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рд╕рд╛рдмрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ LogMonitor рд╕рдорд╛рди рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╕рдорд╛рди рдорд╛рдиред

рдмрд╛рдХреА рдРрдк рдареАрдХ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ @connect рдПрдб рд╡реНрдпреВ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдореЗрд░реА Redux рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рдкреГрд╖реНрда рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИред

рд╕рд╛рде рд╣реА рд░реЗрдбреНрдпреВрд╕рд░ рдХрдВрдкреЛрдЬрд┐рд╢рди рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

function byId(state = {}, action) {
  switch (action.type) {
    case 'ADD':
      return {
        ...state,
        [action.id]: action.value
      }
    default:
      return state
  }
}

function ids(state = [], action) {
  switch (action.type) {
    case 'ADD':
      return [ ...state, action.id ]
    default:
      return state
  }
}

const reducer = combineReducers({
  byId,
  ids
})

рд╕рднреА 3 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдирд╣реАрдВ, рд╡рд╣ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд░рд╛рдЬреНрдп рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рд░рд╣рд╛ рд╣реИред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЙрдерд▓реА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдПрдХ рдирдИ рд╡рд╕реНрддреБ рдмрдирд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдирдИ рд╡рд╕реНрддреБ рдореВрд▓ рдХреЗ рд╕рдорд╛рди byId рдФрд░ ids рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдЖрдк byId[action.id] = action.value рдФрд░ ids.push(action.id) рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдореВрд▓ рдЖрдЗрдЯрдо рдХреЛ рдмрджрд▓ рд░рд╣реЗ рд╣реЛрддреЗ рд╣реИрдВред

рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдореЗрд░реА Redux рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рдкреГрд╖реНрда рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИред

Redux FAQ рдореЗрдВ рдПрдХ рдкреНрд░рд╢реНрди рднреА рд╣реИ рдЬреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд░реВрдк рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдХрд╡рд░ рдХрд░рддрд╛ рд╣реИ: http://redux.js.org/docs/FAQ.html#react -not-rerenderingред

рдмрд╛рдж рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╡рд╣ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдЕрдЧрд░ рдЖрдк рдЪреАрдЬреЛрдВ рдХреЛ рдШреЛрдВрд╕рд▓рд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ рддреЛ рдпрд╣ рдХреБрдЫ рд╣рдж рддрдХ рд╡рд░реНрдмреЛрдЬрд╝ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдХрдИ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдореВрд░реНрдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдореИрдВрдиреЗ рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рдореЗрд░реА Redux рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдбреЗрдЯрд╛ рдкреГрд╖реНрда рдкрд░ рд╕реВрдЪреАрдмрджреНрдз рдХрд┐рдпрд╛ рд╣реИред

рд╕рд╛рде рд╣реА рд░реЗрдбреНрдпреВрд╕рд░ рдХрдВрдкреЛрдЬрд┐рд╢рди рдЗрд╕рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

function byId(state = {}, action) {
  switch (action.type) {
    case 'ADD':
      return {
        ...state,
        [action.id]: action.value
      }
    default:
      return state
  }
}

function ids(state = [], action) {
  switch (action.type) {
    case 'ADD':
      return [ ...state, action.id ]
    default:
      return state
  }
}

const reducer = combineReducers({
  byId,
  ids
})

@gaearon @markerikson рдзрдиреНрдпрд╡рд╛рджред рдореИрдВрдиреЗ рдПрдХ рдЙрдЪреНрдЪ-рдЖрджреЗрд╢-рд░реЗрдбреНрдпреВрд╕рд░ рд▓рд┐рдЦрдирд╛ рд╕рдорд╛рдкреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬреЛ рдЧрддрд┐рд╢реАрд▓ рдЕрдиреБрдХреНрд░рдорд┐рдд рд╕реВрдЪрд┐рдпреЛрдВ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рддрд╛ рд╣реИ (рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛)

рдХреЛрдб: https://gist.github.com/elado/95484b754f31fcd6846c7e75de4aafe4

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

wmertens picture wmertens  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

vslinko picture vslinko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

jbri7357 picture jbri7357  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dmitry-zaets picture dmitry-zaets  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

ms88privat picture ms88privat  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ