2024.02.28(수)
useMemo
Hook리렌더링 사이의 계산 결과를 캐시할 수 있는 React Hook
useMemo(calculateValue, dependencies)
calculateValue
: 캐시하려는 값을 계산하는 함수dependencies
: calculateValue
코드 내에서 참조되는 모든 반응형 값들의 목록useCallback
Hook리렌더링 사이에 함수 정의를 캐시할 수 있게 해주는 React Hook
const cachedFn = useCallback(fn, dependencies)
fn
: 캐시하려는 함수 값dependencies
: fn
코드 내에서 참조된 모든 반응형 값의 배열useNavigate
Hooklocation을 변경할 수 있는
navigate
함수를 반환하는 React Router DOM Hook
const navigate = useNavigate();
navigate(to[, options])
to
navigate(-1)
: 이전 페이지로 가기options
: 여러 option들이 존재state
optionnavigate("/new-route", { state: { key: "value" } });
useLocation
React Router DOM Hook이 반환하는 location
객체의 state
property에서 data 확인 가능location.state
: <Link state>
나 navigate
에 의해 생성된 location의 상태 값useForm
Hookform을 쉽게 관리할 수 있는 custom Hook
const { register, handleSubmit, formState } = useForm();
register
: (name: string, RegisterOptions?) => ({ onChange, onBlur, name, ref })React Hook Form에 input element를 등록하고 validation rule을 적용하기 위한 메서드
name
: component를 Hook에 등록하기 위한 unique keyRegisterOptions
: validation rule(required, min, max 등)을 적용할 수 있음
handleSubmit
: ((data: Object, e?: Event) => Promise, (errors: Object, e?: Event) => void) => Promiseform validation이 성공하면 form data를 받음
formState
: Object
전체 form state에 대한 정보를 가지고 있는 객체
setValue
: (name: string, value: unknown, config?: Object) => void등록된 field에 값을 지정
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
new daum.Postcode({
oncomplete: function(data) {
// 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분입니다.
// 예제를 참고하여 다양한 활용법을 확인해 보세요.
}
}).open();
</script>
useEffect
에서 cleanup function을 return해서 우편번호 tab이 닫히면 script element도 삭제<script>
tag에 async 속성을 명시해 비동기로 실행window.daum.Postcode
를 모르기 때문에 d.ts
파일(타입스크립트 코드의 타입 추론을 돕는 파일)에 type 명시<script>
tag: async
& defer
attribute일반적으로 브라우저는 HTML 파일을 읽어온 후, 위에서부터 아래로 한 줄씩 해석
중간에 script 파일을 마주하는 경우에는, 해당 파일을 모두 해석하기 전까지 나머지 HTML의 render를 일시적으로 멈춤
그래서 일반적으로 DOM 요소가 다 로드된 후에 script가 실행되도록 <body>
tag가 끝나기 직전에 <script>
tag를 삽입
<html>
<head>
<!-- ... -->
</head>
<body>
<!-- ... -->
<script src="jquery.js"></script>
<script src="lodash.js"></script>
</body>
</html>
하지만 이 방법 역시 script가 완전히 해석되기 전에 사용자가 웹과 상호작용을 시도하게 된다면, 제대로 동작하지 않기 때문에 완벽한 해결책이 아님
이를 해결하려면 브라우저가 DOM render 과정을 막지 않게 병렬로 script 파일 로드해야함 ⇒ async
& defer
attribute 사용!
속성 | script는 모두 비동기로 가져오고 실행 시점이 다름 |
---|---|
async | 병렬로 script 가져오기 & 사용 가능해지는 즉시 실행 |
defer | 병렬로 script 가져오기 & DOM이 모두 로드된 후 지연 실행 |
async
attribute
브라우저가 HTML parsing을 하는 동안에도 병렬로 script 파일을 가져오고 사용 가능해지는 즉시 실행됨
<script src="./script.js" async></script>
DOMContentLoaded
에서 확인 가능하지만, 그렇지 않다면 확인 불가능false
, 명시하면 true
defer
attribute
브라우저가 HTML parsing을 하는 동안에도 병렬로 script 파일을 가져오고 모든 DOM이 로드된 후에 실행됨
<script src="./script.js" defer></script>
DOMContentLoaded
이벤트가 보장되고 스크립트 간의 순서도 보장됨false
, 명시하면 true
<td>
tag: colspan
attribute해당 데이터 셀(data cell)이 확장될 열(column)의 개수 (default 1)
<td colspan="숫자">