목록프론트엔드/React (24)
빵 입니다.
📌 useState() 훅 상태를 관리하는 훅 함수 컴포넌트에서 상태를 추가하고 관리할 수 있다. useState()는 현재 상태값과 해당 값을 갱신할 수 있는 함수를 반환한다. const [enteredDate, setEnteredDate] = useState(''); setEnteredDate를 통해 상태를 갱신하면, 우리 눈엔 즉각 적용되는 것처럼 보이지만, 실제론 상태 업데이트 스케줄링만 한 상태이다. 📌 useState() 스케줄링 React는 useState를 통해 상태를 업데이트할 때, 해당 상태 변경을 비동기로 처리하고 일괄적으로 업데이트한다. 일반적으로 useState를 호출하여 상태를 업데이트하면, React는 업데이트된 상태를 즉시 반영하지 않고, 대기열에 해당 상태 변경을 넣는다. ..
❓컴포넌트 함수가 재실행되면 useState()도 계속 재실행되는 거 아닌가? ❓그럼 매번 상태를 초기화하고 다시 렌더링 하는 건가? ❗️NO!!! React는 처음 useState가 호출될 때 해당 상태 변수를 생성하고 기본값을 사용하여 초기화를 딱 한 번 한다. (해당 변수와 연결된 값이 메모리에 저장된다.) 이때의 초기화는 컴포넌트가 처음 렌더링 될 때만 발생하며, 그 이후로는 해당 상태 변수가 이미 생성되었다면 초기화를 하지 않는다. 이후 렌더링에서는 이전에 생성된 상태 변수를 재사용하고, 값이 변경되어도 새로운 변수를 생성하는 것이 아니라 이전 변수를 업데이트하게 된다. 상태 초기화는 컴포넌트가 DOM에서 완전히 삭제되지 않는 한 (unmount 되지 않는 한) 계속 유지된다. 컴포넌트가 유지되..
🔥함수형 컴포넌트 기반으로 정리를 했습니다! React.memo()는 함수형 컴포넌트를 메모이제이션하여 컴포넌트의 props가 변경되지 않으면 리렌더링을 하지 않도록 만들 수 있었다. ❓그렇다면 컴포넌트만큼 많이 생성되는 게 함수인데, 함수를 메모이제이션하는 방법은 없을까? ❗️있다! useCallback() 훅을 사용하여 함수를 메모이제이션 할 수 있다. 컴포넌트가 실행되는 동안 함수를 메모이제이션하고, 해당 함수를 불필요하게 재생성하지 않도록 도와준다. 함수가 불필요하게 재생성되지 않기 때문에 불필요한 렌더링을 방지하고 메모리 사용을 최적화할 수 있다. 더보기 🔥메모이제이션 컴퓨터 프로그램이 동일한 계산을 반복해야 할 때, 이전에 계산한 값을 메모리에 저장함으로써 동일한 계산의 반복 수행을 제거하여 ..
🔥함수형 컴포넌트 기반으로 정리를 했습니다! ❓불필요한 렌더링 발생 부모 컴포넌트의 상태나 프롭스가 변경되면 해당 부모 컴포넌트에 속한 자식 컴포넌트도 재평가 된다. > 자식 컴포넌트에게 내려주는 props의 값이 변경되지 않아도, 부모 컴포넌트의 상태가 변경되었기 때문에 자식 컴포넌트도 리렌더링 된다. >> 불필요한 리렌더링은 컴포넌트 계층 구조가 복잡하고 데이터가 자주 변경될 때 발생할 수 있다. 불필요한 재평가를 방지해야 한다! ❗️React.memo()를 사용하면 된다! 컴포넌트 export 할 때, React.memo()를 사용해서 컴포넌트를 감싸서 내보낸다. 함수형 컴포넌트를 메모이제이션하여 이전에 전달된 props가 변경되지 않으면, 이전 결과를 재사용하기 때문이다. 더보기 🔥메모이제이션 컴..
🔥함수형 컴포넌트 기반으로 정리를 했습니다! 하위 컴포넌트 안에 있는 요소에 직접 접근하고 싶은데 컴포넌트에 ref 속성을 추가해 조작하려 하면 null 값을 참조하려 한다는 오류가 뜬다. => 함수 컴포넌트는 인스턴스가 없기 때문에 함수 컴포넌트에서 ref 어트리뷰트를 사용할 수 없다. 그럼 ref를 통해 함수 컴포넌트를 직접 제어하려면 어떻게 해야하지? ❗️forwardRef()를 사용하면 된다. forwardRef()는 부모 컴포넌트에서 전달받은 ref를 자식 컴포넌트로 전달하는 역할을 한다. (부모 컴포넌트의 ref와 실제 사용할 자식 컴포넌트의 ref 연결) 자식 컴포넌트는 전달받은 ref를 HTML 요소의 속성으로 넘겨줌으로써 함수 컴포넌트 역시 ref를 통한 제어가 가능해진다. 🌀ref Re..
📌 리액트 함수 리액트 컴포넌트를 생성하기 위해 사용되는 함수 이 함수는 JSX(JavaScript XML)를 반환하여 리액트 애플리케이션의 UI를 정의하고 렌더링하는 역할 리액트 함수는 주로 두 가지 형태 => 함수 컴포넌트, 클래스 컴포넌트 📌 리액트 컴포넌트 리액트 컴포넌트는 JSX를 반환한다. JSX는 React.createElement 호출로 변환되며, 이것이 리액트 컴포넌트의 템플릿이다. 함수 컴포넌트나 클래스 컴포넌트 내에서 JSX를 반환하면 해당 함수나 클래스는 리액트 컴포넌트로 간주된다. 📌 리액트 훅의 규칙 리액트 훅은 최상위 수준에서 호출되어야 한다. 함수 컴포넌트나 클래스 컴포넌트의 최상위 수준에서만 호출되어야 한다. 중첩 함수(useEffect 등), 블록 스코프(조건문, 루프 등..
리액트는 props를 관리하는데, props는 컴포넌트에 전달하는 데이터로 컴포넌트 구성을 하게 해주고 부모-자식 컴포넌트 간의 통신을 연결해 주는 역할을 해준다. 문제는 여러 개의 컴포넌트를 거쳐 데이터를 전달할 때 일어난다. state를 여러 컴포넌트를 통해 props로 전달하는 경우 App ➡️ Header ➡️ Navigation App에서 Login 정보를 Header에 props로 내려준다. Header에서 직접 사용하지 않고, Header 안에 있는 Navigation에 Login 정보를 props로 내려준다. Navigation에서 직접 사용한다. => Header는 그냥 데이터를 전달만 할 뿐 이렇게 단순하게 props를 내려줄 수 있다. 그러나 DOM 트리가 복잡할 경우 LoginFor..
페이스북에서 개발한 자바스크립트 라이브러리로, 사용자 인터페이스를 구축하기 위한 선언적이고 효율적인 방법을 제공한다. 리액트는 컴포넌트 기반 아키텍처를 기반으로 하며, UI를 독립적인 작은 조각으로 분할하여 관리한다. 이러한 컴포넌트는 재사용 가능하며 각각의 독립성을 가지며 상태(State) 및 속성(Properties)을 통해 데이터를 관리한다. 컴포넌트(Component) 리액트 애플리케이션은 작은 조각으로 나누어진 컴포넌트로 이루어진다. 컴포넌트는 UI의 일부를 나타내며 독립적으로 작동하도록 설계되어 재사용성을 높인다. 가상 돔(Virtual DOM) 리액트는 가상 돔을 사용하여 실제 돔과 상호작용한다. 가상 돔은 메모리에 존재하는 가벼운 복사본으로서, 변경 사항을 더 효율적으로 감지하고 실제 돔에..
📌 useState() state 관리 도구 단순 상태 업데이트, 복합적이지 않은 상태, 연결되지 않는 상태 간단한 컴포넌트나 단일 상태 변수를 다루기에 적합하다. 개별적인 상태를 다루기에 적합하고, 각 상태 변수는 독립적으로 동작한다. 단순한 상태 업데이트와 컴포넌트 간 연결이 적은 경우에 유용하다. 📌 useReducer() state 가공 최신 state 스냅샷, 복잡한 로직 주로 복잡한 상태 로직이나 여러 상태 간의 관계가 있는 경우에 유용하다. 복잡한 상태 업데이트 로직을 포함하거나 여러 상태를 동시에 업데이트할 때 적합하다. 연관된 상태 조각들로 구성된 상태 관련 데이터를 다루는 경우 사용한다. ex) 폼 인풋 state state 하나를 변경하는 여러 액션이 있는 경우(데이터 상태에 따라 분..
🔥함수형 컴포넌트 기반으로 정리를 했습니다! 상태 관리를 수행하기 위해 사용되는 Hook useState와 비슷하지만 좀 더 복잡한 상태 로직을 다룰 때 유용하다. 주로 여러 상태 값이 서로 연관되어 있는 경우나, 상태 전이 로직이 복잡한 경우에 활용된다. // 기본형 const [state, dispatch] = useReducer(reducer, initialState); reducer 함수는 현재 상태와 액션(상태를 업데이트하는 데 사용되는 정보를 가진 객체)을 받아서 새로운 상태를 반환한다. dispatch 함수에 상태 변경을 위한 액션을 전달하면 자동으로 reducer에 액션을 전달하고 실행한다. // 사용 예제 => 카운터 함수 import React, { useReducer } from 'r..