๐ธ ์ปดํฌ๋ํธ๋ฅผ ๋ชจ๋ ๋จ์๋ก ๊ฐ๋ฐํ์ฌ UI ๊ตฌ์ถ์ ๋๋ฌํ๋ ๊ฐ๋ฐ ๋ฐ ์ค๊ณ ๋ฐฉ๋ฒ๋ก .
๐ธ ๊ธฐ๋ณธ์ ์ธ ์ปดํฌ๋ํธ ๋จ์๋ถํฐ ์์ํด์ UI ๋ทฐ๋ฅผ ๊ตฌ์ฑํ๊ธฐ ์ํด ์ ์ง์ ์ผ๋ก ์กฐ๋ฆฝ(๊ฒฐํฉ)ํด๊ฐ๋ ์ํฅ์ ์ฑํฅ์ ๋.
- ๊ธฐ์กด CSS๋ฌธ์๋ฅผ ์์ฑํ ๋๋ Color๊ฐ ์ฐพ๊ธฐ, tag ๋ซ๊ธฐ ๋ฑ ๋ฒ๊ฑฐ๋ก์ด ์์ ์ด ๋ฐ๋ณต์ ์ผ๋ก ์๊ตฌ๋๊ณ ์์.
- ๋ฟ๋ง์๋๋ผ ํด๋์ค ์์๊ณผ ๊ฐ์ ์ผ๋ก ์ ์ CSS ๋ฌธ์๋ ์์ด ๋ง์์ง๊ณ ์ด๋ก ์ธํด ์ ์ง๊ด๋ฆฌ์ ๋ง์ ์ํฅ์ ๋ผ์นจ.
- ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ (๋ณ์, ํจ์, ์์ ๋ฑ)์ ํ์ฉํด ํด๊ฒฐํ ์ ์์.
๐ธ CSS๊ฐ ๊ตฌ์กฐ์ ์ผ๋ก ์์ฑ๋ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ.
๐ธ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์์ฒด๋ง์ผ๋ก๋ ์น ์๋ฒ๊ฐ ์ธ์งํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ ๊ฐ CSS ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ง๋ Compiler๋ฅผ ์ฌ์ฉํด ์ปดํ์ผํ์ฌ CSS ๋ฌธ์๋ก ๋ณํ์ํด.
Syntactically Awesome Style Sheets (SASS)
๐ธ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ค ํ๋๋ก CSS๋ฅผ ํ์ฅํด์ฃผ๋ ์คํฌ๋ฆฝํ
์ธ์ด.
๐ธ SCSS ์ฝ๋๋ฅผ ์ฝ์ด์ ์ ์ฒ๋ฆฌํ ๋ค์ ์ปดํ์ผํด์ ์ ์ญ CSS ๋ฒ๋ค ํ์ผ์ ๋ง๋ค์ด ์ฃผ๋ ์ ์ฒ๋ฆฌ๊ธฐ(preprocessor)์ ์ญํ
๐ธ ์๋ฐ์คํฌ๋ฆฝํธ์ฒ๋ผ ํน์ ์์ฑ(ex. color, margin, width ๋ฑ)์ ๊ฐ(ex. #ffffff, 25rem, 100px ๋ฑ)์ ๋ณ์๋ก ์ ์ธํ์ฌ ํ์ํ ๊ณณ์ ์ ์ธ๋ ๋ณ์๋ฅผ ์ ์ฉํ๊ฑฐ๋ ๋ฐ๋ณต๋๋ ์ฝ๋๋ฅผ ํ ๋ฒ์ ์ ์ธ์ผ๋ก ์ฌ๋ฌ ๊ณณ์์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํด ์ฃผ๋ ๋ฑ์ ๊ธฐ๋ฅ์ ๊ฐ์ง.
- ๊ทธ๋ฌ๋ CSS์ ์ฉ๋์ด ์ปค์ง๊ณ ์ปดํ์ผ์ ํด์ฃผ์ด์ผํ๋ค๋ ๋จ์ ์ด ์์.
- CSS ์ ์ฒ๋ฆฌ๊ธฐ์ ๋ฌธ์ ๋ฅผ ๋ณด์ํ๊ธฐ ์ํด BEM, OOCSS, SMACSS ๊ฐ์ CSS ๋ฐฉ๋ฒ๋ก ์ด ๋ํ๋จ.
๐ธ ์ข ๋ ํจ์จ์ ์ผ๋ก CSS๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก CSS๋ค์ด๋ฐ, ์์ฑ ๋ฐฉ๋ฒ ๋ฑ์ ๊ท์น์ ๋์ด ์งํค๋ ๊ฒ์ ๋งํจ.
BEM (Block Element Modifier)
Block--Element__Modifier
๋ก ๊ตฌ๋ถํ์ฌ ํด๋์ค๋ช ์ ์์ฑํ๋ ๋ฐฉ๋ฒ
- Block : ๋ฌธ๋จ ์ ์ฒด์ ์ ์ฉ๋ element๋ element๋ฅผ ๋ด๊ณ ์๋ ์ปจํ ์ด๋. ๊ธฐ๋ฅ์ ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ํ์ด์ง ๊ตฌ์ฑ ์์. ๋ธ๋ก์ ์ฌ์ฌ์ฉ๊ณผ ์ค์ฒฉ์ด ๊ฐ๋ฅํด์ผ ํ๋ฏ๋ก ์ฌ๋ฐฑ, ์์น ๋ฑ์ ์ํฅ๋ฐ์ง ์๋๋ก ํด์ผํจ.
- Element : Block ์์์ ํน์ ๊ธฐ๋ฅ์ ์ํํ๋ ์ปดํฌ๋ํธ. ๋จ๋ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋ธ๋ก์ ๋ถ๋ถ์ ์ธ ๊ตฌ์ฑ์์๋ก ๋ธ๋ก์ฒ๋ผ ์ค์ฒฉํด์ ์ฌ์ฉํ ์ ์์ผ๋ ๋ธ๋ก์ ์์กด์ ์ธ ์ด๋ฆ์ ๊ฐ์ง.
- Modifier : ์ฌ์ด์ฆ, Boolean ๊ฐ์ฒ๋ผ ๋ธ๋ก์ด๋ ์์๋ก ์ ์ ์๋ ๋ชจ์, ์ํ, ํ๋์ ์ ์
- ์๋ฌธ์, ์ซ์๋ง์ ์ด์ฉํด ์๋ช , ๊ธฐ๋ณธ์ ์ผ๋ก ID๋ฅผ ์ฌ์ฉํ์ง ์๊ณ class๋ง์ ์ฌ์ฉํจ.
๐ธ BEM, OOCSS, SMACSS ๊ฐ๊ฐ์ ์ฅ๋จ์ ์ด ์์ผ๋ ๊ฒฐ๊ตญ ์ธ ๋ฐฉ๋ฒ๋ก ๋ชจ๋ ๊ฐ์ ์งํฅ์ ์ ๊ฐ์ง.
๐ธ ๋จ์
๐ธ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ธฐ ์ํด CSS๋ฅผ ์ปดํฌ๋ํธ ์์ญ์ผ๋ก ๋ถ๋ฌ๋ค์ด๊ธฐ ์ํ CSS-in-JS๊ฐ ๋ํ๋จ.
๐ธ CSS-in-JS์๋ ๋ํ์ ์ผ๋ก Styled-Component๊ฐ ์์.
๐ธ CSS๋ฅผ ์ปดํฌ๋ํธํ ์ํด์ผ๋ก์จ ๊ตฌ์กฐ์ ์ผ๋ก ๊ด๋ฆฌํ๋ React์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ.
๐ธ ๊ธฐ๋ฅ์ (Functional) ํน์ ์ํ๋ฅผ ๊ฐ์ง ์ปดํฌ๋ํธ๋ค๋ก๋ถํฐ UI๋ฅผ ์์ ํ ๋ถ๋ฆฌํด ์ฌ์ฉํ ์ ์๋ ์์ฃผ ๋จ์ํ ํจํด์ ์ ๊ณตํจ.
๐ธ HTML + JS + CSS๊น์ง ๋ฌถ์ด์ ํ๋์ JSํ์ผ ์์์ ์ปดํฌ๋ํธ ๋จ์๋ก ๊ฐ๋ฐํ ์ ์์.
๐ธ ์๋์ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์.
1. ํฐ๋ฏธ๋์ ๋ช
๋ น์ด๋ฅผ ์
๋ ฅํ์ฌ ์ค์นํ๊ธฐ
# with npm
$ npm install --save styled-components@latest
# with yarn
$ yarn add styled-components
2. JS ํ์ผ์์ ๋ถ๋ฌ์ค๊ธฐ
import styled from "styled-components"
๐ธ ์ฌ๋ฌ ๋ฒ์ ์ Styled Components๊ฐ ์ค์น๋์ด ์๊ธฐ๋ ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์๋์ ์ฝ๋๋ฅผ package.json์ ์์ฑ.
{
"resolutions": {
"styled-components": "^5"
}
}
๐ธ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธ ํ, styled.ํ๊ทธ์ข
๋ฅ
๋ฅผ ํ ๋นํ๊ณ , ๋ฐฑํฑ ์์ ๊ธฐ์กด CSS ๋ฌธ๋ฒ์ ์์ฑ.
๐ธ ์ด ์ปดํฌ๋ํธ๋ฅผ ๋ฆฌํด๋ฌธ์์ ์์ฑํด์ฃผ๋ฉด ์คํ์ผ์ด ์ ์ฉ๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋จ.
๐ธ ์ปดํฌ๋ํธ๋ฅผ ์ ์ธํ๊ณ styled()
์ ์ฌํ์ฉํ ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฌํด ์ค ๋ค์, ์ถ๊ฐํ๊ณ ์ถ์ ์คํ์ผ ์์ฑ ์์ฑ.
๐ธ props ๊ฐ์ ๋ฐ๋ผ์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง ๊ฐ๋ฅ
๐ธ ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด ๋ฌธ๋ฒ(${ }
)์ ์ฌ์ฉํ์ฌ JavaScript ์ฝ๋๋ฅผ ์ฌ์ฉ. props๋ฅผ ๋ฐ์์ค๋ ค๋ฉด props๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์๋ฅผ ๋ง๋ค์ด ์ฌ์ฉ.
1) Props๋ก ์กฐ๊ฑด๋ถ ๋ ๋๋งํ๊ธฐ
- ์ผํญ ์ฐ์ฐ์๋ฅผ ํ์ฉํด
<Button>
์ปดํฌ๋ํธ์skyblue
๋ผ๋ props๊ฐ ์๋์ง ํ์ธํ๊ณ , ์์ผ๋ฉด ๋ฐฐ๊ฒฝ์์ผ๋กskyblue
๋ฅผ, ์์ ๊ฒฝ์ฐwhite
๋ฅผ ์ง์ ํด ์ฃผ๋ ์ฝ๋.- ์ด ์ฝ๋์ ๋ฐ๋ผ ๋ ๋๋ง ๋
<Button>
์ปดํฌ๋ํธ๋ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์.
2) Props ๊ฐ์ผ๋ก ๋ ๋๋งํ๊ธฐ
๐ธ props์ ๊ฐ์ ํต์งธ๋ก ํ์ฉํด์ ์ปดํฌ๋ํธ ๋ ๋๋ง์ ํ์ฉ.
๐ธprops.color
๊ฐ ์๋ค๋ฉดwhite
๋ฅผ,props.color
๊ฐ ์๋ค๋ฉดprops.color
์ ๊ฐ์ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ์คํ์ผ ์์ฑ ๊ฐ์ผ๋ก ๋ฆฌํด. ๊ทธ ๊ฒฐ๊ณผcolor
๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ฐ์ props์ ๊ฐ์ผ๋ก ๋ฐฐ๊ฒฝ์์ด ์ง์ ๋จ.
๐ธ ์ ์ญ ์คํ์ผ์ ์ค์ ํ๋ ค๋ฉด, Styled Components์์ createGlobalStyle
ํจ์๋ฅผ ๋ถ๋ฌ์ด.
import { createGlobalStyle } from "styled-components";
๐ธ ์ด ํจ์๋ฅผ ์ฌ์ฉํด CSS ํ์ผ์์ ์์ฑํ๋ฏ ์ค์ ํด ์ฃผ๊ณ ์ถ์ ์คํ์ผ์ ์์ฑํ๊ณ , ์ด๋ ๊ฒ ๋ง๋ค์ด์ง <GlobalStyle>
์ปดํฌ๋ํธ๋ฅผ ์ต์์ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํด ์ฃผ๋ฉด ์ ์ญ์ <GlobalStyle>
์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์ ์ฉ๋จ.
const GlobalStyle = createGlobalStyle`
button {
padding : 5px;
margin : 2px;
border-radius : 5px;
}
`
function App() {
return (
<>
<GlobalStyle />
<Button>์ ์ญ ์คํ์ผ ์ ์ฉํ๊ธฐ</Button>
</>
);
}
๐ธ CDD ๋ฐฉ๋ฒ์ ๊ธฐ๋ฐํ์ฌ ๊ฐ UI ์ปดํฌ๋ํธ๋ค์ ์๊ฐ์ ์ผ๋ก ์ฝ๊ฒ ๋ณผ ์ ์๋ ๊ฐ๋ฐ๋๊ตฌ.
๐ธ ๋ง๋ค์ด ๋ ๊ฐ UI ์ปดํฌ๋ํธ๋ค์ ์นดํ๋ก๊ทธ์ฒ๋ผ ์๊ฐ์ ์ผ๋ก ๋ณผ ์ ์๊ณ , ๊ฐ props๋ฅผ ์ค์ ํด๋ณด๋ฉฐ ์์ ํ ์๋ ์์.
๐ธ UN์ Storybook ํ์ด์ง
๐ธ ์ปดํฌ๋ํธ๋ฅผ ๋ฌธ์ํํ์ฌ ํ์ฌ์ UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์ฌ์ฉ(์ฌ์ฌ์ฉ์ฑ ์ฉ์ด)
๐ธ ์๋์ผ๋ก ์ปดํฌ๋ํธ๋ฅผ ์๊ฐํํ์ฌ ์๋ฎฌ๋ ์ด์ ํ ์ ์์. (์ด๋ฅผ ํตํด ๋ฒ๊ทธ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ ์ ์๋๋ก ๋์์ค)
๐ธ ํ ์คํธ ๋ฐ ๊ฐ๋ฐ ์๋๋ฅผ ํฅ์ํ๋ ์ฅ์ ์ด ์์ผ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ๋ํ ์์กด์ฑ์ ๊ฑฑ์ ํ์ง ์๊ณ ๋น๋ํ ์ ์์.
๐ธ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ฐ ํ๊ฒฝ์์ ์คํ๋์ด, ๊ฐ๋ฐ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ์ํฉ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ UI ์ปดํฌ๋ํธ๋ฅผ ์ง์ค์ ์ผ๋ก ๊ฐ๋ฐํ ์ ์์.
๐ธ UI ์ปดํฌ๋ํธ๋ค์ ์นดํ๋ก๊ทธํ
๐ธ ์ปดํฌ๋ํธ ๋ณํ๋ฅผ Stories๋ก ์ ์ฅ
๐ธ ํซ ๋ชจ๋ ์ฌ ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ฐ๋ฐ ํด ๊ฒฝํ์ ์ ๊ณต (์์ ์ ๋ฐ๋ก ์ ์ฉ๋จ)
๐ธ ๋ฆฌ์กํธ๋ฅผ ํฌํจํ ๋ค์ํ ๋ทฐ ๋ ์ด์ด ์ง์
๐ธ React๋ฅผ ํตํด ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ. CRA์ ํตํด React ํ๋ก์ ํธ๋ฅผ ํ๋ ์์ฑํ๊ณ , ์์ฑ๋ ํด๋ ์ ํฐ๋ฏธ๋์ ์๋์ ๋ช ๋ น์ด ์ ๋ ฅ.
// ์ค์นํ๊ธฐ
npx storybook@latest init
๐ธ package.json
์ ๋ณด๊ณ ์ฌ์ฉ ์ค์ธ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ง๋ Storybook ์ฌ์ฉ ํ๊ฒฝ์ ์์์ ๋ง๋ค์ด์ฃผ๊ธฐ ๋๋ฌธ์, ๊ผญ React๊ฐ ์๋๋๋ผ๋
๋ค์ํ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ ์ ์์.
๐ธ Storybook ์ค์น๊ฐ ์๋ฃ๋๋ฉด, ์๋์ ํด๋๊ฐ ์์ฑ๋จ.
/.storybook
: Storybook ๊ด๋ จ ์ค์ ํ์ผ/src/stories
: Storybook ์์ ํ์ผ๋ค๐ธ npm run storybook
: localhost:6006์ผ๋ก ์ ๊ทผํ์ฌ Storybook์ ์คํ.
๐ธ Storybook์ ๋ง๋ค๊ธฐ ์ํด ๊ธฐ๋ณธ์ด ๋ ์ปดํฌ๋ํธ๋ฅผ ๋จผ์ ์์ฑ.
๐ธ ์๋์ ๊ฐ์ด src
ํด๋์ Button.js
ํ์ผ์ ๋ง๋ค์ด ๊ธฐ๋ณธ Button
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ฌ.
import React from "react";
const Button = ({title, color}) => (
<button style={{color: color}}>{title}</button>
);
export default Button;
๐ธ ๊ฐ์ src
ํด๋ ์์ Button.stories.js
ํ์ผ์ ๋ง๋ฌ (/.storybook
์์ ์๋ storkbook ์ค์ ํ์ผ์ ์ํด ์ปดํฌ๋ํธ ํ์ผ๋ช
.stories.js
๋ก ํ์ผ์ด ์๋์ผ๋ก ์คํ ๋ฆฌ๋ก ์ธ์๋จ.
// Button.stories.js
import Title from "./Button";
export default {
title: "UI Components/Button", // storybook ๋ฌธ์์ ์นดํ
๊ณ ๋ฆฌ
component: Button, //์คํ ๋ฆฌ๋ก ๋ง๋ค ์ปดํฌ๋ํธ
//์ปดํฌ๋ํธ์ ํ์ํ ์ ๋ฌ์ธ์์ ์ข
๋ฅ์ ํ์
argTypes: {
title: { control: "text" }, // control ํจ๋์์ ์ง์ ํ
์คํธ ์
๋ ฅ ๊ฐ๋ฅ
color: { control: "text"}, // control ํจ๋์์ ์ง์ ์ปฌ๋ฌ ์
๋ ฅ ๊ฐ๋ฅ
size: { control: { type:'radio', options : ['big', 'normal', 'small'] }}, // ์ปจํธ๋กค ํจ๋์์ radioํ์
๋ฒํผ์ผ๋ก big, normal, small์ ์ต์
์ ์ ํ ๊ฐ๋ฅ
}
}
//ํ
ํ๋ฆฟ ์์ฑ: Button ์ปดํฌ๋ํธ๊ฐ args๋ฅผ ์ ๋ฌ๋ฐ์ props๋ก ๋ด๋ ค์ค๋ค.
const Template = (args) => <Button {...args} />
//๋ง์ฝ ์คํ ๋ฆฌ๋ถ์์ ์ธ์๋ฅผ ์ง์ ๋ฐ์ผ๋ ค๋ฉด ์์ Template๋ฅผ ๊ทธ๋๋ก exportํ๋ค.
//์คํ ๋ฆฌ ์์ฑ: ์คํ ๋ฆฌ๋ export const๋ก ํ
ํ๋ฆฟ์ ์ฌ์ฉํ์ฌ ์ถ๊ฐํ๋ค.
export const RedButton = Template.bind({}); //๋ค์ ์ฌํญ์ ๊ฑฐ์ ์ ํด์ง ๋ฌธ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ฉด ์ข๋ค.
// ๋ง๋ค์ด์ค ์คํ ๋ฆฌ์ ์ธ์๋ฅผ ์ ๋ฌํ๋ค.
RedButton.args= {
title: "Red Button",
color: "#ff0000"
}
export const StorybookButton = (args) =>{
return <Button {...args} />
}
๐ธ ์คํ ๋ฆฌ๋ถ์ ์คํํ๋ฉด ๋ง๋ ์คํ ๋ฆฌ๋ฅผ ํด๋น ์นดํ ๊ณ ๋ฆฌ์์ ํ์ธํ ์ ์์.
๐ธ React๋ฅผ ๋ค๋ฃฐ๋ DOM์ ์ง์ ์กฐ์ํ๋ ๊ฒ์ ์ง์ํด์ผํจ.
๐ธ ํ์ง๋ง ์๋ ์์์ ๊ฐ์ด DOM ์๋ฆฌ๋จผํธ์ ์ฃผ์๊ฐ์ ํ์ฉํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์กด์ฌ. ์ด๋ ์ฌ์ฉํ๋๊ฒ Hook ํจ์ useRef
.
๐ธ useRef
๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ์ํฉ
๐ธ React๋ ์ด๋ฐ ์์ธ์ ์ธ ์ํฉ์์ useRef
๋ก DOM ๋
ธ๋, ์๋ฆฌ๋จผํธ, ๊ทธ๋ฆฌ๊ณ React ์ปดํฌ๋ํธ ์ฃผ์๊ฐ์ ์ฐธ์กฐ๊ฐ๋ฅ.
๐ธ ์๋ ์์ ์ฝ๋์ฒ๋ผ ์์ฑํ๋ฉด ์ฃผ์๊ฐ์ ํ์ฉํ ์ ์์.
const ์ฃผ์๊ฐ(DOM)์ ํ ๋นํ ์์์ ๋ณ์ el = useRef(์ฐธ์กฐ์๋ฃํ)
return (
<div>
<input ref={el} type="text />
// React์์ ์ฌ์ฉ๊ฐ๋ฅํ ref๋ผ๋ ์์ฑ์ ๋ณ์๋ฅผ ํ ๋นํ๋ฉด, ๊ทธ ๋ณ์์๋ ์๋ฆฌ๋จผํธ์ ์ฃผ์๊ฐ ๋ด๊น.
// ํฅํ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ์ด ์๋ฆฌ๋จผํธ๋ฅผ ํ์ฉํ ์ ์์.
</div>);
๐ธ ์ด ์ฃผ์๊ฐ์ ์ปดํฌ๋ํธ๊ฐ re-render ๋๋๋ผ๋ ๋ฐ๋์ง ์์. ์ด๋ฅผ ์ด์ฉํด ์ ํ๋ ์ํฉ์์ useRef
์ ํ์ฉํ ์ ์์.
function TextInputWithFocusButton() {
const inputEl = useRef(null);
const onButtonClick = () => {
inputEl.current.focus()
}
return (
<>
<input ref={inputEl} type="text" />
<button onClick={onButtonClick}>Focus the input</button>
</>);
}
๐ธ ์ ์๋ ์ํฉ ์ ์ธํ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ React ๋ฌธ๋ฒ์ ๋ฒ์ด๋ useRef
๋ฅผ ๋จ์ฉํ๋ ๊ฒ์ ๋ถ์ ์ ํ๊ณ , React์ ํน์ง์ด์ ์ฅ์ ์ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์์น๊ณผ ๋ฐฐ์น๋๊ธฐ ๋๋ฌธ์, ์กฐ์ฌํด์ ์ฌ์ฉํด์ผ ํจ.
๐ธ styled-components
๐ธ Storybook