Right way to update state in redux reducers

后端 未结 3 714
悲&欢浪女
悲&欢浪女 2020-12-24 14:20

I\'m a newbie in redux and es6 syntax. I make my app with official redux tutorial, and with this example.

There is JS snippet below. My point - to define REQUEST_PO

3条回答
  •  长情又很酷
    2020-12-24 14:49

    I pretty much implemented Object reducers by using Object.assign, which works, but as our project has grown and we have added a bunch of dependent components it has become very inefficient and renders are very slow.

    If I'd know about immer I would have used that from the start.

    Essentially you use immer as follows, where the example has a layers object that looks like this:

    const initialState = {
      layers: {
       'layer1': { selected: false },
       'layer2': { selected: true }
      }
    }
    

    Reducers.js (extract)

    import produce from 'immer'
    import has from 'lodash/has'
    export const layers = (state = null, action) => {
      switch (action.type) {
        case ADD_LAYER:
          // Using `immer.produce` only for consistency 
          // clearly the whole object changes in this case.
          return produce(state, layers => {
            // Take a copy of the prebuilt layer
            var layer = Object.assign({}, action.layer)
            // Add some defaults
            if (!has(layer, 'selected')) {
              layer.selected = false
            }
            layers[action.id] = layer
          })
        case SELECT_LAYER:
          return produce(state, layers => {
            layers[action.id].selected = true
          })
        case UNSELECT_LAYER:
          return produce(state, layers => {
            layers[action.id].selected = false
          })
        default:
          return state
      }
    }
    

    Actions.js (extract)

    export const addLayer = id => ({
      type: ADD_LAYER,
      id
    })
    
    export const selectLayer = id => ({
      type: SELECT_LAYER,
      id
    })
    
    export const unSelectLayer = id => ({
      type: UNSELECT_LAYER,
      id
    })
    

    References:

    https://github.com/immerjs/immer

    https://redux.js.org/recipes/structuring-reducers/immutable-update-patterns

提交回复
热议问题