위의 사진처럼 버튼이 총 4개가 있는데, increment 버튼을 누르면 +1씩 더해지고, increase by 5버튼을 누르면 +5씩, Decrement 버튼을 누르면 -1씩, Toggle Counter 버튼을 누르면 숫자가 아예 가려지는 버튼을 리덕스 툴킷을 이용해서 만들어보고자 한다.
npm install @reduxjs/toolkit react-redux
import { configureStore } from '@reduxjs/toolkit'
// createSlice를 통해 state를 만들어줘서 store로 보낸다
export default configureStore({ // store 만들어주는 기능
reducer: { }
})
import React from 'react';
import ReactDOM from 'react-dom/client';
import { Provider } from 'react-redux'; // Provider 불러오기
import './index.css';
import App from './App';
import store from './store/store'; // store.js에서 작성한 state들
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<Provider store ={store}><App /></Provider>);
이렇게 작성한다면 App 컴포넌트 안에 있는 모든 하위 컴포넌트들이 store안에 있는 state들을 사용할 수 있다.
import { createSlice, configureStore } from "@reduxjs/toolkit";
// state를 만들어주는 createSlice
const counterSlice = createSlice({
name: "counter", // 사용할 state 이름
initialState: { counter: 0, showCounter: true }, // 사용할 state의 초깃값
reducers : {
increment(state){
state.counter++; // RTK 내부터에서 immer 라는 다른 패키지를 사용하는데,
// 이런 기존 state에 직접 접근하려는 코드들을 감지해서 자동으로 원본state를 복제 해줌
},
decrement(state){
state.counter--;
},
increase(state, action){
state.counter += action.payload; //전달할 값이 있을때는 action.payload사용
},
toggleCounter(state){
state.showCounter = !state.showCounter;
}
}
});
createSlice 안에는
이렇게 3가지가 포함된다.
// store 를 만들어주는 configureStore
const store = configureStore({ // store 역할
reducer : {counter : counterSlice.reducer} // reducer : { 작명 : createSlice만든거.reducer}
})
export default store;
이렇게 되면 store에 state가 저장이 되어서, 컴포넌트들에서 저 counter 라는 createSlice 된 state를 사용 가능하다.
// counterSlice의 reducers들 내보내기
export const counterActions = counterSlice.actions;
import { counterActions } from "../store/store";
const Counter = () => {
console.log(counterActions);
...
store.js에서 저장했던 state 변경함수들이 콘솔창에 나타났다.
import { useSelector } from "react-redux";
const Counter = () => {
const a = useSelector((state) => {return state});
console.log(a);
store 안에 저장되어있던 state들이 전부 출력된다.
import { useDispatch } from "react-redux";
const Counter = () => {
const dispatch = useDispatch();
const incrementHandler = () => {
dispatch(counterActions.increment());
}
...