Отображение нормализованных данных в компоненте пользовательского интерфейса react

#reactjs #redux #normalizr

#reactjs #сокращение #normalizr

Вопрос:

Допустим, у нас есть нормализованный объект, подобный этому, в хранилище redux.

 {
entities: {
  plans: {
    1: {title: 'A', exercises: [1, 2, 3]},
    2: {title: 'B', exercises: [5, 6]}
  },
  exercises: {
    1: {title: 'exe1'},
    2: {title: 'exe2'},
    3: {title: 'exe3'}
    5: {title: 'exe5'}
    6: {title: 'exe6'}
 }
},
currentPlans: [1, 2]
}
 

Я хочу отобразить для каждого плана детали упражнения в компоненте пользовательского интерфейса. Что-то вроде.

 plan 1
title A
  exercises
   exercise 1
   title: 'exe1'
   exercise 2
   title: 'exe2'
   ..........
plan 2
title B
 exercises
  exercise 5
  title: 'exe5'
  ........
 

Должен ли я снова денормализовать? Как мне преобразовать данные и где? Использую ли я connectStateToProps для выполнения чего-то вроде

  plans: some mapping function that will create nested plans->exercise array
 

или есть другой способ?

Ответ №1:

Да, вы должны денормализовать перед отображением. Например, если у вас есть список активных пользователей, хранящихся в виде денормализованного списка идентификаторов пользователей, вам необходимо сопоставить их и для каждого извлечь соответствующий объект из дерева состояний.

Да, вероятно, сделайте это в mapStateToProps.

Рекомендуемый подход заключается в использовании функции (state) => data, которая будет считывать все необходимое из состояния и формировать окончательную структуру, которая будет предоставлена вашему компоненту.

Обычно используется https://github.com/reactjs/reselect для этой цели, поскольку он также будет запоминать выходные данные ваших селекторов для повышения производительности. Обратите внимание, что, как и большинство вещей в redux, это не волшебство, и вы можете обойтись без него. Особенно, если вы пока просто играете с фреймворком.

Комментарии:

1. Это имеет смысл. Мне нравится предложение, связанное с запоминанием и библиотекой повторного выбора. Не знал об этом.. В любом случае, спасибо за вашу помощь в понимании этого процесса.