๐ŸŒŸ textarea ์ž๋™ ๋†’์ด ์กฐ์ ˆ

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

๐ŸŒŸ Twinkle (React, Firebase)

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

๊ฑฐ์˜ ์˜ค๋Š˜ ํ•˜๋ฃจ ์ข…์ผ ๋‚ ๋ ธ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹Œ๋ฐ ์•„๋ž˜ ์ฝ”๋“œ๊ฐ€ ์ด ์ง€์˜ฅ์—์„œ ๋‚  ๊ตฌ์ถœํ•ด ๋ƒˆ๋‹ค ...๋”ฐํํ‘
์˜ค๋Š˜ ๋‚ด๋‚ด ํ•œ์ˆจ ํ‘นํ‘น ์‰ฌ๋ฉฐ ๊ตฌ๊ธ€๋งํ–ˆ๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ๋‹ต์€ ๊ฐ€๊นŒ์šด ๊ณณ์— ์žˆ์—ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ์˜ค๋Š˜์„ ํ†ตํ•ด ๊นจ๋‹ฌ์€ ๋ฐ”, '์–ธ์  ๊ฐ€ ๋์€ ์˜จ๋‹ค.'


๊ฐ์„คํ•˜๊ณ ,
๋ฆฌ์•กํŠธ์—์„œ textarea ๋†’์ด๋ฅผ ์ž๋™์œผ๋กœ ์กฐ์ ˆํ•ด๋ณด์ž!

๐Ÿ“ react

//์ƒ๋žต 

  const textRef = useRef();
  const autoResizeTextarea = useCallback(() => {
    textRef.current.style.height = "auto";
    textRef.current.style.height = textRef.current.scrollHeight + "px";
  }, []);


return (
  //์ƒ๋žต
  <textarea
    className="tweetSender__writeBox__text__textarea"
    type="text"
    wrap="on"
    placeholder="๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋‚˜์š”?"
    maxLength={150}
    value={tweet}
    onChange={onChange}
    ref={textRef}
    onInput={autoResizeTextarea}
    />
)

๐Ÿ“ scss

