리액트는 선언형 코드이다.
바닐라 자바스크립트에서 했던 것 처럼 수동으로 이벤트 리스너(예:"addEventListner"를 통해)를 추가하면 안된다. 이는 명령형 코드이기에 해당 코드로는 React 기능을 사용하지 않으며 React 컴포넌트 외부에 있는 일부 함수를 트리거하므로 React 컴포넌트 상태와 상호 작용할 수 없다.
실행될 함수의 “포인터”를 onClick 등의 값으로 전달해야 한다. 그러면 이벤트가 발생했을 때 “사용자를 대신하여” React가 함수를 실행한다.
JavaScript에서 함수는 단순한 객체(일반 값)이므로 프로퍼티를 통해 값을 컴포넌트에 전달할 수 있다. 그리고 컴포넌트가 해당 함수를 호출하면 함수가 실행된다. 이런 식으로 부모 컴포넌트에 정의된 함수를 자식 컴포넌트 내부에서 트리거할 수 있다.
React는 일부 변숫값의 변경 여부에 별 관심이 없다. 컴포넌트 함수를 재평가하지도 않는다. 등록된 상태 값(useState를 통해 생성)이 변경되었을 때만 재평가가 이루어진다.
useState는 정확히 두 요소로 이루어진 배열을 반환한다. 두 번째 요소는 언제나 상태에 새 값을 설정하기 위해 호출하는 함수이다. 해당 함수, 세터 함수인 setState()를 호출하면 React가 컴포넌트를 재평가하도록 트리거한다.
컴포넌트 하나가 가질 수 있는 state 개수는 원하는 만큼!이다.
보통 각각의 상태를 관리할 수 있도록 slice 해서 state를 여러개 만들거나, 객체로 하나로 묶어 상태를 관리한다.
const [counter, setCounter] = useState(1);
...
setCounter(counter + 1);
const [counter, setCounter] = useState(1);
...
setCounter((prevState) => prevState + 1 );