React Hook는 React 컴포넌트 사이에서 공통된 로직을 재사용 하기 위해 만듬 함수입니다. 함수를 컴포넌트로부터 분리하여 재사용성과 코드 가독성을 개선해줍니다.
useState는 state를 함수 컴포넌트 안에서 사용할 수 있게 해줍니다.
import React, { useState } from 'react';
const [count, setCount] = useState(0);
useState를 통해 "state 변수"를 선언할 수 있습니다. 위에 선언한 변수는 count라고 부르지만 banana처럼 아무 이름으로 지어도 됩니다. useState는 클래스 컴포넌트의 this.state가 제공하는 기능과 똑같습니다. 일반적으로 일반 변수는 함수가 끝날 때 사라지지만, state 변수는 React에 의해 사라지지 않습니다.
useState의 인자로는 state의 초기 값을 넘겨 줄 수 있습니다. 또한 useState가 반환하는 것은 state변수말고도 해당 변수를 갱신할 수 있는 함수또한 반환시킵니다.
useEffect이용하여 우리는 React에게 컴포넌트가 렌더링 이후에 어떤 일을 수행해야하는 지를 말합니다. useEffect를 컴포넌트 내부에 둠으로써 state 변수(또는 그 어떤 prop에도)에 접근할 수 있게 됩니다.
function Example() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `You clicked ${count} times`;
});
}
웹에 따라 clean-up을 이용하여 메모리 누수가 발생하지 않도록 하는것 또한 중요합니다. React는 컴포넌트가 마운트 해제되는 때에 clean-up을 실행합니다.
import React, { useState, useEffect } from 'react';
function FriendStatus(props) {
const [isOnline, setIsOnline] = useState(null);
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
// effect 이후에 어떻게 정리(clean-up)할 것인지 표시합니다.
return function cleanup() {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
});
if (isOnline === null) {
return 'Loading...';
}
return isOnline ? 'Online' : 'Offline';
}
useEffect의 선택적 인수인 두 번째 인수로 배열을 넘겨 Effect를 건너뛰어 성능 최적화할 수 있습니다.
useEffect(() => {
function handleStatusChange(status) {
setIsOnline(status.isOnline);
}
ChatAPI.subscribeToFriendStatus(props.friend.id, handleStatusChange);
return () => {
ChatAPI.unsubscribeFromFriendStatus(props.friend.id, handleStatusChange);
};
}, [props.friend.id]); // props.friend.id가 바뀔 때만 재구독합니다.
자신만의 Hook을 만들면 컴포넌트 로직을 함수로 뽑아내어 재사용할 수 있습니다.
import React, { useState } from "react";
const useForm = (initialValue) => {
const [value, setValue] = useState(initialValue);
const handleChange = (event) => {
const {target:{value, name}
} = event;
setValue((pre) => ({...pre, [name]: value})
};
const resetForm = () => {
setValue(initialValue);
}
return {value, handleChange, resetForm}
}
export default useForm;
import React from "react";
import useForm from "../hooks/useForm";
const Login = () => {
const { value, handleChange, resetForm } = useForm({ id: "", password: "" });
const handleSubmit = (event) => {
event.preventDefault();
console.log(value);
resetForm()
};
return (
<form onSubmit={handleSubmit}>
<input type="text" name="id" value={value.id} onChange={handleChange} />
<input
type="password"
name="password"
value={value.name}
onChange={handleChange}
/>
<input type="submit" value={"submit"} />
</form>
);
};
export default Login;
위와 같이 Custom Hook을 이용하여 로직을 추상화하고 컴포넌트로부터 분리하여 재사용성과 코드 가독성을 개선할 수 있습니다.
React를 더욱 효율적으로 사용할 수 있는 Hook에 대해서 배웠습니다. 특히 Custom Hook 생성 이유와 장점에 대해 배워 앞으로 Custom Hook을 구축할 때 더욱 신경쓰면서 만들어야 겠다는 생각을 했습니다. 지금까지는 단지 기능만 작동되면 된다는 방식으로 제작하였지만 코드의 가독성까지 생각하면서 만들어야 후의 협업과 수정 과정에서 훨씬 효율적일거라 생각했습니다.
#프로젝트캠프 #프로젝트캠프후기 #유데미 #스나이퍼팩토리 #웅진씽크빅 #인사이드아웃 #IT개발캠프 #개발자부트캠프 #리액트 #react #부트캠프 #리액트캠프