개발자
react custom hook이란 로직의 재사용성을 위하여 로직들을 묶어놓는 용도로 사용한다고 배웠는데 종종 custom hook에서 component까지 render하는 함수를 제공하는 케이스들을 본것같아 궁금한것이 있습니다. 질문이 두가지 있습니다. 1. Custom hook에서 component 렌더링해주는 함수까지 제공하는 것이 custom hook의 용도에 알맞은 것일까요? 관련된 component를 제공해주는 것까지 재사용할 로직에 포함된다고 생각하면 되는걸까요? 2. 두번째는 react 렌더링에 관련된 질문입니다. custom hook에서 export default const useComponent = () => { const [value, setValue] = useState(''); const InputComponentByCustomHook = () => { return (<input value={value} onChange={(e)=>setValue(e.target.value)} />); } return [InputComponentByCustomHook ]; } 로 선언해준 후, 이를 app에서 사용하는 경우에 const App = () => { const [RenderedComponentByCustomHook] = useComponent() return (<> <InputComponentByCustomHook /> </>) } 이 경우에는 자꾸 input에 값을 입력할때 한글자 한글자마다 focus가 풀리길래 왜 그런가에 대해서 알아보니 value값이 변경될때마다 InputComponentByCustomHook컴포넌트가 계속 새롭게 만들어져서 focus가 풀린다고 하더라구요. 그런데 아래와 같이 const App = () => { const [RenderedComponentByCustomHook] = useComponent() return (<> { InputComponentByCustomHook() } </>) } 함수를 실행하여 return으로 컴포넌트를 전달해주는 경우에는 input에 값을 입력해도 focus가 풀리지않습니다. value 값이 변경될때마다 InputComponentByCustomHook 함수는 계속해서 재생성되는 것은 알겠는데 앞선 케이스와 달리 이친구는 계속 input 컴포넌트가 유지되는 이유가 무엇일까요? 함수가 재생성되더라도 return에 전달되는 컴포넌트들은 재생성되지 않는 것인가요?
답변 0
첫 답변을 기다리고 있어요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 12월 06일
질문에 대해 답변드립니다. 1. Custom hook에서 component를 렌더링하는 함수까지 제공하는 것은 매우 상황에 따라 달라집니다. 로직이 특정 컴포넌트와 밀접하게 결합되어 있고, 다른 곳에서는 재사용될 가능성이 거의 없을 경우에는 Custom Hook 내부에서 컴포넌트를 래핑하는 것이 유용할 수 있습니다. 하지만 일반적으로 로직과 뷰를 분리하기 위해 Custom Hook은 로직만을 처리하고 컴포넌트는 별도로 관리하는 것이 좋습니다. 2. React에서 함수형 컴포넌트가 호출되면 그 안의 코드블록 전체가 실행됩니다. 따라서 InputComponentByCustomHook가 리렌더링 될 때마다 새로운 함수 객체가 생성되어 이전에 포커스때문에 발생한 문제가 생깁니다. 반면, `{InputComponentByCustomHook()}` 코드 부분에서는 `InputComponentByCustomHook` 함수가 반환하는 JSX(React 엘리먼트) 자체가 렌더링되므로, 이 경우 `InputComponentByCustomHook` 함수는 계속 새롭게 만들어져도 각 반환 값(JSX)은 동일한 인스턴스(reference identity)를 유지하기 때문에 포커스 문제가 발생하지 않습니다. React는 이전 렌더 결과와 비교하여 변경된 부분만을 업데이트します. 반환 값인 JSX의 참조가 유지되므로, React는 해당 부분을 업데이트할 필요가 없다고 판단하고 input 요소를 그대로 유지합니다. 이 첫 번째 케이스에 비해 비효율적일 수 있으므로 일반적으로 이런 방식은 추천하지 않습니다. 마지막으로, Custom Hook을 사용하는 경우 로직을 재사용하면서도 컴포넌트 간의 상태 격리는 보장되기 때문에 같은 로직을 공유하더라도 각 컴포넌트는 독립된 상태를 가집니다. 그렇기 때문에 `useState`나 `useEffect` 등의 Hook을 사용하는 경우 이들은 항상 호출 순서대로 실행되어야 하며, 반복문이나 조건문 내부에서 실행되지 않도록 주의해야 합니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!