What is the use case of Styled-Components' .attrs() function?
Focus on naming is very important.
Styled components as the name suggests are for styling the native DOM elements or custom components.
attrs
is for mentioning the attributes of that very same DOM element in the attrs
constructor without the need to even mention it in actual component call.
What above line means is you can do
<Input placeholder="A small text input" />
with
const Input = styled.input.attrs(({ type }) => ({
type: type || "password"
}))`
align-items: center;
display: flex;
margin: 1.5vh 0;
`
See that component usage <Input .../>
doesn't have type
prop anywhere. It came from your attribute constructor function(static)
You couldn't have done this otherwise in your style rules because these are just the string literal of your CSS
properties.
It saved you from writing type='password'
in every usage of
<Input type='password' ... />
Bonus:
Now, that's a specific input
component with type
attribute of password. What if you wish to have a general input
(styled component) with any value of type
attribute?
Tada!
const Input = styled.input.attrs(({ type }) => ({
type: type || "password",
...
Your type
is now dynamic i.e. it will take whatever input type
prop you specify from your usage of component and render the input as that type (text, password, file etc. ) or if you skip the type prop it will pick up default of password
. You can use as much conditional logic as you want up there.
Example:
<Input .../> // renders type="password"
<Input type="text" .../>
<Input type="email" .../>
Hope that answers your question.
The goal of .attrs is so it can be passed down from your props. So you can use props inside your styled, and you can create placeholders, or change colors depending of the props etc...
For example :
const InputText = styled.input.attrs({
type: 'text',
placeholder: props => props.placeholder || 'Please fill',
})`
padding: 6px 12px;
`;
Another interesting use is code organization.
Styled-components only work with the style
prop but many custom components don't expose this prop. Instead they provide a *Style
prop which is passed to child component style
props.
As an example react-native-material-textfield has 5 style props.
We use the attrs
function to keep the organization of styles in one file with the rest of the styled components.
This doesn't allow the use of traditional css syntax for the pseudo component but it's the best we could think of to keep all styles organized.