const getReducer = () => {
console.log('getReducer called')
return reducer
}
const reducer = (state, action) => {
switch (action.type) {
case 'ADD':
return state+1;
default:
return state
}
}
function App() {
const [state, dispatch] = useReducer(getReducer(), 0)
console.log(state)
useEffect(() => {
dispatch({
type: 'ADD'
})
setTimeout(
() => {
dispatch({
type: 'ADD'
})
}, 1000
)
}, []);
return <div></div>
}
현재 겪고 있는 문제에서 핵심만 추출해서 구현해봤음.
본인이 생각하기엔 useReducer(getReducer(), 0) 초기화 과정에 의하여 getReducer()이 최초로 한번만 호출돼서 reducer을 반환하고 호출될 일 없어야 할 것 같은데, 렌더링 될 때마다 실행되는데 왜 이럼?
[출력값]
App.js:16 getReducer called
App.js:29 0
App.js:16 getReducer called
App.js:29 1
App.js:16 getReducer called
App.js:29 2
그런 동작을 원하면 getReducer()의 결과 자체를 useMemo 처리해야함
별다른 처리가 없으면 렌더링에 있는 코드는 렌더링이 될때마다 실행됨
그냥 자바스크립ㅌ 코드니까 .. 함수 호출은 그냥 함수 호출임 ㅋㅋ
아 그렇네 듣고보니 왜 useReducer은 한 번만 실행돼야한다고 생각했던거지
새벽 4시엔 멍한법이지