이 글은 드림코딩 강의 내용과 리엑트공식문서를 기반하여 정리한 글입니다.
- React.Component
- React.PureComponent
- function
- memo(function)
- React Hook
일반적으로 컴포넌트에 상태가 존재하고 그 상태에 따라 컴포넌트가 주기적으로 업데이트 되어야 한다면 클래스 컴포넌트를 사용하고,
컴포넌트에 상태가 없고 항상 정적으로 데이터가 표기가 된다면 함수 컴포넌트를 사용하자.
컴포넌트에 상태가 존재하고 그 상태에 따라 컴포넌트가 주기적으로 업데이트 되어야 한다면 클래스 컴포넌트를 사용하자.
가장 일반적으로 state와 render함수를 이용하는 클래스로 만드는 컴포넌트이다.
상태가 존재하고 상태에 변화가 생기면 render함수가 실행된다.
import React from 'react';
class LikeButton extends Component {
state = {
numberOfLikes: 0,
};
render() {
return <button>
{this.state.numberOfLikes}
<button>;
}
}
리액트는 state나 관련된 props가 변경이 되면 render함수가 호출이 된다.
pure.Component는 컴포넌트의 상태나 props에 변화가 없다면 render함수가 호출되지 않게 해준다.
단, state와 props를 얕게(shallow) 검사하기 때문에 주의가 필요하다. state의 참조값이 변하지 않으면 render가 되지 않기 때문에 setState()
를 사용할 때 새로운 참조값의 객체를 생성하여 넘겨주도록 하여 사용하자.
onClickIncrement = habit => {
const habits = [...this.state.habits];
const index = habits.indexOf(habit);
habits[index].count++; // 기존 객체 활용
this.setState({ habits }); // 기존 객체를 업데이트
};
handleIncrement = habit => {
const habits = this.state.habits.map(item => {
if (item.id === habit.id) {
return { ...habit, count: habit.count + 1 }; // 새로운 객체 생성
}
return item;
});
this.setState({ habits }); // 새로운 객체를 업데이트
};
컴포넌트에 상태가 없고 항상 정적으로 데이터가 표기가 된다면 함수 컴포넌트를 이용하자.
클래스는 멤버변수가 딱 한번 생성되는 반면에 function 컴포넌트는 매번 실행되기 때문에 계속 반복해서 생성된다.
function App() {
return <h1>Hello</h1>
}
memo는 클래스 컴포넌트에서 pure.Component와 비슷한 역할을 한다.
컴포넌트의 상태나 props에 변화가 없다면 render함수가 호출되지 않게 해준다.
const HabitAddForm = memo(props => {
//props가 변경되지 않으면 호출되지 않는다.
const formRef = React.createRef();
const inputRef = React.createRef();
const onSubmit = event => {
event.preventDefault();
const name = inputRef.current.value;
name && props.onAdd(name);
formRef.current.reset();
};
return (
<form ref={formRef} className="add-form" onSubmit={onSubmit}>
<input
ref={inputRef}
type="text"
className="add-input"
placeholder="Habit"
/>
<button className="add-button">Add</button>
</form>
);
});
리액트 훅은 기존의 함수형 컴포넌트에서 state와 라이프사이클 메서드를 잘 이용할 수 있도록 도와준다.
useState()
: 클래스 컴포넌트에서 state와 setState()const [count, setCount] = useState(0); // count의 초기값 0
useRef
: 클래스 컴포넌트에서 React.createRef()const spanRef = useRef();
<span ref={spanRef}></span>
useCallback
: 콜백함수를 기억하기 위해 사용, 콜백함수가 매번 실행되어 렌더링이 되는 사이드 이펙트를 막기 위해 사용한다.const handleIncrement = useCallback(()=>{
...
});
<button onClick={handleIncrement}></button>
useEffect(callBack, state)
: 컴포넌트가 마운트 되었을 때 혹은 업데이트가 될 때 마다 호출되는데 특정 state가 변경되었을 때만 호출 되도록 하고싶으면 두번째 인자로 전달해준다.
React를 잘 알지는 못 하지만 큰 틀에서 컴포넌트의 종류를 알게 되어 좋았습니다.