๐บ ์๋ฌ ๋ฐ์ ์์ธ์?
styled-components ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ์ค, ํผ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๋ฐํํด์ boolean
๊ฐ์ผ๋ก ๋์ด๊ฐ props๋ก ์์ฑ์ ์ ๋ฌํด์ฃผ๋๋ฐ, ์ด๋ ์๋ฌ๊ฐ ๋ฐ์ํ์๋ค.
react-dom.development.js:86 Warning: Received
true
for a non-boolean attributeactive
.
If you want to write it to the DOM, pass a string instead: active=โtrueโ or active={value.toString()}.
์ด ์๋ฌ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ React๊ฐ active๋ผ๋ prop์ DOM ์์์ ํ์ค ์์ฑ์ผ๋ก ์ธ์ํ์ง ๋ชปํ๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ํ์ฌ ์ค์ DOM ์ ๋ฌ์ด ๋๊ณ , ์๋ฌ๋ฅผ ๋ฐํํ๋ ๊ฒ์ด์๋ค.
โ ์๋ฌ ์ฒ๋ฆฌ ์ ์ฝ๋๋?
๊ธฐ์กด์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{contentTabs.map((tab, idx) => (
<ContentTabItems key={idx} active={currentTabMode === idx} onClick={() => handlerTabClick(idx)}>
{tab.title}
</ContentTabItems>
))}
// =============== ์ฝํ
์ธ Vlog or Blog ํญ ===============
const ContentTabItems = styled.li<{ active: boolean }>`
${({ theme }) => theme.common.flexCenterRow};
cursor: pointer;
font-weight: ${({ active }) => (active ? 600 : 500)};
letter-spacing: 0.5px;
font-size: 17px;
height: 45px;
color: ${({ active }) => (active ? 'var(--black-hunt)' : 'var(--gray-dark)')};
position: relative;
`;
active
์์ฑ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
โญ๏ธ ๊ทธ๋ผ ์ด๋ป๊ฒ ํด๊ฒฐํด์ผํ ๊น?
๋ด๊ฐ ์๋ฌ๋ฅผ ํด๊ฒฐํ ๋ฐฉ๋ฒ์ transient props ($)
์ ์ฌ์ฉํ๋ ๊ฒ์ด์๋ค.
styled-components ๊ณต์์ฌ์ดํธ์ ์์ธํ๊ฒ ๋์์๋ค. ๋๋ ํ์ฐธ ์ฝ์งํ๋ค๊ฐ ๊ณต์๋ฌธ์์์ ์ฐพ์๊ฑฐ์ง๋งโฆ ๊ณต์๋ฌธ์๋ฅผ ์ ๋ณด์..!!!
transient props ($)
$
๋ styled-components์ v5.1.0๋ถํฐ ๋์ ๋transient props
์ ์ผ๋ถ๋ค.- styled-components์์ ์ปดํฌ๋ํธ์ ์ ๋ฌ๋ ๋ชจ๋ props๋ DOM ์์์๋ ์ ๋ฌ๋๋๋ฐ, DOM์์ ์ง์ํ์ง ์๋ prop๋ฅผ ๋ฐ๋ ๊ฒฝ์ฐ React๋ ๋ด๊ฐ ์์์ ๋ฐ์ํ ์๋ฌ์ฒ๋ผ ๋ฐ์์ํจ๋ค.
- ์ด๋, styled-components๋
transient props
๋ผ๋ ๊ฐ๋ ์ ๋์ ํ ๊ฒ์ด๋ค. transient props
๋ styled-components๋ก ์ ๋ฌ๋์ง๋ง ์ค์ DOM ์์์๋ ์ ๋ฌ๋์ง ์๋ props๋ค.transient props
๋$
์ ๋์ฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค.
๋ด๊ฐ ์์ ํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค. ์์ ์ ์ฝ๋๋ฅผ ๋น๊ตํ๋ฉด $
๋ฅผ ์ฌ์ฉ์ ๋ฌด๋ง ๋ค๋ฅด์ง ์ฝ๋๋ ๋์ผํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{contentTabs.map((tab, idx) => (
<ContentTabItems key={idx} $active={currentTabMode === idx} onClick={() => handlerTabClick(idx)}>
{tab.title}
</ContentTabItems>
))}
// =============== ์ฝํ
์ธ Vlog or Blog ํญ ===============
const ContentTabItems = styled.li<{ $active: boolean }>`
${({ theme }) => theme.common.flexCenterRow};
cursor: pointer;
letter-spacing: 0.5px;
font-size: 17px;
height: 45px;
font-weight: ${({ $active }) => ($active ? 600 : 500)};
color: ${({ $active }) => ($active ? 'var(--black-hunt)' : 'var(--gray-dark)')};
position: relative;
`;
์์ ์ฝ๋์์, $active prop์ ContentTabItems ์ปดํฌ๋ํธ์๋ง ์ ๋ฌ๋๊ณ ์ค์ DOM ์์์๋ ์ ๋ฌ๋์ง ์๊ณ , ์ด๋ ๊ฒํ๋ฉด React ๊ฒฝ๊ณ ๋ฅผ ํผํ ์ ์๋ค.