티스토리 뷰
728x90
SMALL
useState
const [name, setName] = useState("");
useEffect
리액트 컴포넌트가 렌더링될 때마다 특정 작업을 수행하도록 설정할 수 있는 Hook이다.
componentdidmount
useEffect(() => {
console.log("componentdidmount");
}, []);
특정 값 업데이트
useEffect(() => {
console.log(name);
}, [name]);
뒷정리하기
(언마운트되기 전이나 업데이트 직전에 작업 수행)
useEffect(() => {
console.log("effect");
console.log(name);
return () => {
console.log("cleanup");
console.log(name);
};
});
useReducer
useState보다 더 다양한 컴포넌트 상황에 따라 다양한 상태를 다른 값으로 업데이트해 주고 싶을 때 사용하는 Hook
counter
import React, { useReducer } from "react";
function reducer(state, action) {
// action.type 에 따라 다른 작업 수행
switch (action.type) {
case "INCREMENT":
return { value: state.value + 1 };
case "DECREMENT":
return { value: state.value - 1 };
default:
// 아무것도 해당되지 않을 때 기존 상태 반환
return state;
}
}
const Counter = () => {
const [state, dispatch] = useReducer(reducer, { value: 0 });
return (
<div>
<p>
현재 카운터 값은 <b>{state.value}</b>입니다.
</p>
<button onClick={() => dispatch({ type: "INCREMENT" })}>+1</button>
<button onClick={() => dispatch({ type: "DECREMENT" })}>-1</button>
</div>
);
};
export default Counter;
info 오~~~
import React, { useReducer } from "react";
function reducer(state, action) {
return {
...state,
[action.name]: action.value,
};
}
const Info = () => {
const [state, dispatch] = useReducer(reducer, { name: "", nickname: "" });
const { name, nickname } = state;
const onChange = (e) => {
dispatch(e.target);
};
return (
<div>
<div>
<input name="name" value={name} onChange={onChange} />
<input name="nickname" value={nickname} onChange={onChange} />
</div>
<div>
<div>
<b>이름:</b>
{name}
</div>
<div>
<b>닉네임:</b>
{nickname}
</div>
</div>
</div>
);
};
export default Info;
useMemo
함수형 컴포넌트 내부에서 발생하는 연산을 최적화
average
뒤에 [list]가 바뀔때만 실행
import React, { useState, useMemo } from "react";
const getAverage = (numbers) => {
console.log("평균값 계산 중..");
if (numbers.length === 0) return 0;
const sum = numbers.reduce((a, b) => a + b);
return sum / numbers.length;
};
const Average = () => {
const [list, setList] = useState([]);
const [number, setNumber] = useState("");
const onChange = (e) => {
setNumber(e.target.value);
};
const onInsert = (e) => {
const nextList = list.concat(parseInt(number));
setList(nextList);
setNumber("");
};
const avg = useMemo(() => getAverage(list), [list]);
return (
<div>
<input value={number} onChange={onChange} />
<button onClick={onInsert}>등록</button>
<ul>
{list.map((value, index) => (
<li key={index}>{value}</li>
))}
</ul>
<div>
<b>평균값:</b>
{avg}
{/* {getAverage(list)} */}
</div>
</div>
);
};
export default Average;
useCallBack
useMemo와 비슷. 이 Hook을 사용하면 만들어 놨던 함수를 재사용 가능
컴포넌트가 리렌더링될 때마다 새로 만들어진 함수를 사용하게 된다. 대부분의 경우 문제x, 컴포넌트의 렌더링이 자주 발생하거나 렌더링해야 할 컴포넌트의 개수가 많아지면 이 부분 최적화 필요
const onChange = useCallback(e => {
setNumber(e.target.value);
}, []); // 컴포넌트가 처음 렌더링 될 때만 함수 생성
const onInsert = useCallback(() => {
const nextList = list.concat(parseInt(number));
setList(nextList);
setNumber('');
inputEl.current.focus();
}, [number, list]); // number 혹은 list 가 바뀌었을 때만 함수 생성
useRef
ref를 쉽게 사용할 수 있게 해줌
등록 버튼을 눌렀을 때 포커스가 인풋 쪽으로 넘어가도록
const inputEl = useRef(null);
const onInsert = useCallback(
(e) => {
const nextList = list.concat(parseInt(number));
setList(nextList);
setNumber("");
inputEl.current.focus();
},
[number, list]
);
<input value={number} onChange={onChange} ref={inputEl} />
컴포넌트 로컬 변수를 사용해야 할 때(ref 안의 값이 바뀌어도 렌더링x)
import React, { useRef } from "react";
const RefSample = () => {
const id = useRef(1);
const setId = (n) => {
id.current = n;
};
const printId = () => {
console.log(id.current);
};
return <div>refsample</div>;
};
export default RefSample;
728x90
LIST
'책 > 리다기' 카테고리의 다른 글
리다기 정리6(뉴스뷰어 만들기) (0) | 2021.01.22 |
---|---|
리다기 정리5(immer, SPA) (0) | 2021.01.22 |
리다기 정리4(아이콘, 최적화) (0) | 2021.01.21 |
리다기 정리3(css) (0) | 2021.01.20 |
리다기 정리1 (0) | 2021.01.18 |
댓글
공지사항