Я не знаю, что означают ваши ссылки на модели; я предполагаю, что вы говорите о моделях на бэкэнде, но это на самом деле не влияет на нас, поэтому я буду их игнорировать.
Использование действий для извлечения и форматирования данных в Redux
Давайте начнем с этого утверждения:
Работает нормально для страниц со списками, но модели статей отличаются для индексного маршрута и получают маршрут
Это на самом деле не имеет значения! Это нормально, что данные различаются между маршрутами (даже если они не идеальны).
Я не знаю, где вы сейчас обрабатываете свои запросы API, но я рекомендую поместить их в действия Redux. Используя промежуточное ПО Redux Thunk , мы можем иметь функции в наших создателях действий. Частью работы действия является подготовка данных для редуктора. Это означает, что мы можем использовать функции в действиях для форматирования данных, чтобы они всегда были одинаковыми при попадании в редуктор. Это означает, что нам не нужно писать много похожих редукторов для обработки одного и того же типа сущности, сохраняя вещи СУХИМЫМИ и делая их намного проще в обслуживании.
В этом сценарии у меня будет три действия:
getAllArticles()
getArticlesById(id)
putArticles(articles)
Два действия get article будут отвечать за выполнение запроса, форматирование данных. Затем они берут эти данные и передают их putArticles
, который фактически отправляет действие, которое ожидает редуктор.
Ваши методы будут выглядеть примерно так:
const getAllArticles = () => {
return (dispatch, getState) => {
fetch(yourRoute).then((json) => {
const formattedData = json // format/normalize your data here
dispatch(putArticles(formattedData))
}
}
}
const getArticleById = (id) => {
return (dispatch, getState) => {
fetch(yourRoute + id).then((json) => {
const formattedData = json // format/normalize your data here
dispatch(putArticles(formattedData))
}
}
}
const putArticles = (articles) => {
return {
type: 'PUT_ARTICLES',
payload: {articles}
}
}
Нормализующие данные
Следующий шаг, на который я бы посмотрел, - нормализация ваших данных. Вы действительно проделали довольно хорошую работу по разделению сущностей и хранению разбитой на страницы информации отдельно от списка реальных сущностей.
Я бы разбил ваш магазин по типу сущности.
state = {
articles: {
entities: { /* each article by ID */},
result: [/* array of ID, primary used for looping */],
pagination: { /* various pagination methods */ }
},
...
}
Нормализация данных предотвращает создание формы с вложенными списками ресурсов (например, статьи> пользователи> комментарии). Вы в значительной степени сделали это, формализовав ее с помощью библиотеки, подобной Normalizr , которая позволит вам стандартизировать способ обработки данных.
Я бы переместил нумерацию страниц в отдельную сущность (пользователь, статья). Это позволяет аккуратно разделять вещи по их типу и предотвращает создание этого огромного списка несвязанных данных.
Углубление процесса нормализации в целом выходит за рамки вопроса SO, но взгляните на эти две ссылки:
Нормализация формы состояния Redux
Обновление нормализованных данных