Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is an example of normalizing the state in a React Redux app?

I'm reading the Redux Reducers docs and don't get how normalizing the state would work. The current state in the example is this:

{
  visibilityFilter: 'SHOW_ALL',
  todos: [
    {
      text: 'Consider using Redux',
      completed: true,
    },
    {
      text: 'Keep all state in a single tree',
      completed: false
    }
  ]
}

Can you provide an example of what the above would look like if we followed the below?

For example, keeping todosById: { id -> todo } and todos: array inside the state would be a better idea in a real app, but we’re keeping the example simple.

like image 717
mangocaptain Avatar asked Aug 17 '16 07:08

mangocaptain


People also ask

What is state normalization in Redux?

A normalized state is a way to store (organize) data. With this way each entity type will have its own place in the store, so that there is only a single point of truth. This practice is the recommended way to organize data in a Redux application as you can read in the Redux recipes.

Why is it recommended to normalize the state?

Because each item is only defined in one place, we don't have to try to make changes in multiple places if that item is updated. The reducer logic doesn't have to deal with deep levels of nesting, so it will probably be much simpler.

What is normalize React?

Normalization is the process of efficiently organizing data.

Which of these example types of data should generally be kept in a Redux store as opposed to the component state?

There is no “right” answer for this. Some users prefer to keep every single piece of data in Redux, to maintain a fully serializable and controlled version of their application at all times. Others prefer to keep non-critical or UI state, such as “is this dropdown currently open”, inside a component's internal state.


1 Answers

This example is straight from Normalizr.

[{
  id: 1,
  title: 'Some Article',
  author: {
    id: 1,
    name: 'Dan'
  }
}, {
  id: 2,
  title: 'Other Article',
  author: {
    id: 1,
    name: 'Dan'
  }
}]

Can be normalized this way-

{
  result: [1, 2],
  entities: {
    articles: {
      1: {
        id: 1,
        title: 'Some Article',
        author: 1
      },
      2: {
        id: 2,
        title: 'Other Article',
        author: 1
      }
    },
    users: {
      1: {
        id: 1,
        name: 'Dan'
      }
    }
  }
}

What's the advantage of normalization?

You get to extract the exact part of your state tree that you want.

For instance- You have an array of objects containing information about the articles. If you want to select a particular object from that array, you'll have to iterate through entire array. Worst case is that the desired object is not present in the array. To overcome this, we normalize the data.

To normalize the data, store the unique identifiers of each object in a separate array. Let's call that array as results.

result: [1, 2, 3 ..]

And transform the array of objects into an object with keys as the id(See the second snippet). Call that object as entities.

Ultimately, to access the object with id 1, simply do this- entities.articles["1"].

like image 142
Mihir Avatar answered Sep 28 '22 05:09

Mihir