hook은 react 버전 16.8부터 새로 추가 되었다.
Hook을 이용하여 기존 Class 바탕의 코드를 작성할 필요 없이 상태 값과 여러 React의 기능을 사용할 수 있다.
리액트의 함수 컴포넌트는 아래와 같이 구현 할 수 있다.
const Example = (props) => {
// 여기서 Hook을 사용할 수 있습니다!
return <div />;
}
function Example(props) {
// 여기서 Hook을 사용할 수 있습니다!
return <div />;
}
state
import React, { useState } from 'react';
function Example() {
// 새로운 state 변수를 선언하고, 이것을 count라 부르겠습니다.
const [count, setCount] = useState(0);
useState를 통해 state변수를 선언할 수 있다. 보통 형식 const안에 "변수 이름", set"변수이름"으로 선언한다.
useState()Hook의 인자로 넘겨주는 값은 state의 초기 값이다
useState는 state 변수, 해당 변수를 갱신할 수 있는 함수 이 두 가지 쌍을 반환합니다. 이것이 바로 const [count, setCount] = useState()라고 쓰는 이유이다.
useState()안에 지금은 0 이라고 선언되어있지만 이 초기값은 boolean true가 될 수도 있고 " "가 될 수도 있다.
변수 값을 갱신하려면 set"변수이름"을 호출하면 된다.
Effect
import React, { useState, useEffect } from 'react';
function Example() {
const [count, setCount] = useState(0);
// componentDidMount, componentDidUpdate와 같은 방식으로
useEffect(() => {
// 브라우저 API를 이용하여 문서 타이틀을 업데이트합니다.
document.title = `You clicked ${count} times`;
});
return (
<div>
<p>You clicked {count} times</p>
<button onClick={() => setCount(count + 1)}>
Click me
</button>
</div>
);
}
단순하게 useState안에서 예를 들어 setNum(num+1) 이런식으로 간단하게 작동되는 기능이면 좋겠지만 그렇지 않은 경우도 많다.
데이터 가져오기, 구독(subscription) 설정하기, 수동으로 React 컴포넌트의 DOM을 수정하는 것까지 이 모든 것이 side effects이다.
useEffect Hook을 이용하여 우리는 React에게 컴포넌트가 렌더링 이후에 어떤 일을 수행해야할 지를 말한다.
useEffect를 컴포넌트 안에서 불러내는 이유는 무엇일까요?
useEffect를 컴포넌트 내부에 둠으로써 effect를 통해 count state 변수(또는 그 어떤 prop에도)에 접근할 수 있게 됩니다. 함수 범위 안에 존재하기 때문에 특별한 API 없이도 값을 얻을 수 있는 것입니다. Hook은 자바스크립트의 클로저를 이용하여 React에 한정된 API를 고안하는 것보다 자바스크립트가 이미 가지고 있는 방법을 이용하여 문제를 해결합니다.
useEffect는 렌더링 이후에 매번 수행된다.
useEffect(() => {
// 데이터 조회하기
// 자동로그인 판별
// 컴포넌트가 화면에 가장 처음 렌더링됐을 때에만 실행하고 싶을 때
},[]);
useEffect(() => {
if(email && password) {
setFlag(true);
return;
}
setFlag(false);
// 특정 값이 업데이트될 때마다 실행하고 싶을 때
},[email, password]); // 옆의 배열을 useEffect의 dependency array라고 부름
useEffect(() => {
return () => {
// 컴포넌트가 사라지기 직전에 특정 코드를 실행하고 싶을 때
};
},[]);
참고https://ko.reactjs.org/docs/hooks-effect.html#tip-optimizing-performance-by-skipping-effects
'에어비앤비 클론코딩' 카테고리의 다른 글
에어비앤비 클론 코딩 - useNavigate와 useLocation (0) | 2022.09.30 |
---|---|
에어비앤비 클론코딩 - 5주차 (0) | 2022.09.29 |
에어비앤비 클론 코딩 - input css 조정 (1) | 2022.09.23 |
에어비앤비 클론코딩 - modal problem (1) | 2022.09.21 |
에어비앤비 클론코딩 - bootstrap과 modal (0) | 2022.09.20 |