Redux: рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде redux рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХреИрд╕реЗ рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 20 рдЬреВрди 2015  ┬╖  26рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: reduxjs/redux

рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ рдпрд╛ рдореИрдВ рдЧрд▓рдд рдПрд╕рдПрдордПрд╕ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

let initialState = immutable.fromJS({some_store: "some initial data"});
const redux = createRedux(stores, initialState);
...
export function some_store(state, action) {
    // state is undefined here
}
help wanted question

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

@jsifalda

Redux рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдо:

  • рдЖрдк рдЧрд▓рддреА рд╕реЗ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ
  • рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рддреЗрдЬрд╝ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдмреЗрд╣рддрд░ рдореЗрдореЛрд░реА рдЦрдкрдд

Redux рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рдкрдХреНрд╖:

  • рдЕрдкрдиреА рдЯреАрдо рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдПрдкреАрдЖрдИ
  • рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐
  • рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓

рд╡реНрдпрд╛рдкрд╛рд░ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ!

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

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЬреЛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рд╡рд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╣реИ

// stores/some-store.js
import Immutable from 'immutable'

const { Map, List, fromJS } = Immutable
const initialState = Map({
  foo: 'bar',
  fooList: List()
})

export function someStore (state = initialState, action) {
  if (action.type === 'FOO') {
    return state.set('foo', fromJS(action.foo))
  }
  if (action.type === 'FOO_LIST') {
    return state.set('fooList', fromJS(action.fooList))
  }

  return state
}

// stores/index.js
export { default as someStore } from './some-store'

// application.js
import * as stores from './stores'

const redux = createRedux(stores)

рдЖрдкрдХреЛ рд╕реНрдЯреЛрд░реЛрдВ рдХреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреИрд░рд╛рдореАрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░рд╛рдЬреНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреИрд╕реЗ @emmenko рдиреЗ рджрд┐рдЦрд╛рдпрд╛ред

initialState рддрд░реНрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рд╕рд░реНрд╡рд░ рдпрд╛ рд▓реЛрдХрд▓рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ рд░рд╛рдЬреНрдп рдХреЗ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рд╣реИред ( @acdlite , рд╣рдо рдЗрд╕реЗ рдбреЙрдХреНрд╕ рдореЗрдВ рд╕рдордЭрд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред)

рдЙрд╕рдиреЗ рдХрд╣рд╛, рдЖрдкрдиреЗ рдЬреЛ рдкреНрд░рдпрд╛рд╕ рдХрд┐рдпрд╛ рд╡рд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрдпрд╛ рдХреЛрдИ рдЬрд╛рдВрдЪ рдХрд░ рд╕рдХрддрд╛ рд╣реИ?

рдирд╣реАрдВ, рдореИрдВрдиреЗ рдЬреЛ рдХреЛрд╢рд┐рд╢ рдХреА рд╡рд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рднреА рджреБрдХрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдореИрдВ рд╕рд┐рд░реНрдл рдПрдХ рд╣реА рд╕реНрдерд╛рди рдкрд░ рд╕рднреА рджреБрдХрд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдбреЗрдЯрд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ рдореБрдЭреЗ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рд╢реБрд░реБрдЖрддреА рдбреЗрдЯрд╛ рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд▓рдЧрддрд╛ рд╣реИред

рдлрд┐рд░ рднреА, рдЕрдЧрд░ рдХреБрдЫ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдЦреБрд▓рд╛ рд░рдЦреЗрдВ? рдореИрдВ рдЕрдЧрд▓реЗ рд╣рдлреНрддреЗ рдлрд┐рд░ рдШреВрдореВрдВрдЧрд╛ рдФрд░ рджреЗрдЦреВрдВрдЧрд╛ рдХрд┐ рдпрд╣ рдХрд╛рдо рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рд╕рдорд╕реНрдпрд╛ composeStores рд╣реИ рдЬреЛ рдорд╛рди рд░рд╣рд╛ рд╣реИ рдХрд┐ рдЬрдбрд╝ рд░рд╛рдЬреНрдп рдПрдХ рд╕рд╛рджрд╛ JS рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рдФрд░ state[key] рд╕рд╛рде рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд░рд╣рд╛ рд╣реИ, рдЬреЛ Immutable.Map рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Immutable.Record рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдирд┐рдпрдорд┐рдд рдЬреЗрдПрд╕ рдЧреБрдгреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЦреЗрддреЛрдВ рдХреЛ рд╕реБрд▓рдн рдмрдирд╛рддрд╛ рд╣реИред

рдЕрдиреНрдп рд╕реНрдерд╛рди рднреА рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рдПрдХ рд╕реНрдкрд╖реНрдЯ рд╡рд╕реНрддреБ рд╣реИред

рдУрд╣ред рдпрд╣ рдПрдХ рдорд╣рд╛рди рдкрдХрдбрд╝ рд╣реИ! рд╕рдордЭрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред рдпрд╣ рд╕рд╣реА рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред

