【React】ReduxToolkit에서 비동기 처리 구현
개요
ReduxToolkit은 ReduxThunk가 내장되어있어 구현량 적게 Redux로 비동기 처리를 만들 수 있습니다.
사전 준비
CreateReactApp에서 React 앱의 병아리를 만들어 둡니다
npx create-react-app redux-thunk-sample
yarn start
# open http://localhost:3000
ReduxToolkit을 사용한 비동기 처리 구현
라이브러리 추가
yarn add react-redux @reduxjs/toolkit
통신 처리 작성
src/api/qiitaApi.js
export async function getItems() {
const res = await fetch('https://qiita.com/api/v2/items');
const json = await res.json();
if (!res.ok) throw new Error(json.message);
return json;
}
src/store/qiitaSlice.js
import { createSlice } from '@reduxjs/toolkit';
import { getItems } from '../api/qiitaApi';
// Slice
export const qiitaSlice = createSlice({
name: 'qiita',
// stateの初期値を設定
initialState: { loading: false, error: null, items: [] },
reducers: {
// 通信を開始した時に呼ぶ関数
fetchStart(state, action) {
state.loading = true;
state.error = null;
},
// 通信が失敗した時に呼ぶ関数
fetchFailure(state, action) {
state.loading = false;
state.error = action.payload;
},
// 通信が成功した時に呼ぶ関数
fetchSuccess(state, action) {
state.loading = false;
state.error = null;
state.items = action.payload;
},
},
});
// Actions
export const { fetchStart, fetchFailure, fetchSuccess } = qiitaSlice.actions;
// 外部からはこの関数を呼んでもらう
export const fetchItems = () => async dispatch => {
try {
dispatch(fetchStart());
dispatch(fetchSuccess(await getItems()));
} catch (error) {
dispatch(fetchFailure(error.stack));
}
};
// Selectors
export const selectQiita = ({ qiita }) => qiita;
// Reducer(must be default export)
export default qiitaSlice.reducer;
loading
, 오류 정보 넣기error
에 정의한 함수를 외부로부터 dispatch 하고 있었습니다기사 목록을 표시하는 구성 요소 만들기
src/components/QiitaItems.js
import React, { useEffect } from 'react';
import { useSelector, useDispatch } from 'react-redux';
import { selectQiita, fetchItems } from '../store/qiitaSlice';
function QiitaItems() {
const dispatch = useDispatch();
const { loading, error, items } = useSelector(selectQiita);
useEffect(() => {
// fetchItemsを実行
dispatch(fetchItems());
}, [dispatch]);
if (loading) return <p>...loading</p>;
if (error) return <p>{error}</p>;
return items.map(item => (
<div key={item.id}>
<h2><a href={item.url}>{item.title}</a></h2>
<p>{item.created_at} by {item.user.id}</p>
</div>
));
}
export default QiitaItems;
items
reducers
로 표시되어 완료하면 기사의 정보가 표시되도록 하고 있습니다.Redux 설정
src/App.js
import React from 'react';
import { Provider } from 'react-redux';
import { store } from './store';
import QiitaItems from './components/QiitaItems';
function App() {
return (
<Provider store={store}>
<QiitaItems />
</Provider>
);
}
export default App;
src/store/index.js
import { configureStore } from '@reduxjs/toolkit';
import qiitaReducer from './qiitaSlice';
export const store = configureStore({
reducer: {
qiita: qiitaReducer,
},
});
동작 확인
요약
Reference
이 문제에 관하여(【React】ReduxToolkit에서 비동기 처리 구현), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/ozaki25/items/1375336826a021370528텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)