#reactjs #react-native #pagination #react-context
#reactjs #react-native #разбивка на страницы #реагировать-контекст
Вопрос:
Я использую разбивку на страницы, и мне нужно добавить после итерации страницы новые данные в состояние. Использование контекста для хранения моих данных.
функция для выборки данных
const fetchMissions = (dispatch) => async (page) => {
const response = await fdApi.get('/mission', {
params: { page, limit: 10 },
});
dispatch({ type: 'fetch_missions', payload: response.data });
};
Редуктор
const missionReducer = (state, action) => {
switch (action.type) {
case 'add_error':
return { ...state, errorMessage: action.payload };
case 'fetch_missions':
return action.payload
default:
return state;
}
};
Проблема в случае редуктора ‘fetch_missions’, не знаю, как сохранить старые данные при загрузке новой страницы и добавить новые данные в тот же массив
Комментарии:
1. Какова структура
state
?2. @Matt В идеале это были бы миссии: { data: [], pageInfo: {} },
Ответ №1:
Используйте необходимость изменить ваш редуктор, предполагая, что ваше состояние похоже {missions: []}
. Убедитесь, что ваши начальные миссии в состоянии — пустой массив
case 'fetch_missions':
return {missions: [...state.missions, ...action.payload.missions.docs]}
Комментарии:
1. Недопустимый JS и
action.payload.missions
является объектом в примере данных OP2. @Matt правильно,
{state.missions: []}
это недопустимый способ присвоения свойства объекта. Вы, наверное, просто хотели сделать{missions:
?3. да, извините, я этого не видел, проверьте это {миссии: […state.missions, …действие. полезная нагрузка.миссии.документы]}
4. Я все еще не совсем прав,
{ ...state, missions: [...state.missions, ...action.payload.missions.docs]}
и это предполагает, что у вас правильная структураstate
5. Ему нужно убедиться, что структура состояния верна. вышесказанное просто для того, чтобы показать, как он может его использовать
Ответ №2:
Вам нужно будет обновить свой редуктор, чтобы иметь этот код:
// Setup the initial state of the reducer to have empty arrays or null for all values
const initialState = {
errorMessage: null,
missions: {
data: [],
pageInfo: {},
}
};
const missionReducer = (state = initialState, action) => {
switch (action.type) {
case 'add_error':
return { ...state, errorMessage: action.payload };
case 'fetch_missions':
return {
...state,
missions: { ...missions, data: [...missions.data, ...action.payload.missions.docs] }
};
default:
return state;
}
};