ref 객체를 반환ref 객체에는 current 속성이 있고 거기에 저장됨ref 값은 컴포넌트 전생애 주기 동안 유지state는 변하면 재렌더링된다.
그럼 컴포넌트 내부 변수들 초기화됨 (컴포넌트는 함수이기 때문)
ref 값은 변해도 재렌더링 안함 (ref 값이 유지)
state가 변해서 재렌더링 돼도 ref의 값은 유지됨
자주 변경되는 값을 state에 넣는다면 재렌더링이 많이 발생
그럴때, ref를 사용하자
즉, 변화는 감지해며 재렌더링을 발생시키지 않고 싶을 때

const refId = useRef(null);
...
<input
ref={refId}
type="text"
id="user_id"
name="user_id"
placeholder="아이디를 입력하시오"
required
aria-invalid
aria-describedby="error_id"
onInput={(e) => {
let value = e.target.value;
const userId = document.querySelector('#error_id');
const pwRegex = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{6,16}$/;
const isValidPassword = value => pwRegex.test(value);
if (!value || !isValidPassword(value)) userId.classList.add('is_invalid')
else userId.classList.remove('is_invalid')
}}
/>

React에서는 기본적으로 몇 가지 hook을 제공한다.
그 외에 사용자가 필요한 hook은 커스텀해서 사용 할 수 있다.
로직을 재사용하고 싶어
↓
함수로 만들자
↓
hook을 쓰고 싶은데 일반 함수에서는 못 쓰네...
↓
그럼 custom hook 만들어야지
export default function useInput(initialValue) {
...
return [val, handleInputValue, handleAlert]
}
export default function useInput(initialValue) {
...
return {
val,
handleInputValue,
handleAlert
}
}
import useInput from "./hooks/useInput";
export default function Test() {
const [val, handleInputValue, handleAlert] = useInput('');
return (
<>
<input type="text" onChange={handleInputValue} value={val} />
<button type="button" onClick={handleAlert}>확인</button>
</>
);
}
import { useState } from "react";
export default function useInput(initialValue) {
const [val, setVal] = useState(initialValue);
const handleInputValue = (e) => {
console.log(e.target.value)
setVal(e.target.value)
}
const handleAlert = () => {
alert(val)
}
return [val, handleInputValue, handleAlert]
}
