); }; export default Sample; useState는 비동기적으로 동작한다. useState는 성능 최적화를 위해서 비동기적을 동작한다. 리액트는 성능을 최적화하기 위해 setState를 배치 처리한다. setState 연속으로 호출하면 그 동작들을 한 번에 모아서 한꺼번에 랜더링한다. 배치 (batch) 리액트가 성능 향상을 위해 여러 개의 setState를 하나의 리렌더링으로 묶는 과정 16ms동안 변경된 State들을 하나로 묶는다. 16ms동안 동일한 setState를 아무리 실행해봤자 1번만 실행된다. 동일한 State에 대해서 여러 번 setState를 실행했다면 마지막으로 실행한 setState만 적용된다. 사실 useState의 setter는 콜백을 안 써도 동작한다. 예시 : setCount(count + 1) useState를 동기적으로 처리하려면 인자로 콜백함수를 집어넣거나 useEffect의 의존성 배열을 활용하면 된다. 테스트 코드 import { useState } from "react"; const Sample = () => { const [count, setCount] = useState(0); const fun1 = () => { //1씩 증가한다. setCount(count + 1); setCount(count + 1); setCount(count + 1); }; const fun2 = () => { //3씩 증가한다. setCount((val) => val + 1); setCount((val) => val + 1); setCount((val) => val + 1); }; return ( <>
3씩 증가시켜보자
{count}
> ); }; export default Sample; useInput (useState 활용) useState를 활용하여 유효성 검사를 할 때 많이 사용한다. 초기값 설정하기 단순하게 초기값을 설정한다. import { useState } from "react"; const useInput = (initialValue) => { const [value, setValue] = useState(initialValue); return { value }; } const Sample = () => { const birthYear = useInput(2024); return ( <>
useInput 연습하기
> ); }; export default Sample; 초기값 설정 시의 성능 변경점 useState의 초기값을 함수로 설정해야 하는 경우가 있다. 데이터베이스에서 데이터를 조회하는 경우 처리해야하는 데이터의 양이 많은 경우 초기값을 함수로 주게 되면 렌더링이 될 때마다 useState가 다시 호출되기 때문에 초기값을 반환하는 함수도 늘 새로 실행된다. 이를 막기 위해서는 초기값을 반환하는 함수를 콜백으로 설정하면 된다. 좋은 예시 const [value, setValue] = useState(() => 함수명([파라미터])); 나쁜 예시 const [value, setValue] = useState(함수명([파라미터])); 값 변경하기 값을 변경하는 기능을 추가한다. import { useState } from "react"; const useInput = (initialValue) => { const [value, setValue] = useState(initialValue); const handleInputValue = (event) => { setValue(event.target.value); } return { value, handleInputValue}; } const Sample = () => { const birthYear = useInput(2024); return ( <>
useInput 연습하기
> ); }; export default Sample; 유효성 검사 기능 추가하기 유효성 검사를 통과했을 때만 값을 변경할 수 있는 기능을 추가한다. import { useState } from "react"; //숫자인지 확인 const isNumber = (value) => { return !isNaN(value) }; const useInput = (initialValue, validator) => { const [value, setValue] = useState(() => initialValue); const handleInputValue = (event) => { const newValue = event.target.value; let isValid = false; //유효성 검증 통과 여부 if (typeof validator === 'function') { isValid = validator(newValue); } if(isValid){ setValue(newValue); } else { //후속 조치 console.log("유효성 검사 통과 안 됨"); } } return { value, handleInputValue}; } const Sample = () => { const birthYear = useInput(2024, isNumber); return ( <>
import{useState}from"react";//숫자인지 확인constisNumber=(value)=>{return!isNaN(value)};constuseInput=(initialValue,validator)=>{const[value,setValue]=useState(()=>initialValue);consthandleInputValue=(event)=>{constnewValue=event.target.value;letisValid=false;//유효성 검증 통과 여부if (typeofvalidator==='function'){isValid=validator(newValue);}if(isValid){setValue(newValue);}else{//후속 조치console.log("유효성 검사 통과 안 됨");}}return{value,handleInputValue};}constSample=()=>{constbirthYear=useInput(2024,isNumber);return (<><h1>useInput 연습하기</h1><inputplaceholder="몇 년도에 태어나셨나요?"value={birthYear.value}onChange={birthYear.handleInputValue}/></>);};exportdefaultSample;