styled-component๋ฅผ ์ฌ์ฉํ๋ค๊ฐ
Warning: Received `true` for a non-boolean attribute `{props ๋ช
}`.
์์ ๊ฐ์ ์๋ฌ๋ฅผ ๋ง์ฃผ์ณค๋ค.
์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋์ง ์ฐพ์๋ณด๋, ๋ง๋ค์ด ๋์๋ <TextDiv>
๋ผ๋ common component
์๋ค.
<TextDiv nowrap>์์ธ ๋ด์ฉ</TextDiv>
TextDiv๋ ์ปฌ๋ฌ, ์ฌ์ด์ฆ, ํฐํธ ๊ตต๊ธฐ, wrap ์ฌ๋ถ ๋ฑ์ props๋ก ๋ฐ์์ Text๊ฐ ๋ค์ด๊ฐ div๋ฅผ ์ปค์คํ
ํ ์ ์๋ ์ปดํฌ๋ํธ์๋๋ฐ, ์ props ์ค์์ nowrap
์ด ์๋ฌ์ ์์ธ์ด์๋ค.
import styled from 'styled-components';
export interface TextDivProps {
color?: string;
size?: number;
weight?: number;
nowrap?: boolean;
}
export const TextDiv = styled.div<TextDivProps>`
color: ${({ color }) => (color ? color : 'black')};
font-size: ${({ size }) => (size ? size : 14)}px;
font-weight: ${({ weight }) => (weight ? weight : 400)};
white-space: ${({ nowrap }) => (nowrap ? 'nowrap' : 'normal')};
`;
nowrap
์ non-boolean attribute์ธ๋ฐ, true, false์ธ boolean ๊ฐ์ผ๋ก ๋ฐ์๋ค๋ ๋ด์ฉ์ ์๋ฌ์ด๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก HTML ์๋ฉํฑ ํ๊ทธ๋ width, height, id ๋ฑ๋ฑ ๋ค์ํ ์์ฑ์ ๊ฐ์ง๊ณ ์๋ค.
์ด๋ฌํ ์์ฑ๋ค์ ์ฐ๋ฆฌ๋ HTML ํ์ค ์์ฑ
์ด๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค.
HTML ํ์ค์์ฑ
https://developer.mozilla.org/ko/docs/Web/HTML/Attributes
ํ์ค ์์ฑ์ด ์๋ ๊ฒ๋ค์ ๋นํ์ค ์์ฑ์ด๋ผ๊ณ ํ ์ ์๋ค.
์๋ฅผ ๋ค์ด์ alt={true}
๋ฑ ๊ณผ ๊ฐ์ด, string์ผ๋ก ์ ๋ฌํด์ฃผ์ด์ผ ํ๋ ํ์ค ์์ฑ์ boolean์ผ๋ก ์ ๋ฌํ๊ฒ ๋๋ฉด non-boolean attribute warning์ด ๋ฐ์ํ ๊ฒ์ด๋ค.
styled-component ๊ณต์๋ฌธ์๋ฅผ ํ์ธํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ด์ฉ์ ํ์ธํ ์ ์๋ค.
Styled-component Passed Props
https://styled-components.com/docs/basics#passed-props
If the styled target is a simple element (e.g. styled.div), styled-components passes through any known HTML attribute to the DOM. If it is a custom React component (e.g. styled(MyComponent)), styled-components passes through all props.
Note how the inputColor prop is not passed to the DOM, but type and defaultValue are. That is styled-components being smart enough to filter non-standard attributes automatically for you.
์ค์ DOM ์๋ฆฌ๋จผํธ์ ์ ๋ฌํ๊ธฐ ์ ์, styled-components ๋ด๋ถ์์ ๋นํ์ค ์์ฑ์ ์๋์ผ๋ก ํํฐ๋งํ๊ณ ์๋ค๋ ๊ฒ์ ์ ์ ์๋ค.
์๋ ๋งํฌ์์ ํํฐ๋ง ๋๋ ๋นํ์ค ์์ฑ์ ์ด๋ค ๊ฒ๋ค์ด ์๋์ง ํ์ธํ ์ ์๋ค.
https://github.com/emotion-js/emotion/blob/main/packages/is-prop-valid/src/props.js
nowrap์ ๋นํ์ค ์์ฑ์ด๊ณ , 2๋ฒ์ styled-component์์ ํํฐ๋ง ํ๋ attribute์ด๋ฆ๋ ์๋์ง๋ง, ์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฑธ๊น?
nowrap ๊ฐ์ ์์ฑ์ CSS์ white-space ์์ฑ์ ํด๋นํ๋ฉฐ, HTML์ ํ์ค ์์ฑ์ ์๋์ง๋ง DOM์ ์ง์ ์ ์ฉ๋ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ styled-components์์๋ ์ด ์์ฑ์ DOM์ผ๋ก ์ ๋ฌํ๋ ค๊ณ ์๋ํ๋ ค๊ณ ํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ฅผ boolean ๊ฐ์ผ๋ก ์ ๋ฌํ๋ ค๊ณ ํ๋ ์ํฉ์์ ๊ฒฝ๊ณ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ํ์ ์ ์๋ค.
Transient props v5.1
If you want to prevent props meant to be consumed by styled components from being passed to the underlying React node or rendered to the DOM element, you can prefix the prop name with a dollar sign ($), turning it into a transient prop.
์ฑ๋ฅ ์ต์ ํ:
styled-components๋ฅผ ์ฌ์ฉํ ๋๋ ๋ถํ์ํ ์์ฑ์ด DOM์ ์ ๋ฌ๋๋ ๊ฒ์ ์ต๋ํ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ค์ํ๋ค. DOM์ ๋ถํ์ํ ์์ฑ์ด ์ ๋ฌ๋๋ฉด, ์น ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์์ฑ์ ํด์ํ๊ณ ์ฒ๋ฆฌํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋๋ค.
์คํ์ผ ๊ฐ๋
์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ:
์ปดํฌ๋ํธ๋ฅผ ์คํ์ผ๋งํ ๋ ์ฌ์ฉํ๋ ์์ฑ ์ด๋ฆ์ด DOM์ ์ ๋ฌ๋๋์ง ์ฌ๋ถ๋ฅผ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ๋ ๊ฒ์ ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ ๋์ฌ์ค๋ค. prefix๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ, ์คํ์ผ์ด ์ ์ฉ๋๋ ์์ฑ๊ณผ ์ค์ ๋ก DOM์ ์ ๋ฌ๋๋ ์์ฑ์ ๋ช
ํํ๊ฒ ๊ตฌ๋ถํ ์ ์๋ค.
์ฝ๋ ์ถฉ๋ ๋ฐฉ์ง:
๋ง์ฝ styled-components์์ ์ฌ์ฉํ๋ ์์ฑ๊ณผ ๋ธ๋ผ์ฐ์ ์์ ์ง์ํ๋ ๋นํ์ค ์์ฑ ์ด๋ฆ์ด ์ถฉ๋ํ๋ค๋ฉด, ์์์น ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์๊ณ , ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด prefix๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, DOM์ผ๋ก ์ ๋ฌ๋์ง ์๋ ๋ค๋ฅธ ์์ฑ์ผ๋ก ๋์ฒดํจ์ผ๋ก์จ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ค์ผ ์ ์๋ค.
References
https://mygumi.tistory.com/382
์ข์ ๊ธ ๊ฐ์ฌํฉ๋๋ค. ์์ฃผ ์ฌ๊ฒ์ :)