npm install @reduxjs/toolkit
npm install react-redux
용어설명Store모든 상태(전역 변수, slice 등)를 저장하는 중앙 저장소| Slice | 상태와 reducer(상태 변경 함수)를 정의하는 단위 |
| Reducer | 상태를 변경하는 함수 (action에 따라 동작) |
| Action | 상태를 변경하기 위해 store에 보내는 신호/함수 |
일반 컴포넌트 --(dispatch action)--> Reducer --(state 변경)--> Store --(상태 전달)--> 컴포넌트
import { createSlice } from '@reduxjs/toolkit';
// [1] 전역 상태의 초기값
const initialState = { isAuthenticated: false };
// [2] Slice 생성
const userSlice = createSlice({
name: "user",
initialState,
reducers: {
login: (state) => { state.isAuthenticated = true; },
logout: (state) => { state.isAuthenticated = false; }
}
});
// [3] Reducer와 Action 내보내기
export default userSlice.reducer;
export const { login, logout } = userSlice.actions;
import { configureStore } from "@reduxjs/toolkit";
import userReducer from './userSlice.jsx';
// 여러 slice를 하나의 store에서 관리
const store = configureStore({
reducer: {
user: userReducer
}
});
export default store;
import { Provider } from 'react-redux';
import store from './store';
import Component13 from './Component13';
createRoot(document.getElementById('root')).render(
<Provider store={store}>
<Component13 />
</Provider>
);
import { useDispatch, useSelector } from 'react-redux';
import { login, logout } from './userSlice.jsx';
export default function Component13(props) {
// [1] store에 저장된 상태 가져오기
const { isAuthenticated } = useSelector(state => state.user);
// [2] dispatch를 이용한 상태 변경
const dispatch = useDispatch();
const loginHandle = () => {
dispatch(login());
};
const logoutHandle = () => {
dispatch(logout());
};
return (
<>
<div>
<h3>Redux 예제</h3>
{isAuthenticated ?
<div>
<p>환영합니다.</p>
<button type='button' onClick={logoutHandle}>로그아웃 버튼</button>
</div>
:
<div>
<p>로그인 상태가 아닙니다.</p>
<button type='button' onClick={loginHandle}>로그인 버튼</button>
</div>
}
</div>
</>
);
}