Go๋ฏผ๋ณด๋‹ค Go

ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž

Update

ํ•จ์ˆ˜ ์ถ”์ƒํ™” ์—ฐ์Šตํ•˜๊ธฐ - ๊ณ„์‚ฐ๊ณผ ์•ก์…˜

SleepingOff 2023. 12. 8. 15:36

๐Ÿพ๋“ค์–ด๊ฐ€๋ฉฐ

์›ํ‹ฐ๋“œ ํ”„๋ฆฌ์˜จ๋ณด๋”ฉ ๊ฐ•์˜์—์„œ ์ถ”์ƒํ™”๋ฅผ ํ•  ๋•Œ ํ•จ์ˆ˜์˜ ์—ญํ• ์— ๋”ฐ๋ผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ง์ ‘ ์“ด ์ฝ”๋“œ์—์„œ ํ•ด๋‹น ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ์ ์šฉ์„ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

โœจ๋ณธ๊ฒฉ์ ์œผ๋กœ

โœ…ํ•จ์ˆ˜ ๋ถ„๋ฆฌํ•˜๊ธฐ

๊ธฐ์กด ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ์—์„œ ๋ณต์žกํ•œ ๋กœ์ง์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์„œ ๊ฒจ์šฐ ์ฐพ์•„๋ƒˆ์Šต๋‹ˆ๋‹ค.

import React, { useRef, useEffect } from 'react'; import styled from 'styled-components';  const ResizingTextarea = ({ onChange, ...props }) => {   const textareaRef = useRef();    useEffect(() => {     handleResizeHeight();   }, [props.value]);       const handleResizeHeight = () => {     if (textareaRef.current) {       textareaRef.current.style.height = 'auto';       textareaRef.current.style.height = textareaRef.current.scrollHeight + 'px';     }   };    return <StyledTextarea ref={textareaRef} onChange={onChange} {...props} />;  };  export default ResizingTextarea; 

handleResizeHeight ํ•จ์ˆ˜์˜ ์—ญํ• ์€ ๊ณ„์‚ฐ์ด๋ฉฐ, ์™ธ๋ถ€์˜ ์ƒํƒœ์— ์˜์กดํ•˜์—ฌ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ด์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด textareaRef์— ํ•ด๋‹นํ•˜๋Š” ๊ณณ์„ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์„ ์–ธํ•˜์—ฌ ์ธ์ž๋ฅผ ๋ฐ›์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

/** *@param ref textarea์— ๋Œ€ํ•œ ์ฐธ์กฐ **/   const handleResizeHeight = (ref) => {     if (ref.current) {       ref.current.style.height = 'auto';       ref.current.style.height = ref.current.scrollHeight + 'px';     }   }; 

์œ„์™€ ๊ฐ™์ด ๋ฐ”๊พธ์–ด ์ปดํฌ๋„ŒํŠธ์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.๊ธฐ์กด์—๋Š” ResizingTextarea๋ผ๋Š” ๊ณ ์ •๋œ ์Šคํƒ€์ผ์—๋งŒ resizing์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค๋ฉด ์ด์ œ๋Š” ๋‹ค๋ฅธ ์Šคํƒ€์ผ์˜ textarea์—๋„ ์‰ฝ๊ฒŒ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ปค์Šคํ…€ ํ›…์œผ๋กœ ๋นผ๋„ ์ข‹๊ฒ ์ง€๋งŒ, ๊ฐ™์€ ๊ฒฝ๋กœ์— ์กด์žฌํ•˜๋Š” ๊ฒƒ๋„ ๋‚˜์˜์ง€ ์•Š๊ณ , ๋ณ„๋„์˜ React ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ ์ตœ์ƒ์œ„์—๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•จ์ˆ˜๋กœ๋งŒ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๊ธฐ์กด์—๋Š” textarea์— ์ด๋ฒคํŠธ์ฒ˜๋Ÿผ ๋ถ€์—ฌํ•˜์—ฌ handle์ด๋ผ๋Š” ์ปจ๋ฒค์…˜์„ ์‚ฌ์šฉํ•˜์˜€์ง€๋งŒ, ref๋ฅผ ๋„˜๊ฒจ์ฃผ๊ณ , useEffect์•ˆ์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— handle์„ ์ œ์™ธํ•œ resizeHeightForTextarea๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ ค ์ค‘์ž…๋‹ˆ๋‹ค.

โœ”๏ธ๊ฒฐ๋ก 

์ถ”์ƒํ™”๋ฅผ ํ•  ๋•, ํ•ด๋‹น ํ•จ์ˆ˜์˜ ๋ชฉ์ , ํ•จ์ˆ˜์˜ ์—ญํ• ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์—ญํ• ์ด ์„ž์—ฌ์žˆ๊ณ , ์–ด์ฉ” ์ˆ˜ ์—†์ด ์•ก์…˜์˜ ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜ ๋‚ด์—์„œ ๊ณ„์‚ฐ์˜ ์—ญํ• ์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ตœ๋Œ€ํ•œ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค! ์ผ๋ถ€๋ผ๋„ ์žฌ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ง์ž…๋‹ˆ๋‹ค.

โœ…ํ”ผ๋“œ๋ฐฑ ์ถ”๊ฐ€

์ด ๊ธ€์€ ์˜ต์‹œ๋””์–ธ์„ ํ†ตํ•ด ๋ฐœํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

728x90