๋์์ธํ์์ ์์ฒญ์ด ๋ค์ด์๋ค.
textarea์ ๋ค์ด๊ฐ๋ line์ ๋ฐ๋ผ border-radius๊ฐ ๋ฌ๋ผ์ก์ผ๋ฉด ์ข๊ฒ ๋ค๋ ์์ฒญ!
๋ฌธ์ ๋ ํด๋น ๋ถ๋ถ์ ์ฌ์ฉํ๋ ๊ณต๊ฐ์ text area์ width๊ฐ ๊ณ ์ ๋์ด ์์ง ์๋ค๋ ์ ์ด๋ค.
์ ์ ์ ๊ธฐ๊ธฐ๋ ์ ๋ง ๋ค์ํ๊ธฐ ๋๋ฌธ์ width๋ฅผ ๊ณ ์ ํ ์ ๋ ์์๋ค
ex) iphone se์์ 3์ค์ผ๊ฒ z-fold์์๋ 1์ค์ด ๋ ์ ์๋ค.. ๐
1) Textarea์ text value๋ฅผ ์ค๋ฐ๊ฟ ๊ธฐ์ค์ผ๋ก split
์ฒ์ ์๊ฐํ ๋ฐฉ๋ฒ์ text area์ value๋ฅผ ์ก์์ splilting ํ๋ ๋ฒ!
const getCurInputTextLineCnt = useCallback((text) => {
const lines = text?.split(/\r|\r\n|\n/);
const count = lines?.length;
return count;
}, []);
<TextArea
onChange={onChange}
style={{
borderRadius: getCurInputTextLineCnt(text)>1? "11px" : "100px"
}}
/>
line count๊ฐ 1 ์ด๊ณผ์ผ ๊ฒฝ์ฐ์ ์๋ ๊ฒฝ์ฐ๋ฅผ ๊ตฌ๋ถํด style์ ์ง์ ํ๋ค.
ํ๊ณ
๋๋ฌด ์ ๋์ ์๋๋ ์ค ์์๋๋ ์ฌ์ฉ์๊ฐ ์ํฐ ์์ด ๋ด์ฉ์ด ๋ง์์ ธ ์ค๋ฐ๊ฟ์ด ๋๋ ๊ฒฝ์ฐ๋ฅผ ์ก์ง ๋ชปํ๋ค.
=> height์ ์ด์ฉํด์ผ ํ๋ค!
2) Height๊ณผ text ๋ชจ๋ ์ด์ฉ
๐ code sandBox ์ฐธ๊ณ
Textarea์ onChange ์ด๋ฒคํธ์์ target์ scrollHeight์ state๋ก ๋ฃ๊ณ
isSingleHeight์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด
์ฌ์ฉ์๊ฐ ์ํฐ๋ฅผ ์ณค๊ฑฐ๋ or ํ ์คํธ height์ด ๋์ด๊ฐ์ ๋ style ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋๋ก ์ค์
const getCurInputTextLineCnt = useCallback((text) => {
const lines = text?.split(/\r|\r\n|\n/);
const count = lines?.length;
return count;
}, []);
const isSingleHeight = useCallback((text, height) => {
console.log("text line count", getCurInputTextLineCnt(text));
console.log("scroll height", height);
return getCurInputTextLineCnt(text) > 1 || height > SINGLE_ROW_HEIGHT;
}, []);
ํ๊ณ
height์ด ๋ฐ๋๋ ์๊ฐ catch๊ฐ ํ ๋ฐ์ ๋๋ฆฌ๊ฒ ๋๋ฉด์,
์ฌ๋ฌ์ค -> ํ ์ค ์ด ๋๋ ์๊ฐ์ด ์๋๋ผ
์ฌ๋ฌ์ค -> ํ ์ค์ด ๋๊ณ ์ ๋ ฅ์ด ์์ด์ผ style ์ค์ ์ด ๋๋ ํ๊ณ๊ฐ ์๊ฒผ๋ค.
๊ทธ ์ธ ์ถ๊ฐ๋ก ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
Antd text area์์ autoSize prop์ ๋ณด๋ line count๋ฅผ ํ๋ ๋ก์ง์ด ์์ ๊ฒ๊ฐ์ antd ๋ฅผ cloneํด์ ์ ์ ์ด ๋ค์ก๊ณ ..
antd ์์ ๐ rc-textarea ๋ฅผ ๊ฐ์ ธ์ ์ฌ์ฉํ ๊ฒ์ ํ์ธํ๊ณ ๋ฏ์ด๋ณด๋
calculateNodeHeight.tsx ํจ์๋ฅผ ์ด์ฉํด ๊ตฌ์ฑ ์ค์ด์๊ณ
- ๊ฐ์์ hiddenText area๋ฅผ ๋ง๋ค๊ณ
- ' ' ๋น value๋ฅผ ์ฃผ์ด height์ ์ก๊ณ
- singleRowHeight์ ๋ง๋ค์ด heightํ์ ํ๋ ๊ฒ๊น์ง ํ์ธ..
2) Height๊ณผ text ๋ชจ๋ ์ด์ฉ
Height๋ง ์ด์ฉํ๋ ๋ฐฉ๋ฒ ๋ฐ๊ฒฌ!
์ ์ํฉ์์ text๋ฅผ ๊ตณ์ด ์ด์ฉํ ์ด์ ๋ ํ๋ view width๋ฅผ ์ฑ์ฐ์ง ์๊ณ ์ํฐ๋ฅผ ๋๋ฅธ ๊ฒฝ์ฐ๋ฅผ ์ก๊ธฐ ์ํด์์ด๋ค.
ํ์ง๋ง ๊ฒฐ๊ตญ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ค ์ํฐ๋ฅผ ์ทจ์ํด ๋ค์ ํ ์ค์ด ๋ ๊ฒฝ์ฐ๋ฅผ ์ก์ง ๋ชปํ๋ ํ๊ณ๊ฐ ์์๋ค.
์ ๊ฒฝ์ฐ๋ TextArea์ onChange๋์ onKeyUp์ ์ฌ์ฉํ๋๋ ํด๊ฒฐ !
๋ ์ด๋ฒคํธ ์์์ ์ ์๋ ์๋์ ๊ฐ์๋ฐ,
onChange : html์์๊ฐ ๋ฐ๋์์ ๋ ์ฆ focus ๋ฐ์ ์ ๊ณผ ํ๋ฅผ ๋น๊ตํ์ฌ ๋ณํ๊ฐ ์ผ์ด๋ฌ์ ๊ฒฝ์ฐ ๋ฐ์ํ๋ ์ด๋ฒคํธ
onKeyUp : input ์ด๋ฒคํธ ๋ฐ์ ํ value๊ฐ ์ ๋ฐ์ดํธ ๋ ์ดํ ์์ ๋ผ๋ฉด ๋ฐ์ํ๋ ์ด๋ฒคํธ
์์ธํ ๊ฑด input ๊ด๋ จ ์ด๋ฒคํธ ํํค์น๊ธฐ ๋ฅผ ์ฐธ๊ณ ํด ์ฃผ์ธ์!
'๐ React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] sticky Header CSS๊ฐ ๋ณํ๋ sticky Header ๋ง๋ค๊ธฐ์ ์ต์ ํ (0) | 2022.05.17 |
---|---|
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ Error Boundaries (2) | 2022.04.30 |
[React] OAuth Github ๋ก๊ทธ์ธ ๊ตฌํํ๊ธฐ (2) | 2021.06.05 |
[React] ReactHooks & Context API ๋ฅผ ์ด์ฉํ state ๊ด๋ฆฌ ( VS Redux) (0) | 2021.05.04 |
[React] json-server์์ axios ๋ก ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ (0) | 2021.04.12 |
๋๊ธ