рдХрдиреЗрдХреНрдЯрд░реНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рднреА рдЙрд╕реА рдХрд╛рд░рдг рд╕реЗ рд╡рд┐рдлрд▓ рд╣реЛрддрд╛ рд╣реИ: isPlainObject(Immutable.Record) === false ред

@pierregm рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд╣реА рд╣реИред рдпрджрд┐ рдпрд╣ рдШрдЯрдХ рдЧреБрдг рдкрд░ рд░рд┐рдХреЙрд░реНрдб рдЧреБрдг рдлреИрд▓рд╛рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╡реИрд╕реЗ рднреА рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ рдХрд┐ рдЖрдк select={state => state.get('something').toJS()} рд▓рд┐рдЦреЗрдВред

рдореИрдВ рдЗрд╕реЗ рдЗрд╕ рддрд░рд╣ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛,

// store
const initialState = Immutable.fromJS({}).toOrderedMap();

export default function streamStore(state = initialState, action) {
  switch (action.type) {

    case actionTypes.FETCH_STREAM_DONE:
      var streamMap = {};

      for (var i in action.stream_data) {
        var item = action.stream_data[i];
        streamMap[item.id] = item;
      }
      return state.merge(Immutable.fromJS(streamMap).toOrderedMap());

    default:
      return state
  }
};

// select
function select(state) {
  return {stream: state.stream.toList()}
}

рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рдпрд╣ рд╕реНрдЯреНрд░реАрдо (рдПрдХ рд╕реВрдЪреА рджреГрд╢реНрдп) рдореЗрдВ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдХреБрдЫ рдРрд╕рд╛ рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рд╕реНрдЯреЛрд░ рд╕реНрддрд░ рдкрд░ рдкреБрд░рд╛рдиреЗ рд░рд╛рдЬреНрдп рдмрдирд╛рдо рдирдП рд░рд╛рдЬреНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбреЗрдЯрд╛ рдореЗрдВ рдХреЛрдИ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рд╣реЛрдиреЗ рдкрд░ рдХрд┐рд╕реА рднреА рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЛ рдЕрдорд╛рдиреНрдп рдХрд░рддрд╛ рд╣реИред NuclearJS рдпрд╣ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд░рддрд╛ рд╣реИред Redux рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?

@owais

Reselect рджреЗрдЦреЗрдВ: https://github.com/faassen/reselect рдпрд╣ NuclearJS рдЧреЗрдЯрд░реНрд╕ рдХреЗ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

@ рдмреЗрдпрд░рди рдХреВрд▓! ReactEurope BTW рдкрд░ рд╢рд╛рдирджрд╛рд░ рдмрд╛рддрдЪреАрдд! рдзрдиреНрдпрд╡рд╛рджред

рдпрд╣ рдореЗрд░реА рдХреЛрд╢рд┐рд╢ рд╣реИ рдХрд┐ Redux 1.0.0, https://github.com/gajus/redux-immable рдХреЗ рд╕рд╛рде Immutable.js рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдП

рдЕрдЪреНрдЫрд╛ @ рдЧрдЬрд╕! рдкрд░реАрдХреНрд╖рдг redux-immutable рдЕрднреА рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ https://github.com/gajus/canonical-reducer-composition рдкреИрдЯрд░реНрди рдХреЛ рдкрд╕рдВрдж рдХрд░ рд░рд╣рд╛ рд╣реИ

рд╕рд╛рднрд╛рд░ @chiplay рдореИрдВ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕рд░рд╛рд╣рдирд╛ рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдХрдорд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗрдиреА рдЪрд╛рд╣рд┐рдП рдпрд╛ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

рдХреНрдпрд╛ redux рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдлрд╛рдпрджрд╛ рд╣реИ? рдЬрдм Redux рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╡реНрдпрд╡рд╣рд╛рд░ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ (рдЬреИрд╕реЗ рд╕реНрдЯреЛрд░ рд░рд╛рдЬреНрдп рдХреА рдирдИ рдкреНрд░рддрд┐ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ)? рдкреНрд░рджрд░реНрд╢рди (рдХреЛрдИ рдмреЗрдВрдЪрдорд╛рд░реНрдХ?) рдпрд╛ рдХреБрдЫ рдФрд░? рдзрдиреНрдпрд╡рд╛рдж

@jsifalda

Redux рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рдирд┐рдпрдо:

  • рдЖрдк рдЧрд▓рддреА рд╕реЗ рдирд╣реАрдВ рдмрджрд▓ рд╕рдХрддреЗ
  • рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд╕рд╛рде рддреЗрдЬрд╝ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдмреЗрд╣рддрд░ рдореЗрдореЛрд░реА рдЦрдкрдд

Redux рдХреЗ рд╕рд╛рде рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╡рд┐рдкрдХреНрд╖:

  • рдЕрдкрдиреА рдЯреАрдо рдХреЗ рд▓рд┐рдП рд╕реАрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рдПрдкреАрдЖрдИ
  • рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдореЗрдВ рд╡реГрджреНрдзрд┐
  • рдбрд┐рдмрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдереЛрдбрд╝рд╛ рдореБрд╢реНрдХрд┐рд▓

