๐คทโ๏ธ React์์ ๋์ผํ ํ์ผ ์ ๋ก๋ ๊ตฌํ
ํ๋ก์ ํธ์ค์ PDF ํ์ผ ์ ๋ก๋ ๊ธฐ๋ฅ ๊ตฌํ ๋น์ ๋์ผํ ํ์ผ์ ์ ๋ก๋ ํ๋ ๊ฒฝ์ฐ inputํ๊ทธ์ onChange ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ์ ์์ ์ผ๋ก ๋์ํ์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
ํ์ผ ์ ๋ก๋ ๊ณผ์
๋ธ๋ผ์ฐ์ ์์ PDF ์ ๋ก๋๋ฅผ ํด๋ฆญํ๋ฉด ํ์ผ ํ์๊ธฐ ์ฐฝ์ด ์ด๋ฆฌ๊ณ ํ์ผ์ ์ ํํ์ ํ์ผ์ ์ ๋ก๋ํ๋ค.
์ฌ๊ธฐ์ ์ค๋ฅ๋ ๋์ผํ ํ์ผ์ ๋๋ฒ ์ด์ ์ ๋ก๋์ onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋ ๋ฌธ์ ์๋ค.
20230920001_00_40.pdf ํ์ผ์ ์ ๋ก๋ํ๊ณ ๋ค์ 20230920001_00_40.pdf ํ์ผ์ ์ ๋ก๋ํ๋ฉด onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
์ ๋ฆฌ: React์์ ๋์ผํ ํ์ผ์ ์ฐ์ํด์ ์ ํํ์ ๋ input ํ๊ทธ์ onChange ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ๋์ํ์ง ์์์ ๋์ผํ ํ์ผ์ ์ฐ์์ ์ผ๋ก ์ ๋ก๋ํ ์๊ฐ ์๋ค.
๐คทโ๏ธ ๋ฌธ์ ํด๊ฒฐ
๋ค์ ์์ ์์ค๋ก ๋์ผํ ํ์ผ์ ์ฐ์ํด์ ์ ํํ์ ๋ onChange ์ด๋ฒคํธ๊ฐ ๋์ํ๊ฑฐ๋ ๋์ํ์ง ์๋ ์๋๋ฆฌ์ค๋ฅผ ์ดํด๋ณด์.
์ค๋ณตํ์ผ์ ์ ๋ก๋ํ๋ฉด onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋ ๋ฌธ์ ์ฝ๋
<Button
component="label"
sx={{ fontSize: '16px' }}
fullWidth={true}
variant="text"
size="small"
startIcon={<SvgPdfUpload />}>
PDF ์
๋ก๋
<VisuallyHiddenInput
type="file"
multiple
onChange={onFileChange}
accept=".pdf,.PDF"
/>
</Button>
์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ์ ์์ ์ผ๋ก ๋์ ์๋๋ฆฌ์ค
- ํ์ผ ์ ๋ก๋ ๋ฒํผ ํด๋ฆญ
- ํ์ผ ํ์๊ธฐ ์ฐฝ์์ test_file.pdf ํ์ผ ์ ํ ํ ์ด๊ธฐ ๋ฒํผ ํด๋ฆญ
- ํ์ผ ํ์๊ธฐ ์ฐฝ์์ test_fileB.pdf ํ์ผ ์ ํ ํ ์ด๊ธฐ ๋ฒํผ ํด๋ฆญ
- ํ์ผ ํ์๊ธฐ ์ฐฝ์์ test_file.pdf ํ์ผ ์ ํ ํ ์ด๊ธฐ ๋ฒํผ ํด๋ฆญ
์ค๋ณต๋์ง ์์ ๊ฒฝ์ฐ์๋ ํ์ผ ์ ๋ก๋๊ฐ ์๋์๋ค.
์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ๋์ํ์ง ์์ ์๋๋ฆฌ์ค
- ํ์ผ ์ ๋ก๋ ๋ฒํผ ํด๋ฆญ
- ํ์ผ ํ์๊ธฐ ์ฐฝ์์ test_file.pdf ํ์ผ ์ ํ ํ ์ด๊ธฐ ๋ฒํผ ํด๋ฆญ
- ํ์ผ ํ์๊ธฐ ์ฐฝ์์ test_file.pdf ํ์ผ ์ ํ ํ ์ด๊ธฐ ๋ฒํผ ํด๋ฆญ
๊ฐ์ ํ์ผ์ ์ ๋ก๋์ onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์๋์ง ์์์ ํ์ผ์ ์ ๋ก๋ํ ์ ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์ ๋ฌธ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ ์์ธ์ ๊ฐ์ ์ค๋ณต ํ์ผ์ uploadํ ๊ฒฝ์ฐ onChange event๊ฐ trigger๋์ง ์๋๋ค.
* onChange๋ ์ค์ง์ ์ธ ๋ด์ฉ ๋ณํ์๋ง trigger๋๊ธฐ ๋๋ฌธ์ด๋ค. e.target.value ์ ๋ก๋ํ file ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ ๋ก๋ํ ๊ฒฝ์ฐ ๊ฐ์ด ๋ฐ๋์ง ์์๋ค๊ณ ์ธ์งํด์ onChange ์ด๋ฒคํธ๊ฐ ๋ฐ์๋์ง ์๋๋ค.
๋ฐ๋ผ์ file์ด uploade๋๋ฉด onChange ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋๋ก ํ๊ธฐ ์ํด์๋ input ํ๊ทธ์ onClick ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ ์ถ๊ฐํ๊ณ event.target.value๋ฅผ ๋น ๊ฐ ('') ๋๋ null๋ก ์ด๊ธฐํํ๋ ์ฝ๋๋ก ํด๊ฒฐํ๋ค.
onChange, onClick๋ก ๋์ด์ค๋ ์ด๋ฒคํธ
e.target.value
์ด๊ธฐ์ ํด์ฃผ์
์ค๋ณตํ์ผ ์ ๋ก๋ ํด๊ฒฐ ์ฝ๋
//ํ์ผ ์
๋ก๋ ์ค๋ณตํ์ผ๋ฐฉ์ง
const onClickPreventDuplication = (e: any) => {
e.target.value = null;
};
<Button
component="label"
sx={{ fontSize: '16px' }}
fullWidth={true}
variant="text"
size="small"
startIcon={<SvgPdfUpload />}>
PDF ์
๋ก๋
<VisuallyHiddenInput
type="file"
multiple
onChange={onFileChange}
onClick={onClickPreventDuplication}
accept=".pdf,.PDF"
/>
</Button>
event.target.value๋ฅผ null๋ก ํ ๋นํ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๋ฅผ input ํ๊ทธ์ onClick์ ์ถ๊ฐํ๊ณ ๋์ผํ ํ์ผ์ ์ฐ์ํด์ ์ ํํ๋ฉด onChange ์ด๋ฒคํธ ํธ๋ค๋ฌ ํจ์๊ฐ ์ ์์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
onChange ๊ฐ์ด ํ์ผ ์ ๋ก๋์์ ์ด๊ธฐํ ๋๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋ ๊ฐ์ผ๋ก ์ธ์ํ์ง ์์์ ๊ฐ์ ํ์ผ์ ํ์ผ ์ ๋ก๋ํด๋ onChange ์ด๋ฒคํธ ๋ฐ์์ด ์๋๋ค.
์ค๋ณต๋ ํ์ผ์ ์ฐ์์ ์ผ๋ก ์ ๋ก๋ํ ์์๋ ์ค๋ฅ๋ฅผ ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๊ณต์ ํฉ๋๋ค.
URL์ธ์ฝ๋ฉ & ๋์ฝ๋ฉ ํด๋ณด๊ธฐ
'React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React ํด๋๊ตฌ์กฐ FSD ๊ธฐ๋ฅ ๋ถํ ์ค๊ณ ์ํคํ ์ฒ (1) | 2024.05.02 |
---|---|
react input ๋ชจ๋ ํ ์คํธ ์ ํํ๋ ๋ฐฉ๋ฒ (0) | 2024.03.21 |
immer๋ฅผ ์ฌ์ฉํด์ ๋ถ๋ณ์ฑ์ ์ง์ผ์ผํ๋ ์ด์ ์ ์์ ๋ณต์ฌ์ ๊ฐ๋ (3) | 2024.01.05 |
React ์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ ๊ตฌํ (35) | 2023.03.09 |
React FAQ(์์ฃผ ๋ฌป๋ ์ง๋ฌธ) ์์ฝ๋์ธ ๊ธฐ๋ฅ (35) | 2023.03.07 |