Не помещайте флаги isError или isLoading в нормализованные данные, потому что normalizr предназначен для нормализации глубоко вложенных объектов.По сути, он берет глубоко вложенный объект javascript и выравнивает его, и таким образом вы можете избавиться от избыточных данных, что является его самым большим преимуществом.Мы использовали React + Redux-Sagas + нормализр.Надеюсь, что этот кусок кода поможет вам настроить редуктор
Редуктор
// @flow
import {
FETCH_DETAILED_EXPERIENCE_DATA,
FETCH_DETAILED_EXPERIENCE_DATA_SUCCESS,
FETCH_DETAILED_EXPERIENCE_DATA_ERROR,
} from '../ActionTypes'
import Immutable from 'seamless-immutable'
import { createReducer } from '../CreateReducer'
const INITIAL_STATE = Immutable({
experienceData: null,
isFetching: false,
error: null,
})
const reducers = {
[FETCH_DETAILED_EXPERIENCE_DATA]: (state, action) => {
return Immutable.merge(state, { experienceData: null, isFetching: true })
},
[FETCH_DETAILED_EXPERIENCE_DATA_SUCCESS]: (state, { data }) => {
return Immutable.merge(state, { experienceData: data, isFetching: false, error: null })
},
[FETCH_DETAILED_EXPERIENCE_DATA_ERROR]: (state, { error }) => {
return Immutable.merge(state, { error, isFetching: false })
},
}
export const reducer = createReducer(INITIAL_STATE, reducers)
Sagas
import { FETCH_DETAILED_EXPERIENCE_DATA } from '../ActionTypes'
import { put, takeLatest, call } from 'redux-saga/effects'
import API from '../../Services/baseApi'
import * as ExperienceActions from './Actions'
import * as EntitiesActions from '../entities/Actions'
import parseExperienceDetailResponse from 'App/Schemas/APIResponse/ExperienceDetailResponse'
function* fetchExperienceDetails(action) {
try {
const response = yield call(API.get, 'URL')
const { entities, result } = parseExperienceDetailResponse(response.data)
yield put(EntitiesActions.updateEntities(entities))
yield put(ExperienceActions.fetchDetailedExperienceSuccess(result))
} catch (e) {
yield put(ExperienceActions.fetchDetailedExperienceError(e.message))
}
}
export default function* root() {
yield [yield takeLatest(FETCH_DETAILED_EXPERIENCE_DATA, fetchExperienceDetails)]
Схема
// @flow
import { normalize, schema } from 'normalizr'
const experience = new schema.Entity(
'experiences',
{
owner: user,
},
{ idAttribute: 'Id' },
)
const response = new schema.Object({
experience,
})
export default (input: any) => {
const { entities, result } = normalize(input, response)
return {
entities,
result: result,
}
}
Надеюсь, это поможет, спасибо.