рд╡реНрдпрд╛рдкрд╛рд░ рдЖрдк рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИ!

@gaearon
рдмрд╣реБрдд рддреЗрдЬреА рд╕реЗ рдФрд░ рдЙрдкрдпреЛрдЧреА рдЬрд╡рд╛рдм рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

рдпрджрд┐ рдЖрдк ImmutableJs рдФрд░ Redux рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ Redux рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рддреЛ рдЖрдк https://github.com/indexiatech/redux-immutablejs рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ,

@gaearon рдХреНрдпрд╛ рд╡реЗрдм рд╕рд╛рдЗрдЯ рдкрд░ рд▓рд┐рдВрдХ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

рдереИрдВрдХ рдпреВ рдЖрд╕рдл рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рд▓реЛрдЧ рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдВрдЧреЗред

4 рд╕рд┐рддрдВрдмрд░, 2015 рдХреЛ, 18:36 рдкрд░, рдЖрд╕рдл рд╢рдХрд░рдЪреА рд╕реВрдЪрдирд╛рдПрдВ @github.com рдиреЗ рд▓рд┐рдЦрд╛:

рдпрджрд┐ рдЖрдк ImmutableJs рдФрд░ Redux рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ Redux рдорд╛рдирдХреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ рддреЛ рдЖрдк https://github.com/indexiatech/redux-immutablejs рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ,

@gaearon рдХреНрдпрд╛ рд╡реЗрдм рд╕рд╛рдЗрдЯ рдкрд░ рд▓рд┐рдВрдХ рдбрд╛рд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИ?

-
рдЗрд╕ рдИрдореЗрд▓ рдХрд╛ рдЙрддреНрддрд░ рд╕реАрдзреЗ рджреЗрдВ рдпрд╛ рдЗрд╕реЗ GitHub рдкрд░ рджреЗрдЦреЗрдВред

@asaf

рдЕрдЪреНрдЫрд╛ рд╕рд╛рдорд╛рди, рдХреНрдпрд╛ рдЖрдк Ecosystem.md PR рдмрдирд╛рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ?
рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЗрд╕реЗ рдЦреБрд╢реА рд╕реЗ рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝ рджреВрдВрдЧрд╛ред

рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде @gaearon рд╕рдВрдкрдиреНрди, PR рд╣реИ: https://github.com/rackt/redux/pull/707

рдзрдиреНрдпрд╡рд╛рдж!

рдирдорд╕реНрддреЗ,
@gaearon рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдкреНрд░рд╢реНрди, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ рд░рд┐рдПрдХреНрдЯ / Redux рдРрдк рдкрд░

рдореВрд▓ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛: рдПрдкреАрдЖрдИ рдХреЙрд▓ рд╕реЗ рдбреЗрдЯрд╛ рдХрд╛ рд╕рдВрдЧреНрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдФрд░ рдЗрд╕реЗ рд░рд┐рдбреНрдпреВрд╕рд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ ...

рдореЗрд░реЗ reducer рд╕реЗ,
рдмрд┐рдирд╛ ImmutableJS:

const initialStore = {
    isLoading : false,
    error     : null,
    data      : []
}

// in the switch case
return {
   ...state,
   isLoading: false,
   error: null,
   data: action.result
}

ImmutableJS рдХреЗ рд╕рд╛рде

const initialStore = Map({
    isLoading : false,
    error     : null,
    data      : List()
})

// in the handler function
return state.merge({
    isLoading: false,
    error: null,
    data: List(result.result)
})

рдореИрдВ рд╕реЛрдЪ рд░рд╣рд╛ рдерд╛ рдХрд┐ рдХреНрдпрд╛ "рдЗрд▓рд╛рдЬ" ImmutableJS рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рд▓рд╛рдЧрдд рдирд╣реАрдВ рд╣реИ?

рдХреНрдпрд╛ рдореИрдВ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдпрддрд╛ рд╕реЗ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд▓рд╛рдн рддрдм рдЕрдзрд┐рдХ рд╣реЛрддрд╛ рд╣реИ рдЬрдм рд░реЗрдВрдбрд░рд┐рдВрдЧ рддреНрд╡рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╣реИ рдирд╛?

рдЖрдкрдХреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред

рд▓рд╛рдн рдпрд╣ рд╣реИ рдХрд┐ рдмрдбрд╝реЗ рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдХрд╛рдо рдХрд░рдиреЗ рд╕реЗ рдХрдо рдореЗрдореЛрд░реА рдЦрд░реНрдЪ рд╣реЛрддреА рд╣реИ рдФрд░ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рдЫреЛрдЯреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред

рдареАрдХ рд╣реИ рдзрдиреНрдпрд╡рд╛рджред
рддреЛ рдореИрдВ рд╡реИрд╕реЗ рднреА рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ?

рд╣рд╛рдБ, рдореБрдЭреЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред

рдЕрдм рддрдХ рдХрд╛ рд╡реНрдпрд╛рдкрд╛рд░ рдмрдВрдж рд╣реЛ рдЪреБрдХрд╛ рд╣реИред the

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

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

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

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

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

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

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