5. props와 attrs
Props
단순 element인 경우 (ex.
styled.div
) 컴포넌트의 모든 HTML attribute가 DOM으로 전달됨커스텀 React Component인 경우 (ex.
styled(MyComponent)
) 스타일이 지정된 컴포넌트는 모든 프로퍼티를 전달함
// Create an Input component that'll render an <input> tag with some styles
const Input = styled.input`
padding: 0.5em;
margin: 0.5em;
color: ${props => props.inputColor || "palevioletred"};
background: papayawhip;
border: none;
border-radius: 3px;
`;
// Render a styled text input with the standard input color, and one with a custom input color
render(
<div>
<Input defaultValue="@probablyup" type="text" />
<Input defaultValue="@geelen" type="text" inputColor="rebeccapurple" />
</div>
);
type
과 defaultValue
는 자동으로 DOM에 전달되지만, inputColor
는 자동으로 전달되지 않음
타입을 지정해주자
import { useBoolean } from 'usehooks-ts';
import styled, { css } from 'styled-components';
type ParagraphProps = {
active?: boolean;
}
const Paragraph = styled.p<ParagraphProps>`
color: ${(props) => (props.active ? '#F00' : '#888')};
${(props) => props.active && css`
font-weight: bold;
`}
`;
export default function Greeting() {
const { value: active, toggle } = useBoolean(false);
return (
<div>
<Paragraph>
Inactive
</Paragraph>
<Paragraph active>
Active
</Paragraph>
<Paragraph active={active}>
Hello, world
{' '}
<button type="button" onClick={toggle}>
Toggle
</button>
</Paragraph>
</div>
);
}
attrs
컴포넌트의 기본 속성을 지정해줄 수 있음
const Input = styled.input.attrs(props => ({
// we can define static props
type: "text",
// or we can define dynamic ones
size: props.size || "1em",
}))`
color: palevioletred;
font-size: 1em;
border: 2px solid palevioletred;
border-radius: 3px;
/* here we use the dynamically computed prop */
margin: ${props => props.size};
padding: ${props => props.size};
`;
render(
<div>
<Input placeholder="A small text input" />
<br />
<Input placeholder="A bigger text input" size="2em" />
</div>
);
Last updated