Структурирование состояния Redux по домену?

Как следует структурировать состояние Redux при извлечении объектов домена с разными параметрами поиска.

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

Я делаю это:

{
    list_organisations: [
        { id: 1, name: 'foo1' //... },
        { id: 2, name: 'foo2' //... },
        { id: 3, name: 'foo3' //... },
        { id: 4, name: 'foo4' //... },
        { id: 5, name: 'foo5' //... },
    ],
    user_one_organisations: [
        { id: 6, name: 'foo' //... },
        { id: 2, name: 'foo' //... },
    ],
    user_two_organisations: [
        { id: 4, name: 'foo' //... },
        { id: 6, name: 'foo' //... },
    ],  
}

или это:

{
    users: [
        { id: 1, organisations: [7,3,8], name: 'billy' },
        { id: 2, organisations: [3,6,1], name: 'sam' },
    ]
    organisations: [
        { id: 1, name: 'foo', //... },
        { id: 2, name: 'foo1', //... },
        { id: 3, name: 'foo2', //... },
        { id: 4, name: 'foo3', //... },
        { id: 5, name: 'foo4', //... },
        { id: 6, name: 'foo5', //... },
        { id: 7, name: 'foo6', //... },
        { id: 8, name: 'foo7', //... },
        { id: 9, name: 'foo8', //... },
    ],  
}   

Если мы выберем второй вариант, что нам делать в случае, если нам нужно найти одну организацию для какой-то цели, например. «проверить, существует ли электронная почта пользователя в организации» — все это кажется таким сложным… особенно при выполнении разовых запросов? должно ли это даже жить в состоянии редукции?

Это сделало бы это так:

{
    users: [
        { id: 1, organisations: [7,3,8], name: 'billy' },
        { id: 2, organisations: [3,6,1], name: 'sam' },
    ]
    organisation_signup_form: {
        doesUsersEmailExist: true / false / null,
    }
    organisations: [
        { id: 1, name: 'foo', //... },
        { id: 2, name: 'foo1', //... },
        { id: 3, name: 'foo2', //... },
        { id: 4, name: 'foo3', //... },
        // ...
    ],  
}   

person AndrewMcLagan    schedule 29.04.2016    source источник


Ответы (1)


На самом деле я бы рекомендовал структурировать ваши данные совершенно по-другому. Вы хотите убедиться, что все ваши модели легко доступны, поэтому хранить их в массиве может быть сложно.

Я бы предложил структуру состояния примерно так:

users: {
    1: { id: 1, organisations: [7,3,8], name: 'billy' },
    2: { id: 2, organisations: [3,6,1], name: 'sam' },
},
userList: [1,2],
organisation_signup_form: {
    doesUsersEmailExist: true / false / null,
},
organisations: {
    1: { id: 1, name: 'foo', //... },
    2: { id: 2, name: 'foo1', //... },
    3: { id: 3, name: 'foo2', //... }
}

Я получил этот совет от Дэна по этому вопросу

проверить, существует ли электронная почта пользователя в организации

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

Один небольшой совет, который я бы дал, заключается в том, что вам нужно структурировать свое состояние в виде базы данных, но оно не обязательно должно быть той же структурой, что и ваша реальная база данных или конечные точки API.

person Clarkie    schedule 29.04.2016
comment
Хм мне нравится. Хотя я отвечаю с моего сервера API с этой структурой? Или построить его в редукторах? Я бы предпочел, чтобы мой API не был специфичным для редукции :) - person AndrewMcLagan; 29.04.2016
comment
точно, держите свой API верным себе. Реализация клиента должна определять, как вы возвращаете свои данные. Он может влиять на него, но не определять его. - person Clarkie; 29.04.2016
comment
Прохладно. Последний вопрос! Есть ли изящный трюк для ввода сущностей с их идентификатором? Я не хочу тяжелых редукторов? - person AndrewMcLagan; 29.04.2016
comment
Я использую помощники неизменности и делаю что-то вроде этого: {[action.user.id]: action.user} facebook.github.io/react/ документы/обновление.html - person Clarkie; 29.04.2016