useReducer 요청 상태에 따라 관리하기
// action : dispatch 함수로 받을 액션
const reducer = (state, action) => {
switch(action.type) {
case "INCREMENT :
return state + 1 ;
case "DECREMENT :
return state - 1 ;
}
}
// state : 현재 상태 값 => 변수
// dispatch : state 값을 업데이트 하고, 재 랜더링을 촉발하는 함수
const [ state, dispatch ] = useReducer( reducer , 0 );
return (
<h3> {state} </h3>
<button onClick={() => {dispatch( {type:'INCREMENT'}) }}> + </button>
<button onClick={() => {dispatch( {type:'DECREMENT'}) }}> - </button>
)
누르면 1씩 증감하는 Counter를 이런식으로 reducer을 이용해서 만들 수 있음
어제했던 User컴포넌트를 그대로 가져와서 reducer을 사용하는 방식으로 바꿔서 데이터를 가져오고 상태마다의 상황을 표시하기
action type : SUCCESS / ERROR / LOADIONG
import axios from 'axios';
import React, { useEffect, useReducer} from 'react';
function reducer(state, action){
switch(action.type){
case 'LOADING' :
return {
loading : true,
data : null,
error : null
};
case 'SUCCESS' :
return {
loading : false,
data : action.data,
error : null
};
case 'ERROR' :
return {
loading : false,
data : null,
error : action.error
};
default :
throw new Error(`Unhandled action type : ${action.type}`);
}
}
const User2 = () => {
const [ state , dispatch] = useReducer(reducer, {
loading : false,
data : null,
error : null
});
const fetchUsers = async () => {
try{
// 요청이 시작되면 loding의 상태를 true로 변경
dispatch({type: 'LOADING'});
const response = await axios.get('https://jsonplaceholder.typicode.com/users');
console.log(response);
dispatch({type : 'SUCCESS', data: response.data});
} catch(e){
dispatch({type : 'ERROR', error : e});
}
}
useEffect(() => {
fetchUsers();
},[]);
const { loading, data:users, error} = state; // state.data => users 키워드로 조회
if(loading) return <div>로딩중...</div>;
if(error) return <div>에러가 발생했습니다.</div>
if(!users) return <div>User null!!!</div>
return (
<div className='user2'>
<div className='user'>
<div>User2.jsx 영역</div>
<ul>
{
users.map(user => (
<li key={user.id}>{user.username} ({user.name}) : {user.email}</li>
))
}
</ul>
<button onClick={fetchUsers}> 다시 불러오기 </button>
</div>
</div>
);
};
export default User2;
'React 수업 정리' 카테고리의 다른 글
게시판 구현해보기(1) (0) | 2024.09.24 |
---|---|
Board 만들어보기 (0) | 2024.09.19 |
React 4일차. (3) | 2024.09.09 |
React 3일차 (0) | 2024.09.06 |
React 2일차 (1) | 2024.09.05 |