자바스크립트 상태관리 라이브러리
Props의 불편함을 개선하기 위해 만들어진 개념
(React 외 다른 언어에서도 사용 가능)
Redux 설치 : npm install redux
Redux
React Redux 설치 : npm install react-redux
React Redux
index.js
import { Provider } from "react-redux";
import store from "./store";
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Provider store={store}>
<App />
</Provider>
);
store.js
import { createStore } from "redux";
import reducer from "./reducer";
let store = createStore(reducer);
export default store;
reducer.js
let initialState = {};
function reducer(state = initialState, action) {
}
export default reducer;
App.js
import { useDispatch} from "react-redux";
function App() {
const dispatch = useDispatch();
const increase = () => {
dispatch({ type: "INCREMENT" });
};
const decrease = () => {
dispatch({ type: "DECREMENT" });
};
return (
<div className="App">
<h1>0</h1>
<button onClick={decrease}>감소</button>
<button onClick={increase}>증가</button>
</div>
);
}
export default App;
reducer.js
let initialSate = {
count: 0,
};
function reducer(state = initialSate, action) {
switch (action.type) {
case "INCREMENT":
return { ...state, count: state.count + 1 };
case "DECREMENT":
return { ...state, count: state.count - 1 };
default:
return { ...state };
}
}
export default reducer;
App.js
import { useDispatch, useSelector } from "react-redux";
function App() {
const dispatch = useDispatch();
const count = useSelector((state) => state.count);
//store에 state값 불러옴
const increase = () => {
dispatch({ type: "INCREMENT" });
};
const decrease = () => {
dispatch({ type: "DECREMENT" });
};
return (
<div className="App">
<h1>{count}</h1>
<button onClick={decrease}>감소</button>
<button onClick={increase}>증가</button>
</div>
);
}
export default App;
App.js
import { useDispatch, useSelector } from "react-redux";
function App() {
const dispatch = useDispatch();
const count = useSelector((state) => state.count);
//store에 state값 불러옴
const increase = () => {
dispatch({ type: "INCREMENT" });
};
const decrease = () => {
dispatch({ type: "DECREMENT", payload: { num: 5 } });
};
return (
<div className="App">
<h1>{count}</h1>
<button onClick={decrease}>감소</button>
<button onClick={increase}>증가</button>
</div>
);
}
export default App;
reducer.js
let initialSate = {
count: 0,
};
function reducer(state = initialSate, action) {
switch (action.type) {
case "INCREMENT":
return { ...state, count: state.count + 1 };
case "DECREMENT":
return { ...state, count: state.count - action.payload.num };
default:
return { ...state };
}
}
export default reducer;
App.js
import { useDispatch, useSelector } from "react-redux";
function App() {
const dispatch = useDispatch();
const id = useSelector((state) => state.id);
const pw = useSelector((state) => state.password);
const login = () => {
dispatch({ type: "LOGIN", payload: { id: "jang", password: 123 } });
};
return (
<div className="App">
<h1>
{id}{pw} // jang123
</h1>
<button onClick={login}>로그인</button>
</div>
);
}
export default App;
reducer.js
let initialSate = {
id: "",
password: "",
};
function reducer(state = initialSate, action) {
switch (action.type) {
case "LOGIN":
return {
...state,
id: action.payload.id,
password: action.payload.password,
};
default:
return { ...state };
}
}
export default reducer;