일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- ESlint
- 투포인터
- 이분 검색
- Promise
- tailwind
- autosize
- 태그된 유니온
- recoil
- SSR
- 인터섹션
- app router
- TS
- dfs
- CI/CD
- async/await
- 리터럴 타입
- React
- Jest
- 반공변성
- 무한 스크롤
- 결정 알고리즘
- Cypress
- 호이스팅
- RTK Query
- useAppDispatch
- webpack
- map
- CORS
- 타입 좁히기
- 공변성
Archives
- Today
- Total
짧은코딩
React input delay 해결법 본문
반응형
상황
{
name: "",
list: [],
}
- 보이는 데이터가 많은 모달에서 input을 받아서 state에 저장하는 기능을 구현하고 있었다.
- 사용자 리스트가 나오고, 체크를 하면 list 배열에 저장되는 방식이었다.
- 사용자 리스트가 많은 경우, name을 input으로 입력받아 업데이트하는 방식에서 input delay가 발생
해결법
1. 컴포넌트 분리
<div>
<label>
<input value={value} onChange={onChange}/>
</label>
//사용자 체크 기능(데이터가 많음)
...
</div>
이렇게 name과 list 배열을 입력하는 것이 같은 컴포넌트에 있으면 컴포넌트가 계속 렌더링 되어 delay가 발생한다.
<div>
<label>
<NameInput setValue={setValue}/>
</label>
//사용자 체크 기능(데이터가 많음)
...
</div>
따라서 이렇게 컴포넌트를 분리하고 setValue를 넘겨줬다.
2. onBlur 사용하기
import { useState } from 'react';
export default function NameInput({ setValue }) {
const [name, setName] = useState("");
const onChangeName = (e) => {
setName(e.target.value);
};
const onBlur = () => {
setValue((prev) => ({
...prev,
name: name,
}));
};
return (
<div>
<input value={name} onChange={onChangeName} onBlur={onBlur} />
</div>
);
}
- onBlur은 input에 대한 focus가 해제되면 발동한다.
- 그렇기에 onChange 이벤트로 name을 업데이트 해주고, "저장"버튼 같은 것이 눌리면 자연스럽게 input focus가 해제되니까 그때 원본 데이터에 name이 최종 업데이트가 된다.
1번과 2번을 모두 활용하여 나는 input delay 문제를 해결했다.
반응형
'개발' 카테고리의 다른 글
Nexus로 Private npm 저장소 구축하기 (0) | 2025.01.24 |
---|---|
순환 참조 (0) | 2025.01.14 |
git 개념 정리 (1) | 2024.05.01 |
Comments