.tweetSender__writeBox__text__textarea {
        cursor: text;
        line-height: 24px;
        pointer-events: auto;
        width: 100%;
        display: block;
        resize: none;
        overflow-y: hidden;
        background-color: black;
        color: white;
        min-height: 52px;
        white-space: pre-wrap;
        overflow-wrap: break-word;
        height: auto;
        &::placeholder {
          font-size: inherit;
        }
  1. const textRef = useRef();
    textarea ์—˜๋ฆฌ๋จผํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด useRef() ํ›…์„ ์‚ฌ์šฉํ•˜์ž!
    textarea ์ฐฝ์„ useRef ํ›…์„ ์ด์šฉํ•ด textRef๋กœ ์ง€์ • DOM์„ ์„ค์ •ํ•œ๋‹ค.

    • useRef()
      : current ์†์„ฑ์„ ๊ฐ€์ง€๋Š” ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” Hook์ด๋‹ค.
      • ์ธ์ž๋กœ ๋„˜์–ด์˜จ ์ดˆ๊ธฐ ๊ฐ’์„ current ์†์„ฑ์— ํ• ๋‹นํ•œ๋‹ค.
      • current์˜ ์†์„ฑ์€ ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋„ ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•  ๋•Œ ์ฒ˜๋Ÿผ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋žœ๋”๋ง ๋˜์ง€๋Š” ์•Š๋Š”๋‹ค. ์ฆ‰, ๋ฆฌ๋žœ๋”๋ง ๋˜๋”๋ผ๋„ current์˜ ์†์„ฑ๊ฐ’์€ ์ง€์†๋œ๋‹ค.
      • useRef()๋Š” ๋ณดํ†ต DOM ๋…ธ๋“œ๋‚˜ React ์—˜๋ฆฌ๋จผํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
      • Ref๊ฐ์ฒด์˜ .current ๊ฐ’์€ ์„ ํƒํ•œ DOM์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
        ์—ฌ๊ธฐ์„œ textRef.current๋Š” textarea ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
        ๋”ฐ๋ผ์„œ textRef.current.style.height์€ textarea ์—˜๋ฆฌ๋จผํŠธ์˜ height ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  textRef.current.scrollHeight์€ textarea ์—˜๋ฆฌ๋จผํŠธ์˜ ์ „์ฒด scrollHeight๊ฐ’์„ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  1. onInput={autoResizeTextarea}
    textarea์— input๋  ๋•Œ๋งˆ๋‹ค, ์ฆ‰ ๊ธ€์ด ์ž…๋ ฅ๋  ๋•Œ ๋งˆ๋‹ค autoResizeTextarea ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

  2. useCallback()
    useCallback๋กœ autoResizeTextarea ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ์„œ ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์ž.

    • useCallback(ํ•จ์ˆ˜, [๋ฐฐ์—ด])
      : ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” Hook์ด๋‹ค.
      • useCallback์€ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜์–ด์˜จ ํ•จ์ˆ˜๋ฅผ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ๋„˜์–ด์˜จ ๋ฐฐ์—ด ๋‚ด์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ์ €์žฅํ•ด๋†“๊ณ  ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒํ•œ๋‹ค.
      • useCallback()์„ ์‚ฌ์šฉํ•˜๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง๋˜๋”๋ผ๋„ ๊ทธ ํ•จ์ˆ˜๊ฐ€ ์˜์กดํ•˜๋Š” ๊ฐ’๋“ค์ด ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
        ์ฆ‰, ์—ฌ๊ธฐ์„œ๋Š” autoResizeTextarea ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋žœ๋”๋ง๋˜๋”๋ผ๋„ textarea์˜ ๋†’์ด๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š” ํ•œ ๊ธฐ์กด ํ•จ์ˆ˜๋ฅผ ๊ณ„์†ํ•ด์„œ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • (๐Ÿ“š ์ฐธ๊ณ ) ๋ฆฌ์•กํŠธ๊ฐ€ ๋ฆฌ๋žœ๋”๋ง ํ•˜๋Š” ์กฐ๊ฑด
      • ์ž์‹ ์˜ state ๋ณ€๊ฒฝ๋  ๋•Œ
      • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ ๋ฐ›์€ props๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ
      • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋žœ๋”๋ง๋  ๋•Œ
  3. textRef.current.style.height = "auto";
    textarea์˜ height์„ "auto"๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
    height ๊ฐ’์„ auto๋กœ ์ž…๋ ฅํ•ด ๋†“์œผ๋ฉด textarea์— ์ ์€ ๊ธ€์„ ์ง€์› ์„ ๋•Œ ๋Š˜์–ด๋‚œ textarea์˜ ๋†’์ด๊ฐ€ auto๋กœ ๋ฐ”๋€Œ์–ด ์•Œ๋งž์€ ๋†’์ด๋กœ ์ค„์–ด๋“ ๋‹ค.

  4. textRef.current.style.height = textRef.current.scrollHeight + "px";
    textarea์˜ height์— textarea์˜ scrollHeight ๋†’์ด๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
    textarea์— ์ž…๋ ฅํ•œ ๊ธ€์ด textarea์˜ ๋†’์ด๋ฅผ ์ดˆ๊ณผํ•  ๊ฒฝ์šฐ, textarea์˜ ๋†’์ด๊ฐ€ ์ž๋™์œผ๋กœ scrollHeight ๋†’์ด๋งŒํผ ๋Š˜์–ด๋‚˜๊ฒŒ ๋˜์–ด textarea์˜ ๋†’์ด๊ฐ€ ์ž๋™์œผ๋กœ ์กฐ์ ˆ๋˜๋Š” ๋А๋‚Œ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค.

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

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