일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 |
30 | 31 |
- 리액트 공식 문서
- REACT
- Next 팀 프로젝트
- 자바스크립트
- 파이썬 for in
- React Hooks
- 내일배움캠프 최종 프로젝트
- 파이썬 enumerate
- useEffect
- 내일배움캠프 프로젝트
- 리액트 프로젝트
- 내일배움캠프
- 파이썬 for
- 코딩테스트
- 한글 공부 사이트
- 파이썬 딕셔너리
- 프로그래머스
- typeScript
- 파이썬 replace
- 내배캠 프로젝트
- 파이썬 slice
- 파이썬 반복문
- JavaScript
- 리액트 훅
- 타입스크립트 리액트
- 리액트 공식문서
- 타입스크립트
- 리액트
- tanstack query
- useState
- Today
- Total
sohyeon kim
[React/TS] 이미지 첨부 & 미리보기 : useRef, FileReader, createObjectURL 본문
💡 리액트에서 파일 첨부하기
우선 미리보기를 위한 로직 🫠
const handleClickImg = (id: string | undefined) => { // img & input 을 감싸고 있는 div 클릭 시
const fileInput = document.getElementById(`fileInput${id}`); // fileInput${id} id를 가진 DOM 요소를
fileInput?.click(); // 클릭한다.
};
const handleChangeImg = (id: string | undefined, files: FileList | null) => {
const file = files?.[0];
if (file) {
const imgUrl = URL.createObjectURL(file); // 그리고 받은 파일을 URL 바꾸고
setQuestions((prev) =>
prev.map((question) => {
return question.id === id ? { ...question, imgUrl } : question; // useState 에 넣어준다.
})
);
}
};
<div onClick={() => handleClickImg(id)}>
<Image
src={imgUrl} // 초기값이었다가 위에서 바꿔둔 URL 을 받아온다.
alt="문항 이미지"
/>
<input
type="file"
id={`fileInput${id}`} // 원랜 ref 로 작성..
onChange={(e) => {
e.preventDefault();
handleChangeImg(id, e.target.files);
}}
className="hidden" <!-- 숨겨둔 파일 추가 input -->
/>
</div>
map 을 돌려서 이미지 input 이 여러개인 상황에서
팀원분이 작성하신 코드를 보고 똑같이 useRef 로 input 을 가져오다가,,
자꾸 이미지 첨부가 마지막 input 으로만 들어가는 오류가 발생했다.
튜터님이랑 콘솔 찍으면서 살펴보니
map을 돌렸지만 ref 부분을 똑같은 이름으로 지정해주고 있었고..
같은 ref 가 세 개가 있어서 가장 마지막 input 을 가져오던 것이었다.
❗️ 그으래서 그럼 map 안에서 useRef 를 지정해두면 ref 도 map 을 돌겠지 했는데
ref 는 콜백함수 내에 넣을 수가 없었다..
🥹 결국 getElementById 로 가져오기로!
ref 를 지우고, map 을 돌면서 가져온 고유한 id 를 input 마다 넣어줬다.
그러니 순서에 맞게 이미지 첨부가 잘 됐다!
ref 를 쓰는 이유가 중복될 수 있는 id 를 방지하려는 것이니
uuid 로 주고 있는 id 를 넘겨줬으니까 getElementById 를 써도 괜찮을 것 같다..!
하지만 가끔 첨부가 잘 안되는 오류가 있다.. 이건 HTML 태그 순서 문제 같은데 내일 고쳐보겠읍니다......
🔗 https://amyhyemi.tistory.com/244?category=873656
[TIL] 2109016 오늘 공부는 getElementById/useRef
리액트에서 getElementsByClassName 로 html 태그들을 가져오려고 했다. 리액트에서 DOM에 직접 접근하기 위해 자바스크립트 코드를 쓰지말고 리액트에서 제공하는 useRef를 쓰는게 좋다는 코드 리뷰를 받
amyhyemi.tistory.com
[React] 파일 업로드 기능 구현
React를 통해 파일 업로드 기능을 구현하기 위해 우리는 미리 알아야할 지식이 있다. 첫 번째는 이미지와 비디오, 오디오 파일과 같은 파일이 어떻게 이루어져 있는 지를 알아야한다. 두 번째는 in
hojung-testbench.tistory.com
🔗 https://guiyomi.tistory.com/119
Javascript - 업로드한 이미지 미리보기 구현
자바스크립트에서는 input type="file" 태그를 이용하여 이미지를 포함한 다양한 확장자의 파일을 업로드할 수 있다. 만약 이미지만 업로드하게끔 제한하고 싶다면 accept="image/*" 프로퍼티를 추가하
guiyomi.tistory.com
🔗 https://guiyomi.tistory.com/148 나중에 활용하기 👀
React.js - 드래그 앤 드롭 파일 업로드 만들기
드래그 앤 드롭으로 파일을 업로드하는 기능을 만들어 보자. 이미지프레소 같은 이미지/동영상 용량 줄이는 사이트를 사용하다 보면 클릭 혹은 드래그 앤 드롭으로 파일을 업로드하는 영역을
guiyomi.tistory.com
'React' 카테고리의 다른 글
[React] TanStack Query : Optimistic Updates 옵티미스틱 업데이트 (0) | 2024.08.06 |
---|---|
[React/TS] input max-length 최대 입력 글자수 제한 & input 안에 입력값 길이 표시 (0) | 2024.04.13 |
[React] input radio : id, for, name, value ?! (1) | 2024.04.03 |
[React] mutate, mutateAsync 차이 (0) | 2024.03.26 |
[React] fullcalendar CSS 커스터마이징 (0) | 2024.03.20 |