Получение данных по API и хранение в redux. React Js
Доброго времени суток.
У меня вопрос по правильной организации кода.
Задача такая. Получить данных по API, модифицировать (добавить флаги) записать их в хранилище и после чего их использовать.
Стек что использую: React Js, Redux, ts.
Т.к. страниц на сайте не будет, данные подтягивать нужно будет сразу с API. Правильно ли я сделаю, что обращение к API у меня будет не в компоненте, а напрямую из редюсера redux ? Если да, то как сделать так, чтобы обращение сработало сразу при старте redux? В какой момент делать обращение к API?
Пример кода редюсера:
import {ActionCreator, Reducer} from "redux";
export type RootState = {
posts: object
}
const initialState = {
posts: []
}
const POSTS = 'ANIME_POSTS'
type UpdateAnimePosts = {
type: typeof POSTS
posts: object
}
export const updatePosts: ActionCreator<UpdatePosts> = (posts) => ({
type: POSTS,
posts
})
export const rootReducer: Reducer<RootState> = (state = initialState, action) => {
switch (action.type) {
case POSTS:
return {
...state,
posts: action.posts
}
default:
return state
}
}
Ответы (1 шт):
Не совсем понятно утверждение "страниц на сайте не будет". Использование React.js подразумевает выполнение javascript кода в браузере пользователя, который перешел на ваш сайт.
Когда пользователь переходит на ваш сайт, react.js должен отобразить какую-то разметку, в терминах реакта - компонент. При взаимодействии с какой-либо кнопкой или при маунте компонента должен выполниться запрос к вашему API.
При получении респонса должен быть задиспатчен экшен updatePosts, в payload к которому вы передадите данные из респонса. Редьюсер, получив ваш экшен в соответствующем кейсе, может полученный action.payload необходимым образом видоизменить и записать в state.
Далее необходимо создать селектор, отдающий данные из state, которые с помощью useSelector будут получены в компоненте, в котором их необходимо отобразить.
Обобщая, организация потока данных выглядит так: открылась страница -> сделали запрос к API -> после получения респонса задиспатчили экшен -> редьюсер получил экшен с данными и положил их в стор -> страница с помощью useSelector получила новые данные из стора.