<div className="App">
<form>
<select name="lastname">
<option value="lee">lee</option>
<option value="kim">kim</option>
<option value="park">park</option>
</select>
<input name="age"></input>
<input name="birthday"></input>
<button type="submit">등록</button>
</form>
</div>
<select name="lastname">
<option value="lee">lee</option>
<option value="kim">kim</option>
<option value="park">park</option>
</select>
위 html select 코드를 다음과 같이 변경할 수 있다.
<input name="age" />
<input name="birthday" />
위 html input 코드를 다음과 같이 변경할 수 있다.
구현하고 싶었던 것은 다음과 같다.
입력 폼에서 focus가 풀릴 때는 입력을 마친 것으로 판단하여, onBlur 함수를 통해 입력 값을 부모컴포넌트에 최신화 시켜준다.
각 입력을 마칠때 마다 정보가 최신화 되는 것을 확인할 수 있다.
Select 같은 단일 값에 의해 폼의 형태가 바뀌는 예시이다.
이처럼 자식컴포넌트(select, input 등) State를 바로 받아와야 할때가 있다.
이럴 땐 useEffect Hook을 사용하면 된다.
export const Select = ({ options, ...props }) => {
const [selectValue, setSelectValue] = useState(options[0].name);
useEffect(() => {
props.getInputValue({ [props.name]: selectValue });
}, [selectValue]);
selectValue의 state가 변하면 리렌더링 이후 useEffect가 실행되는데, 부모컴포넌트로부터 받은 함수(getInputValue)를 사용하여 자식컴포넌트의 State를 바로 업데이트 해준다.
위 예시처럼 onBlur를 사용하면 다음과 같은 현상이 나타난다.
(마우스가 안보여서 설명하자면 선택하고 다른 곳을 클릭해야 자식컴포넌트로부터 State 값을 받아서 많이 불편하다.)
onBlur 이벤트가 발생할 때마다 부모컴포넌트는 정보를 최신화 시킨다.(State 변경) State가 변경되면서 re-rendering이 발생하게 되고, 가만히 있던 입력 값 태그들은 re-rendering 하게 된다.