๐ŸŒŸ useRef() ์‚ฌ์šฉํ•ด input file ์ด๋ฒคํŠธ ํด๋ฆญํ•œ DOM์—์„œ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ

summereuna๐Ÿฅยท2022๋…„ 9์›” 23์ผ

๐ŸŒŸ Twinkle (React, Firebase)

๋ชฉ๋ก ๋ณด๊ธฐ
37/42

ํ˜„์žฌ ๋„ค๋น„๊ฒŒ์ด์…˜๊ณผ ํ™ˆ์—์„œ <Tweet /> ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ํŠธ์œ—์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

const fileInput = useRef();

<input
  name="file"
  type="file"
  accept="image/*"
  onChange={onFileChange}
  ref={fileInput}
  id="files"
  className="hidden"
  />
<lable className="icon" htmlFor="files">
  <FontAwesomeIcon icon={faImage} size="2x" />
</lable>
  • useRef() ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ DOM์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‘์—ˆ๋‹ค.
  • input ์—˜๋ฆฌ๋จผํŠธ์— ref prop์œผ๋กœ fileInput ๋ณ€์ˆ˜๋ฅผ ์ค˜์„œ input ์—˜๋ฆฌ๋จผํŠธ์— ์ ‘๊ทผํ•˜์—ฌ DOM API๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด๋‘์—ˆ๋‹ค. (์—…๋กœ๋“œํ•œ ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์œ„ํ•ด ํ•ด๋’€๋‹ค.)
  • ๊ทธ๋ฆฌ๊ณ  ๊ธฐ๋ณธ file ์—…๋กœ๋“œ ๋ชจ์–‘์„ ์—†์• ๊ณ  ์ด๋ชจํ‹ฐ์ฝ˜์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด input์—๋Š” hidden ํด๋ž˜์Šค๋ฅผ ์ฃผ๊ณ  label ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค์–ด ๊ทธ ์•ˆ์— ์ด๋ชจํ‹ฐ์ฝ˜์„ ๋„ฃ์–ด์„œ ํŒŒ์ผ ์—…๋กœ๋”๋ฅผ ํด๋ฆญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ–ˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ํ™ˆ์—์„œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•˜๋ฉด ํ™”๋ฉด์— ๋œจ์ง€ ์•Š์•„ ์ด์ƒํ•˜๊ฒŒ ์—ฌ๊ธฐ๋˜ ์ค‘ ๋„ค๋น„๊ฒŒ์ด์…˜์—์„œ ํŠธ์œ— ์ž‘์„ฑ ํ•˜๋Š” ๋ชจ๋‹ฌ์„ ์—ฌ๋‹ˆ ๊ฑฐ๊ธฐ์— ์—…๋กœ๋“œํ•œ ์ด๋ฏธ์ง€๊ฐ€ ๋–  ์žˆ์—ˆ๋‹ค.
์–ด๋ผ...์ด๊ฑฐ ๋ญ”๊ฐ€ ์ด์ƒํ•˜๋‹ค. ์™œ ๋‹ค๋ฅธ DOM์— ํŒŒ์ผ์ด ์—ฐ๊ฒฐ๋˜์–ด ๋ฒ„๋ฆฌ๋Š”๊ฑธ๊นŒ?

const fileInput = useRef();

//ํŒŒ์ผ ์—…๋กœ๋“œ์‹œ ๊ฐ DOM ์˜์—ญ์— ์ด๋ฏธ์ง€ ๋„์šฐ๊ธฐ
const clickFileUploader = () => {
  fileInput.current.click();
};

<input
  name="file"
  type="file"
  accept="image/*"
  onChange={onFileChange}
  ref={fileInput}
  id="files"
  className="hidden"
  />
<div className="icon" htmlFor="files" onClick={clickFileUploader}>
  <FontAwesomeIcon icon={faImage} size="2x" />
</div>
  • fileInput ๊ฐ์ฒด์˜ current ์†์„ฑ ์ค‘ click() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ˜„์žฌ ํด๋ฆญ๋œ fileInput ๊ฐ์ฒด๋ฅผ ์ฒดํฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • label ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋‹ˆ label ํƒœ๊ทธ ํด๋ฆญ์‹œ fileInput ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š” ๋งŒํผ ํŒŒ์ผ ์—…๋กœ๋” ์ฐฝ์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ๋œฌ๋‹ค. div ํƒœ๊ทธ๋กœ ๋ฐ”๊ฟ”์ฃผ๊ณ  onClick ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ํด๋ฆญํ•œ ํŒŒ์ผ ์—…๋กœ๋”๋งŒ ๋œฐ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ! ๋“œ๋””์–ด...๐Ÿ”ฅ

๐Ÿ“š ์ฐธ๊ณ 

profile
Always have hope๐Ÿ€ & constant passion๐Ÿ”ฅ

0๊ฐœ์˜ ๋Œ“๊ธ€