React의 Class형 컴포넌트로 모든 프로그래밍을 하던 시절, 개발자들은 React팀에 다음과 같은 feedback을 던진다.
React Hooks는 함수에서 컴포넌트의 내부 states와 post-rendering side effetcts를 관리할 수 있게 해주었다.
import React, {useState} from 'react';
const [current state, state setter] = useState();
import React, {useState} from "react";
function Toggle() {
const [toggle, setToggle] = useState();
return (
<div>
<p>The toggle is {toggle}</p>
<button onClick={() => setToggle("on")}>On</button>
<button onClick={() => setToggle("off")}>Off</button>
</div>
);
}
setToggle()
은 onClick
이벤트 리스너로 호출된다.toggle
값과 컴포넌트를 새로운 값으로 재렌더링하기 위해서는 setToggle()
함수를 다음 스테이트 값과 함께 argument처럼 호출해주기만 하면 된다.React에 state setter 신호를 호출한다는 것은 컴포넌트의 재렌더링(re-render)과 이에 따라 컴포넌트 정의에 따른 전체 함수가 다시 호출되어야한다는 것을 의미한다.
useState
를 쓰면 React 컴포넌트에서 다른 부분으로 넘어갈 때 현재 스테이트의 값을 계속 추적할 수 있다.
const [isLoading, setIsLoading] = useState(true);
초기값을 설정하지 않으면 undefined가 뜬다. 동작하는데는 문제가 없으나 코드를 명확하게 하기 위해서는 명시해주는 것이 좋다. 만약 첫 렌더링에서 보여줄 값이 없으면 null처리를 해주는 것이 좋다.
const handleChange = (event) => {
const newEmail = event.target.value;
setEmail(newEmail);
}
=> const handleChange = (event) => setEmail(event.target.value);
//Object destructing
=> const handleChange = ({target}) => setEmail(target.value);
import React, { useState } from 'react';
export default function QuizNavBar({ questions }) {
const [questionIndex, setQuestionIndex] = useState(0);
// define event handlers
const goBack = () => setQuestionIndex((prevQuestionIndex) => prevQuestionIndex - 1);
const goToNext = () => setQuestionIndex((prevQuestionIndex) => prevQuestionIndex + 1);
// determine if on the first question or not
const onFirstQuestion = questionIndex === 0;
const onLastQuestion = questionIndex === questions.length - 1;
return (
<nav>
<span>Question #{questionIndex + 1}</span>
<div>
<button onClick={goBack} disabled={onFirstQuestion}>
Go Back
</button>
<button onClick={goToNext} disabled={onLastQuestion}>
Next Question
</button>
</div>
</nav>
);
}