Селектор Redux от многих ко многим - PullRequest
0 голосов
/ 05 июля 2018

React + Redux рекомендует сохранять нормализованные данные и использовать селекторы для получения производных данных. Таким образом, в нашем магазине мы сохраняем Users и Tags, которые имеют отношения многие ко многим.

type Store = {
    entities: {
        users: User[];
        tags: Tag[];
        userTagMapping: { userId: string, tagId: string }[]
    }
}

И, на наш взгляд, мы хотим показать некоторые производные данные для этого отношения многих ко многим. Например, мы хотим вычислить общее количество пользователей с некоторым тегом или онлайн-пользователей с некоторым тегом. Прямо сейчас мы решили это, используя rselect . Единственная проблема состоит в том, что вычисление этих вещей становится довольно утомительным. Например, у нас есть селектор, который возвращает карту из идентификатора тега в список пользователей, чтобы показать, какие пользователи принадлежат этому тегу (и наоборот, селектор из идентификатора пользователя в список тегов).

const selectUsersPerTag = createSelector(
    selectUsers, selectTags, selectUserTagMapping,
    (users, tags, mapping) => {
        let result = {};
        for (const tag on tags) {
             const isUserMappedToTag = user => ({userId, tagId}) => userId == user.id && tagId === tag.id
             result[tag.id] = users.filter(user => mapping.some(isUserMappedToTag(user)))
        }
        return result
    }
)

и, на мой взгляд, это выглядит довольно некрасиво и слишком сложно для чтения на мой вкус.

Мои вопросы:

  • Правильно ли мы понимаем рекомендации (использовать нормализацию и селекторы)?
  • Является ли использование карты правильным способом обработки наших данных и отображения их в виде или есть лучший способ? Я спрашиваю, потому что это в основном копирует наши данные (слегка измененные) много раз в подпорки наших компонентов React
  • Есть ли более хороший способ сделать это отображение (которое по сути является SQL-подобным соединением)? Потому что мне действительно не нравится этот императивный подход, и я бы нашел более функциональный подход.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...