Benjamin Li
Benjamin Li

Reputation: 1697

In Redux, is it necessary to do deep copy

The below object is action.data has a nested object address

{
    name: 'Ben',
    address: {
        country: 'Australia',
        state: 'NSW'
    }
}

How should I handle it in the reducer?

const rootReducer = (state = initState, action) {
    switch(action.type) {
        switch RECEIVE_DATA:
            return {...state, data: action.data}
    }
}

Can I do it as above? that I just assign the whole object to data without copying?

or

const rootReducer = (state = initState, action) {
    switch(action.type) {
        switch RECEIVE_DATA:
            const address = {...action.data.address}
            const data = {...action.data, address}
            return {...state, data}
    }
}

Or should I do a deep copy of the object and assign it to data? thanks

Upvotes: 40

Views: 31145

Answers (4)

Jar
Jar

Reputation: 2030

If you are changing only one item in an array, Redux docs says you can use array.map, but if you know the index, this is faster:

     state[action.args.index] = {
        ...state[action.args.index],
        disregardLeafNode: action.args.checked
     }
     return state

        

Upvotes: -3

markerikson
markerikson

Reputation: 67499

The "correct" way to handle updates of nested data is with multiple shallow copies, one for each level of nesting. It's also certainly okay to create a new object that just replaces one field completely, per your first example.

See the Redux docs section on Immutable Update Patterns for some info on how to properly do immutable updates, and also the Redux FAQ entry regarding deep cloning.

Upvotes: 34

Akshay Vijay Jain
Akshay Vijay Jain

Reputation: 15975

No, shallow copy of Unchanged properties.
Changed properties will be anyway new values, so no question of type of copy.

In code we achieve it like this return {...prevState}

Upvotes: 0

Emi
Emi

Reputation: 5055

From Redux:

Common Redux misconception: you need to deeply clone the state. Reality: if something inside doesn't change, keep its reference the same!

Upvotes: 23

Related Questions