둘 다 비제어 컴포넌트 input 태그에서 value 값이 바껴도 리렌더링 x
useRef
import { useRef, useState } from 'react';
function TodoListWithUseRef() {
const inputRef = useRef(null);
const [todos, setTodos] = useState([]);
const handleAddTodo = (e) => {
e.preventDefault();
const newTodo = inputRef.current.value.trim();
if (newTodo) {
setTodos([...todos, newTodo]); // 새로운 항목 추가
inputRef.current.value = ''; // 입력 필드 초기화
}
};
return (
<div>
<h2>Todo List</h2>
<form onSubmit={handleAddTodo}>
<input type="text" ref={inputRef} placeholder="Enter a task" />
<button type="submit">Add</button>
</form>
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
</div>
);
}
export default TodoListWithUseRef;
inputRef.current: input 태그 전체 inputRef.current.value를 통해 input 태그의 value에 접근FormData
import React, { useState } from 'react';
function TodoListWithFormData() {
const [todos, setTodos] = useState([]);
const handleAddTodo = (e) => {
e.preventDefault();
const formData = new FormData(e.target);
const newTodo = formData.get('todo').trim(); // 'todo' 필드 값 가져오기
if (newTodo) {
setTodos([...todos, newTodo]); // 새로운 항목 추가
e.target.reset(); // 입력 필드 초기화
}
};
return (
<div>
<h2>Todo List</h2>
<form onSubmit={handleAddTodo}>
<input type="text" name="todo" placeholder="Enter a task" />
<button type="submit">Add</button>
</form>
<ul>
{todos.map((todo, index) => (
<li key={index}>{todo}</li>
))}
</ul>
</div>
);
}
export default TodoListWithFormData;
e.target: form 태그formData.get("todo"): form 태그 안에서 name이 todo인 input의 value를 가져옴e.target.reset(): 입력 필드 초기화memo 컴포넌트를 캐싱: 부모 컴포넌트 리렌더링 시 캐싱된 컴포넌트는 리렌더링하지 않고 재사용하는 API(단 props가 변하지 않았을 때)
- 사용법: memo(함수컴포넌트)
useMemo 계산결과값을 캐싱: 계산 비용이 많이 드는 함수의 결과값에 사용할 때 특히 효과적(주로 객체나 배열)
- 기준: 계산 시간이 1ms 이상이면 memoiozation ㄱㄱ (console.time, console.timeEnd 찍어보기)
- 사용법: useMemo( () => {함수}, [] )
useCallback 함수정의를 캐싱: 리렌더링 시 재사용(함수) 의존성 배열에 변화 없으면 함수 재생성 절대 x
- 사용법: useCallback(함수, [])
memoization 꿀팁:
use로 시작하게 지을 것