const initCount = useCallback(()=>{})
: value를 캐싱한다.
무거운 컴포넌트나 데이터 값을 최초에 한번만 값을 가져오는 용도로 많이 사용
But, 하지만 남발해서 썼을 때는 데이터를 저장하기 위해 별도의 메모리 확보를 많이 해야하기 때문에 오히려 성능이 악화될 수 있다.
반드시 필요할 때만 사용할 것...!
import React from "react";
import { useMemo } from "react";
import { useState } from "react";
const HeavyComponent = () => {
const [value, setValue] = useState(0);
const heavyWork = () => {
for (let i = 0; i < 100000; i++) {}
return 100;
};
const sampleValue = useMemo(() => heavyWork(), []);
return (
<div>
<button
onClick={() => {
setValue(value + 1);
}}
></button>
</div>
);
};
export default HeavyComponent;
useInput.jsx
const useInput = () => {
// value를 useState로 관리
const [value, setValue] = useState("");
// handler 로직
const handler = (e) => {
setValue(e.target.value);
};
return [value, handler];
};
export default useInput;
App.jsx
import React from "react";
import { useState } from "react";
import useInput from "./hooks/useInput";
// custom hook만들 때 주의사항
// 1. custom hook의 함수 이름은 use로 시작하는 것이 좋다. (useInput)
// 2. 파일 이름은 원하는대로(useInput)
const App = () => {
const [title, onChangeTitleHandler] = useInput();
const [body, onChangeBodyHandler] = useInput();
return (
<div>
<input value={title} type="text" onChange={onChangeTitleHandler} />
<input value={body} type="text" onChange={onChangeBodyHandler} />
</div>
);
};
export default App;
: 전역상태 라이브러리/ 중앙관리소를 사용하게 도와주는 패키지
1-1. useState의 불편함
configStore.js
import { combineReducers, createStore } from "redux";
// 1. rootReducer을 만든다.
const rootReducer = combineReducers({});
// 2. store을 조합
const store = createStore();
// 3,. 만든 store 내보내기
export default store;
main.jsx
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import App from "./App.jsx";
import "./index.css";
import { Provider } from "react-redux";
createRoot(document.getElementById("root")).render(
<StrictMode>
<Provider store={store}>
<App />
</Provider>
</StrictMode>
);
counter.js
// 초기 상태값
const initialState = {
number: 0,
};
// 리듀서(함수)
const counter = (state = initialState, action) => {
switch (action.type) {
default:
state;
}
};
export default counter;
reducer : 변화를 일으키는 함수
- 액션객체란 반드시 type이란 key를 가져야 하는 객체이다. 또한 리듀서로 보낼 명령이다.
- 디스패치란, 액션객체를 리듀서로 보내는 :전달자 함수이다.
- 리듀서란, 디스패치를 통해 전달받은 액션객체를 검사하고 조건이 일치했을 때 새로운 상태값을 만들어내는 함수이다.
- 디스패치를 사용하기 위해서는 useDispatch()라는 훅을 이용해야 한다.
dispatch함수에는 액션을 파라미터로 전달한다. dispatch(action)- 액션객체 type의 value는 대문자로 작성한다.
: Ducks패턴은 Redux 앱을 구성할 떄 사용하는 방법론 중 하나
분산되어 있던 액션타입, 액션생성자, 리듀서를 하나의 파일로 구성하는 방식
1. Reducer함수를 export default한다.
2. Action creator 함수들을 export
3. Action type 은 app/reducer/ACTION_TYPE 형태로 작성
- Yarn add redux react-redux
- Src 폴더 아래 redux 폴더 만들기
- redux폴더 아래 config, modules 폴더 생성
- Config 폴더 안 configStore.js 생성 modules 안에 모듈 파일 생성
- const rootReducer = combineReducers({})
- Const store = createStore(rootReducer)
- main.jsx에 Provider로 store 작성연결
- Action value, action creator만들어서 export, state init