๋ฆฌ์กํธ๋ก ํผ์ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ ๋์ค ์ฌ๋ฌ ํ ์คํธ๋ ์ด๋ฏธ์ง๋ฅผ ๋ฑ๋กํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค๊ธฐ ์ํด ํผ์ ๋ง๋ค์ด์ผ ํ์ต๋๋ค.
๊ทธ์ค ์ด๋ฏธ์ง๋ฅผ ๋ฑ๋กํ๋ ๋ถ๋ถ์์ ๊ณ ๋ฏผ์ด ์๊ฒผ์ด์. ์๋๋ JSX์ ์ผ๋ถ๋ฅผ ๊ฐ์ ธ์จ ๊ฒ์ธ๋ฐ, ์ด๋ฅผ ๋ก์ปฌ์์ ์คํํด๋ณด๋,
<div className="right_section">
<p>์ด๋ฏธ์ง๋ ํ๋๋ง ๋ฑ๋ก ๊ฐ๋ฅํด์.</p>
<input type="file" name="image" id="input_file" accept="image/*"/>
<p>๋ฑ๋ก๋ ์ด๋ฏธ์ง๋ ์๋์ผ๋ก ๋ํ์ฌ์ง์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค. :)</p>
</div>
์์ ๊ฐ์ด ํ์ผ ์ ํ ๋ฒํผ์ด ๋งค์ฐ ์์์๊ฒ(...) ์ถ๋ ฅ์ด ๋์ต๋๋ค. ๋ฌธ์ ๋ ์ด๋ฅผ ๋ฐ๊ฟ ๋ฐฉ๋ฒ์ด ๋ฑํ ์๋ค๋ ๊ฒ์ด์์ฃ . ์ ๋ก๋ ๋ฒํผ ์คํ์ผ๋ ๋ฐ๊พธ๊ณ ์ด์์ด๋ฉด "์ ํ๋ ํ์ผ ์์"์ด๋ผ๋ ํ ์คํธ๋ ์์ ๋ฒ๋ฆฌ๊ณ ์ถ์์ด์. ๐
๋ฌธ์ ํด๊ฒฐ: <label>์ ์ฌ์ฉํ์!โจ
ํผ์์ input ํ๊ทธ์ ๋น ์ง์์ด ์ฌ์ฉํ๋ <label>์ ์ฌ์ฉํด๋ณด๊ธฐ๋ก ํ์ต๋๋ค. <label> ํ๊ทธ๋ฅผ ๊พธ๋ฏธ๊ณ <input> ํ๊ทธ๋ฅผ ์จ๊ธฐ๋๊ฑฐ์ฃ !
<div className="right_section">
<p>์ด๋ฏธ์ง๋ ํ๋๋ง ๋ฑ๋ก ๊ฐ๋ฅํด์.</p>
<label htmlFor="input_file">
<div className="image_file">
ํ์ผ ์
๋ก๋
</div>
</label>
<input type="file" name="image" id="input_file" accept="image/*" />
<p>๋ฑ๋ก๋ ์ด๋ฏธ์ง๋ ์๋์ผ๋ก ๋ํ์ฌ์ง์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค. :)</p>
</div>
์ง ! css๋ฅผ ์ฌ์ฉํด ์คํ์ผ์ <label>์ ์ ์ฉํด์ฃผ๊ณ ๋๋ ์ด๋ ๊ฒ ์์ ์ ๋ก๋ ๋ฐ์ค๊ฐ ์์ฑ๋์์ด์. ์ด์ ์ ๋ฐ์ค ์ ์ญ์ ํด๋ฆญํ๋ฉด ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ ์ ์์ต๋๋ค. ์ฌ์ฉ์๊ฐ ํด๋ฆญํ๊ธฐ๋ ์ฌ์์ง๊ณ ๋ฏธ๊ด๋ ์ข์์ก์ด์.
์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ตฌํํ๊ธฐ
๊ทธ๋ฌ๋ ํ์ผ์ ์ ๋ก๋ํด๋ ์ ๋ก๋๊ฐ ์๋๋์ง, ์ด๋ค ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋๋์ง ์ ํ ์ ์๊ฐ ์์ด์. ์ด๋ฐ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ ๋ถํธํจ์ ๋๋๊ฒ ๋ถ๋ช ํ์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋๋ฉด ์ ๋ฐ์ค ๋ด์ ์ ๋ก๋๋ ์ด๋ฏธ์ง๋ฅผ ์ฑ์ฐ๋ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
์ ๊ฐ์ ๊ฒฝ์ฐ๋ ์์ ์์ฑํ๋ <label> ์์ ์ด๋ฏธ์ง๋ฅผ ๋ด์ ์์ญ์ ์ถ๊ฐํด๋๊ณ , ์ด๋ฅผ display: none์ผ๋ก ์จ๊ฒจ๋ก๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋๋ฉด useRef()๋ฅผ ์ฌ์ฉํด์ ์ด๋ฏธ์ง๋ฅผ src ์์ฑ์ ๋ฃ๊ณ , ํด๋น ์์ญ์ด ๋ณด์ด๋๋ก ์คํ์ผ๋งํ์ต๋๋ค.
<div className="right_section">
<p>์ด๋ฏธ์ง๋ ํ๋๋ง ๋ฑ๋ก ๊ฐ๋ฅํด์.</p>
<label htmlFor="input_file">
<div ref={image_input} className="image_file"> <!-- ref ์ถ๊ฐ -->
ํ์ผ ์
๋ก๋
</div>
<!-- ์๋ก ์ถ๊ฐ๋ ์์ญ -->
<div ref={image_preview} className="image_file preview"> <!-- ref ์ถ๊ฐ -->
<img src=""></img>
</div>
</label>
<!-- onChange ์ถ๊ฐ -->
<input type="file" name="image" id="input_file" accept="image/*" onChange={handleChange}/>
<p>๋ฑ๋ก๋ ์ด๋ฏธ์ง๋ ์๋์ผ๋ก ๋ํ์ฌ์ง์ผ๋ก ๋ฑ๋ก๋ฉ๋๋ค. :)</p>
</div>
.image_file.preview {
display: none;
}
์์ ๊ฐ์ด ์์ญ์ ์ถ๊ฐํ ํ, ์ผ๋จ์ display: none์ผ๋ก ๊ฐ๋ ค๋์ต๋๋ค. ์ฌ๊ธฐ์ JSX์ ์ถ๊ฐ๋ ์ฝ๋๋ค์ด ๋ ์์ด์. ๋ฐ๋ก ref์ input์ onChange์ธ๋ฐ์, ์ด์ ๋ํ ์ฝ๋๋ ์๋์ ๊ฐ์ด ์์ฑํ์ต๋๋ค.
const image_preview = useRef();
const image_input = useRef();
function handleChange(e) {
const { name, value } = e.target;
if (name === 'image') {
const imgURL = URL.createObjectURL(e.target.files[0]);
image_input.current.setAttribute('style', 'display: none;');
image_preview.current.setAttribute('style', 'display: flex');
image_preview.current.children[0].setAttribute('src', imgURL);
}
}
๋จผ์ image_preview๋ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋๋ฉด ์ด๋ฅผ ์ถ๊ฐํ๊ณ ๋ณด์ฌ์ค ์์ญ์ด๊ณ , image_input์ ์ด๋ฏธ์ง๊ฐ ์ ๋ก๋๋๋ฉด ๊ฐ์ถฐ์ค ์์ญ์ด์์. ๊ทธ๋ฆฌ๊ณ handleChange ํจ์๋ ํด๋น ํ๊ฒ์ด ๋ณํ๋ฉด ๊ทธ์ name๊ณผ value๋ฅผ ๋ฐ์ ๋ชจ๋ ๋์์ ์ํํ ํจ์์ ๋๋ค. ์ ๋ hadleChange ํจ์์์ setState๋ ํจ๊ป ์งํํ์ง๋ง ์ง๊ธ ํฌ์คํ ์์๋ ์ด๋ฏธ์ง ๋ฏธ๋ฆฌ๋ณด๊ธฐ ๊ด๋ จ ์ฝ๋๋ง ์ง์ค์ ์ผ๋ก ๋ค๋ฃจ๊ธฐ ์ํด ์ ์ธํ์ด์.
const imgURL = URL.createObjectURL(e.target.files[0]);
e.target.files[0]์ ์ฐ๋ฆฌ๊ฐ <input>์์ ๋ณด๋ด์จ ์ด๋ฏธ์ง Blob ๊ฐ์ฒด์ ๋๋ค. ์ด Blob ๊ฐ์ฒด๋ฅผ url๋ก ๋ฐ๊พธ์ด src ์์ฑ์ผ๋ก ์ ์ฉํ๊ธฐ ์ํด URL.createObjectURL() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ต๋๋ค. (์ฃผ์: ์ด url์ window ์ฐฝ์ ๋ซ๋ ์ฆ์ ์ฌ๋ผ์ง๋๋ค.)
image_input.current.setAttribute('style', 'display: none;');
image_preview.current.setAttribute('style', 'display: flex');
image_preview.current.children[0].setAttribute('src', imgURL);
url๋ก ๋ฐ๊ฟจ๋ค๋ฉด ์ด์ ์ ์ฉ๋ง ํ๋ฉด ๋ฉ๋๋ค. ์์ useRef()๋ก ์ง์ ํด๋๋ image_input๊ณผ image_preview๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋จผ์ ์ด๋ฏธ์ง ์ ๋ ฅ์ ์ ๋ํ๋ ์์ญ์ display: none์ผ๋ก ์จ๊ฒจ์ฃผ๊ณ ,
์ด๋ฏธ์ง๋ฅผ ๋ฃ์ ์์ญ์ display: flex๋ก ๋ณด์ฌ์ค๊ฒ์.
๋ง์ง๋ง์ผ๋ก image_preview์ ์์ ํ๊ทธ์ธ <img>๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ .children์ ์ด์ฉํฉ๋๋ค. img๋ ์ฒซ๋ฒ์งธ ์์์ด๋ .children[0]์ ์ฌ์ฉํด์คฌ์ด์. ๋ง์ง๋ง์ผ๋ก ๋ณํํ url์ src ์์ฑ์ ์ ์ฉํฉ๋๋ค.
div.preview {
overflow: hidden
}
div.preview img {
height: 100%;
}
๋์ผ๋ก ์์ ๊ฐ์ด ์ถ๊ฐ๋ ์ด๋ฏธ์ง๊ฐ ๋ฐ์ค๋ฅผ ๊ฝ ์ฑ์ธ ์ ์๋๋ก ์คํ์ผ ์ง์ ๊น์ง ํด์ฃผ๋ฉด ์์ฑ์ ๋๋ค!
๊ฒฐ๊ณผ
์์๊ฒ ์ด๋ฏธ์ง๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ก ๋ฑ๋ก๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. :)
๋ ์ข์ ๋ฐฉ๋ฒ์ด ์์ ๊ฒ ๊ฐ์ง๋ง ์ผ๋จ ๊ธฐ๋ฅ์ด ๋์ํ๊ฒ ๋ง๋ค์๋ค๋๊ฒ ๋ฟ๋ฏํ๋ค์. ๐ฅฐ