Effect Hook을 사용하면 함수 컴포넌트에서 side effect를 수행할 수 있습니다.
useEffect (() => {
수행코드
})
useEffect (() => {
수행코드
},[변수])
useEffect (() => {
수행코드
},[변수, 변수])
공통된 로직을 사용한다면 DependencyArray에 요소 같이 적어주기~!
useEffect (() => {
수행코드
},[])
useEffect (() => {
수행코드
return () => {
종료하고자 하는 수행코드
}
},[])
DependencyList(Array)
App.js
<div>
{showWork && <UseEffect2 />}
<button onClick= {() => {setShowWork(!showWork)}}>Click</button>
</div>
UseEffect.js
import React, { useState, useEffect } from "react";
const UseEffect2 = () => {
useEffect (() => {
const intervalWork = setInterval(() => {
console.log('interval work : 작업중')
}, 1000);
// 컴포넌트가 unmounting 될때 실행
return () => {
clearInterval(intervalWork)
}
}, []);
return (
<div>
<span>작업중 - 콘솔확인</span>
</div>
);
}
export default UseEffect2
reference의 약어
특정 컴포넌트에 접근할 수 있는 객체
const ref = useRef(초기값);
출력값 : {current: 초기값}
컴포넌트가 언마운팅될때까지 컴포넌트의 정보를 유지
1) 데이터 저장 공간
2) DOM 요소에 접근
⭐ 리액트에서는 객체 자체를 출력하고자 할때, 에러 발생⭐
<p>RefNumber : {refNumber}</p>
ref객체의 current이용하여 출력
<p>RefNumber : {refNumber.current}</p>
ref객체의 업데이트된 값이 화면에 출력되지 않는 이유
내부적으로는 refNumber.current가 +1 기능 수행이 되고 있음
그러나, 업데이트된 값이 화면에 출력은 되지 않음
그 이유는, ref 수행 결과로 렌더링은 일어나지 않기 때문
렌더링이 일어난다는 것은 프로그램 자체에 부담을 줄 수 있음
따라서 ⭐ ref는 렌더링이 자주 일어나지 않아야하는 경우에 사용가능
일반변수는 리렌더링이 일어나면 초기화(기본값)된다
초기값 유지 -> ref(저장공간)
DOM접근
function UseRef2 () {
const inputRef = useRef()
useEffect (() => {
console.log(inputRef)
}, [])
return (
<div>
<input ref={inputRef} type="text" placeholder="username" />
<button>login</button>
</div>
);
}
메모이제이션 Memoization
동일값을 반환하는 함수를 반복적으로 호출하는 경우 해당 결과를 메모리(캐시)에 저장하여 사용하는 기능
함수형 컴포넌트가 렌더링되면서 내부에 함수를 계속해서 호출하는 경우가 발생할 수 있음
이를 효율적으로 관리하고자할때 useMemo를 사용할 수 있음
const result = useMemo(() => {
연산 코드;
return 결과;
})
const result = useCallback(() => {
연산 코드;
return function();
})
useMemo / useCallback
주의해서 사용해야함 : 메모리를 계속해서 사용하기 때문에 불필요한 값이나 함수가 메모리를 차지하지 않도록 지정해야함
훅의 규칙
function View (props) {
console.log(props.children)
return (
<div>
</div>
);
}
=
function View ({children}) {
console.log(children)
return (
<div>
</div>
);
}
같다~!
조건부 렌더링
조건에 따른 렌더링
제어컴포넌트/ 비제어 컴포넌트
Controll --> 제어 컴포넌트 vs 비제어 컴포넌트
제어 컴포넌트
사용자가 입력한 값에 접근하고 제어할 수 있도록 지정한 컴포넌트
ex) HTML, input, select, textare, ...
HTML 자체에서 state 관리가 됨 (내부에 state를 갖고 있음) --> JS로 접근이 쉽지 않다.
--> 해결법?
</input
: 비제어 컴포넌트를 제어 컴포넌트로 만드는 법
비제어 컴포넌트
⭐
propDrilling 내리꽂기
상위 컴포넌트에서 하위 컴포넌트로 props를 전달해주는 방법
sharedState : state공유하기
상위 컴포넌트에 있는 state를 하위 컴포넌트로 전달하여 데이터를 공유하는 방법
state 끌어올리기
하위 컴포넌트에 있는 state를 상위 컴포넌트로 전달하여 데이터를 공유하는 방법
⭐⭐⭐⭐