์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ํ์
- PT
- Git
- ์ผํ
- ์ฝ๋ฉ์บ ํ
- ์ด๋ชฝ์ด์ค
- ๊ฒ์์ถ์ฒ
- ๊นํ๋ธ
- ๋ฐ๋ํ๋กํ
- ๊น
- ๋น์ ๊ณต์
- ํฌ์ค
- ๋ชจ๋ฐ์ผ๊ฒ์
- ํ๋ก๊ทธ๋๋จธ์ค
- ํ ์ต๋ชฉํ
- ํ๊ธฐ
- IT
- ํฌ์ค๊ธฐ๋ก
- FE
- ์ฑ์ฅ๊ธฐ๋ก
- ๊ฐ๋ฐ์
- TiL
- GitHub
- react
- ์ง์ฝ
- ๋ค์ด์ดํธ
- ์ฝ๋ฉํ ์คํธ
- ์ด๋ชฝ์ด์ค๊ณต๋ต
- ์ฝ๋ฉ
- Front-End
- Today
- Total
JOYLOG
[React] ๋ค์ค ์ฒจ๋ถ ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ์ ๊ฑฐ ์ปดํฌ๋ํธ ๋ณธ๋ฌธ
[React] ๋ค์ค ์ฒจ๋ถ ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๋ฐ ์ ๊ฑฐ ์ปดํฌ๋ํธ
์ฃผํ 2022. 9. 24. 09:56์ด๋ฏธ์ง ์ฒจ๋ถ ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ฉด์,
input ํ๊ทธ์ ํ์ผ์ด ์ฒจ๋ถ๋ ๋(onChange)์ event ๋ฅผ ์ฝ์์ ์ฐ์ด๋ณด์๋๋ฐ์.
๋ค์ค์ ๋ก๋?
<input type="file" multiple />
์ฒ๋ผ multiple ์์ฑ๊ฐ์ ๋ฃ์ด์ฃผ๋ฉด, ๋ค์ค ํ์ผ ์
๋ก๋๊ฐ ๊ฐ๋ฅํด์ง๋ค๊ณ ํด์!
์ฝ์์ ์ฐ์ด๋ณด๋ฉด Files ๋ด๋ถ์ ํ์ผ์ Object ํํ๋ก ๋ฐ์์ค๊ณ ์๋ค๋ ๊ฒ์ ํ์ธํ ์ ์์ด์.
๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ ์ด๋ฏธ์ง DOM
์ด ํ์ํ๋ฐ, ์ด๊ฒ์ URL.createObjectUrl()
๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๋ฐํ๋ฐ์ ์ ์์ด์.
์์์ ๋ฐ์์จ ํ์ผ Object ๊ฐ๊ฐ์ URL.createObjectUrl()
์ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ฃผ๋ฉด ์ฃผ์ด์ง ๊ฐ์ฒด๋ฅผ ๊ฐ๋ฆฌํค๋ URL์ DOMString
์ผ๋ก ๋ฐํ๋ฐ์ ์ ์์ด์. ์ด ๋ ๋งค๊ฐ๋ณ์๋ก ๋ฃ์ด์ฃผ๋ Object๋ File, Blob, MediaSource
ํํ์ฌ์ผ ํฉ๋๋ค.
์ฐธ๊ณ : MDN Web Docs : URL.createObjectURL()
์์์ ์ป์ DOMString
์ <img>
src ์์ฑ์ ๋์
ํด์ค๋ค๋ฉด ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค! ๐
์์ฝ
1๏ธโฃ <input> ๋์ <label> ์ ์ฌ์ฉํ์ฌ, ์ด๋ฏธ์ง ์ฒจ๋ถ UI๋ฅผ ๋์์ธํ๋ค. ์ด ๋, <input>์ display : none ์ผ๋ก ์จ๊ธด๋ค.
2๏ธโฃ <input> ์ onChange ์ด๋ฒคํธ๋ฅผ ๋ฑ๋กํ๋ค.
3๏ธโฃ onChange ์ด๋ฒคํธ์ ์ฒจ๋ถ๋ ํ์ผ์ DOMString ์ผ๋ก ๋ฐํํด์ฃผ๋ ํจ์๋ฅผ ๋์ ํ๋ค.
4๏ธโฃ ๋ฐํ๋ฐ์ DOMString์ ๋ฐฐ์ด ํํ์ State ๋ก ๊ด๋ฆฌํ๋ค.
5๏ธโฃ ์ฒจ๋ถ๋ ์ด๋ฏธ์ง DOMString์ ๋ด๊ณ ์๋ ๋ฐฐ์ด State๋ฅผ ์ํํ์ฌ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํด์ค๋ค.
State ์ ์ธ
const [previewImgList, setPreviewImgList] = useState([])
- ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง ๊ฐ์ฒด๋ค์ ๊ด๋ฆฌํ ๋ฐฐ์ด ํํ์ State๋ฅผ ์ ์ธํฉ๋๋ค.
๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง DOMString ์ ์ฅ
const handleCreatePreviewImg = event => {
let previewUrlList = [...previewImgList]
const uploadFilesObject = event.target.files
for (let i = 0; i < uploadFilesObject.length; i++) {
const currentImgUrl = URL.createObjectURL(uploadFilesObject[i])
previewUrlList.push(currentImgUrl)
}
// ์ด๋ฏธ์ง ์ต๋ 5๊ฐ ์ ํ
if (previewUrlList.length > 5) {
previewUrlList = previewUrlList.slice(0, 5)
}
setPreviewImgList(previewUrlList)
// (+ ๊ฐ๋ฐ ์ค์ธ ํ๋ก์ ํธ์ ๋ฐ๋ผ ์๋ฒ์ ์ ์ฅํ๊ธฐ ์ํ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์์.)
}
- onChange ์ด๋ฒคํธ์ ๋ฃ์ด์ค ํจ์์ ๋๋ค.
- ์ฒจ๋ถ ํ์ผ์ด ๋ค์ด์ฌ ๋, ๋ค์ด์จ ํ์ผ๋ค์ DOMString ํํ๋ก ๋ฐํํ์ฌ ์ค๋ค. ๋ฐํ๋ ํ์ผ์ ๊ด๋ฆฌํ๊ณ ์๋ state์ ์ถ๊ฐ์ํต๋๋ค.
- ์ด๋ฏธ์ง๋ ์ต๋ 5๊ฐ ์ฒจ๋ถํ ์ ์๋๋ก, ๋ฐฐ์ด์ ์๋ฅด๋ ๋ฐฉ์์ผ๋ก ์ ํํ์์ต๋๋ค.
๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง ์ญ์
const handleDeleteImage = id => {
const filteredImgList = []
;[...previewImgList].map((img, imgIndex) => {
if (id !== imgIndex) {
filteredImgList.push(img)
} else {
URL.revokeObjectURL(img)
}
})
setPreviewImgList(filteredImgList)
setValue('urls', filteredImgList)
}
- handleDeleteImage๋ ์ญ์ ํ๊ณ ์ ํ๋ ์ด๋ฏธ์ง ์ปดํฌ๋ํธ ์ X ๋ฒํผ์ onClick ํ๋ฉด ์๋ํ๋ ํจ์์ ๋๋ค.
- ๋ฏธ๋ฆฌ๋ณด๊ธฐ DOMString ๊ฐ์ด ์ ์ฅ๋ ๋ฐฐ์ด์ ์ํํ๋ฉฐ, ํ์ฌ ๋๋ฅธ ์ปดํฌ๋ํธ์ id๊ฐ๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง์ id๊ฐ์ด ์ผ์นํ์ง ์์ผ๋ฉด (์ญ์ ํ๊ณ ์ํ๋ ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒฝ์ฐ), ๋ฐฐ์ด์ ํฌํจํฉ๋๋ค.
- ๋ง์ฝ ์ผ์นํ๋ค๋ฉด (์ญ์ ํ๊ณ ์ํ๋ ์ปดํฌ๋ํธ์ธ ๊ฒฝ์ฐ), ๋ฐฐ์ด์ ํฌํจํ์ง ์์ผ๋ฉฐ URL.revokeObjectURL ๋ฅผ ํตํด URL ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค. → MDN์์ ์ต์ ์ ์ฑ๋ฅ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ํด์ ๊ถ์ฅํ๊ณ ์๋ ๋ฐฉ์์ ๋๋ค!
์ฃผ์ ์ฝ๋
...
const UploadPreviewImage: React.FC<TProps> = ({ ... }) => {
...
return (
<StyledWrapper>
<div className="photo-input-preview-box">
<div className="photo-wrap">
<label htmlFor="uploadFile">
<div>์ฌ์ง ์
๋ก๋</div>
</label>
</div>
{previewImgList.map((previewImg, previewImgIdx) => {
return (
<ReviewPreviewPhoto
key={previewImgIdx}
id={previewImgIdx}
imgSrc={previewImg}
handleDeleteImage={handleDeleteImage}
/>
);
})}
</div>
<input
type="file"
multiple
id="uploadFile"
accept="image/*"
style={{ display: 'none' }}
onChange={handleCreatePreviewImg}
/>
</StyledWrapper>
);
};
export default UploadPreviewImage;
- input ๋์ label ํ๊ทธ๋ฅผ ์ฌ์ฉํด input UI๋ฅผ ๋์์ธํฉ๋๋ค.
- previewImgList (= DOMString์ ๋ด๊ณ ์๋ ๋ฐฐ์ด)์ ์ํํ๋ฉฐ ์ด๋ฏธ์ง๋ฅผ ๋๋๋งํฉ๋๋ค.
- ์ด๋ฏธ์ง์ handleDeleteImage ํจ์๋ฅผ props ๋ก ๋๊ฒจ์ค, ์ปดํฌ๋ํธ ์์ X ๋ฒํผ์ ๋๊ณ , X๋ฅผ ๋๋ ์ ๋ ํด๋น ํจ์๊ฐ ์๋ํ๋๋ก ํฉ๋๋ค.