import { createStore } from "redux";
const initialState = {
counter: 0,
};
const counterReducer = (state = initialState, action) => {
if (action.type === "increment") {
return { counter: state.counter + 1 };
} else if (action.type === "decrement") {
return { counter: state.counter - 1 };
} else {
return state;
}
};
const store = createStore(counterReducer);
//createStore는 더이상 안씀
//생성한 리듀서와 store를 컴포넌트와 연결하려면 export하면됨
export default store;
//index.js
import React from "react";
import ReactDOM from "react-dom/client";
import { Provider } from "react-redux";
import "./index.css";
import App from "./App";
import store from "./store";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
// Provider로 컴포넌트를 감싸주고 store={store}로 받아온다.
<Provider store={store}>
<App />
</Provider>
);
컴포넌트에서 Store 를 액세스 하려면
import { useSelector } from "react-redux";
를 작성하면된다.
(useStore 훅도 있는데 useSelector 가 더 사용하기 편함)
connect : 는 클래스컴포넌트에서 사용한다.
const counter = useSelector((state) => state.counter);
관리된 데이터를 콜백함수로 적고, 코드를 실행해서 컴포넌트에서 필요한 상태부분을 받는다.
useSelector 로 인해 store 에 데이터가 변경 될 때 마다 자동으로 업데이트되고 최신 값을 받게 된다.
값이 바뀌면 컴포넌트 함수가 리렌더링 됨.
컴포넌트를 unmount 하면 리덕스에서 자동으로 구독을 해지함.
const state = useSelector((state) => state);
const name = state.User.name;
const age = state.User.age;
const address = state.User.address;
이런식으로 작성하게 된다면.. name의 값이 바껴도 age와 address가 리렌더링 된다
최적화의 실패이기 때문에
const name = useSelector((state) => state.User.name);
const age = useSelector((state) => state.User.age);
const address = useSelector((state) => state.User.address);
// 리팩토링
const { name, age, address } = useSelector((state) => state.User);
Store 에서 값을 저장하고 가져와서사용하는건 useSelector이다
import {useDispatch} from 'react-redux'
const dispatch = useDispatch();
const incrementHandler = () => {
dispatch({ type: "increment" });
};
const decrementHandler = () => {
dispatch({ type: "decrement" });
};