useRef를 통해 input을 제어하려고 합니다!
그런데, 이런 input이 5개라면? useRef이 5개 필요하겠죠! 5개 정도는.. 하나하나 선언해줄 수 있겠지만... 비효율적인데다가
심지어는 input이 1000개라면?!? 하나하나 선언해줄 수 없겠죠..!!🤔🤔🤔
효율적으로 구현해봅시다!!
결론적으론 아래와 같이 정리할 수 있습니다.
Ref를 배열로 관리하고,
(item, index) =>
(
<input type="file"
ref={(element) => { Ref배열.current[index] = element; }}
onChange={(e) => Ref이벤트함수(e, index)} />
)
00. 문제..
import * as React from "react";
export default function App() {
/** 파일이 추가될 input의 ref */
const fileInputRef01 = React.useRef();
const fileInputRef02 = React.useRef();
const fileInputRef03 = React.useRef();
const fileInputRef04 = React.useRef();
const fileInputRef05 = React.useRef();
return (
<div>
<input type="file" ref={fileInputRef01} />
<input type="file" ref={fileInputRef02} />
<input type="file" ref={fileInputRef03} />
<input type="file" ref={fileInputRef04} />
<input type="file" ref={fileInputRef05} />
</div>
);
}
아... 아... 이건 아닌 것 같습니다...
01. 해결하기
import * as React from "react";
export default function App() {
/** 파일이 추가될 input의 ref를 배열에 담아서 관리하기 */
const imageInputRef = React.useRef([]);
/** ex. 컴포넌트 리스트 */
const fileComponentList = [1, 2, 3, 4, 5];
/** 각 파일 선택 버튼 눌렀을 때 ref에서 일어나는 일 */
function onAddFileChange(event, index) {
event.preventDefault();
// 파일이 있는 경우
if (event.target.files) {
console.log(event.target.files[0]); // 해당 파일 접근
}
}
return (
<div>
{fileComponentList.map((item, index) => (
<input
type="file"
ref={(element) => {
imageInputRef.current[index] = element;
}}
onChange={(e) => onAddFileChange(e, index)}
/>
))}
</div>
);
}
✨✨✨
'💻 My Work > 🔥 React' 카테고리의 다른 글
[React/JS] Firebase - 비밀번호 찾기, 비밀번호 재설정sendPasswordResetEmail (0) | 2022.11.15 |
---|---|
[React/JS] 요소가 Object인 배열의 중복 제거하기 (0) | 2022.11.08 |
[React/JS] CORS 에러 해결하기(이미지 URL을 API 요청, 이미지 URL로 Blob, Blob로 File 생성) (0) | 2022.11.04 |
[React/JS] Image URL로 파일 객체(File object) 생성하기 (0) | 2022.11.03 |
[React/JS] 서버에 파일 객체(File Object)/이미지 파일 한번에 여러 개 보내기 - FormData (0) | 2022.11.02 |