styled-components is built with the goal of keeping the component’s styles in that component
1. Settings
1 2 | <span class="token function">npm</span> <span class="token function">install</span> styled-components |
Using
1 2 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> |
2. Create components with basic html tags
1 2 3 4 5 6 7 8 9 10 11 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token comment">// Tạo component Title render ra thẻ h1</span> <span class="token keyword">const</span> StyledTitle <span class="token operator">=</span> styled <span class="token punctuation">.</span> h1 <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: red; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledTitle</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Hello world</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledTitle</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">}</span> |
Output to HTML with a randomly generated class that does not overlap
1 2 | <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token attr-name">class</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> sc-gsnTZi fZzjcr <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> Hello world <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> |
Demo: https://codesandbox.io/s/styled-component-html-220lyc?file=/src/App.js
3. Props
We can pass props to styled components as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token comment">// Tạo component Button với các styles như sau</span> <span class="token keyword">const</span> StyledButton <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> background: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token parameter">props</span> <span class="token operator">=></span> props <span class="token punctuation">.</span> primary <span class="token operator">?</span> <span class="token string">'red'</span> <span class="token operator">:</span> <span class="token string">'white'</span> <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Normal Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledButton</span></span> <span class="token attr-name">primary</span> <span class="token punctuation">></span></span> <span class="token plain-text">Primary Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-components-props-zh1092?file=/src/App.js
4. Extending Styles
Inherit style from another component
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token comment">// Tạo một component Button</span> <span class="token keyword">const</span> Button <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: blue; font-size: 1em; </span><span class="token template-punctuation string">`</span></span> <span class="token comment">// Tạo một RedButton kế thừa những style </span> <span class="token comment">// từ Button phía trên, ghi đè hoặc thêm mới styles</span> <span class="token keyword">const</span> RedButton <span class="token operator">=</span> <span class="token function">styled</span> <span class="token punctuation">(</span> Button <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: red; border-color: red; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">Button</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Normal Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">Button</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">RedButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Red Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">RedButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-components-extend-style-q6tq0c?file=/src/App.js
5. Styles with other libraries
Inherit 3rd party components
5-1. React router dom
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="token keyword">import</span> <span class="token punctuation">{</span> BrowserRouter <span class="token punctuation">,</span> Link <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'react-router-dom'</span> <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token comment">// Thực hiện việc import Link từ React-router-dom</span> <span class="token comment">// Tạo một component mới kế thừa từ Link component</span> <span class="token keyword">const</span> StyledLink <span class="token operator">=</span> <span class="token function">styled</span> <span class="token punctuation">(</span> Link <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: red; font-weight: bold; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">BrowserRouter</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">Link</span></span> <span class="token attr-name">to</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> /about <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Link chưa được CSS</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">Link</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> br</span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledLink</span></span> <span class="token attr-name">to</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> /about <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Sau khi CSS</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledLink</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">BrowserRouter</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-react-router-dom-28oebw?file=/src/App.js
5-2. Material MUI
Install MUI library
1 2 | npm install @mui/material @emotion/react @emotion/styled @mui/styled-engine-sc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">import</span> Typography <span class="token keyword">from</span> <span class="token string">'@mui/material/Typography'</span> <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledTypography <span class="token operator">=</span> <span class="token function">styled</span> <span class="token punctuation">(</span> Typography <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: #333333; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">Typography</span></span> <span class="token attr-name">variant</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> h3 <span class="token punctuation">"</span></span> <span class="token attr-name">gutterBottom</span> <span class="token punctuation">></span></span><span class="token plain-text"> H3 - MUI </span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">Typography</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledTypography</span></span> <span class="token attr-name">variant</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> h3 <span class="token punctuation">"</span></span> <span class="token attr-name">gutterBottom</span> <span class="token punctuation">></span></span><span class="token plain-text"> H3 - styled components </span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledTypography</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-material-ui-r3gplj?file=/src/App.js
5-3. Ant design
Install the Antd . library
1 2 | npm install antd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <span class="token keyword">import</span> <span class="token string">'antd/dist/antd.css'</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> Typography <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'antd'</span> <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> Title <span class="token punctuation">}</span> <span class="token operator">=</span> Typography <span class="token keyword">const</span> StyledTitle <span class="token operator">=</span> <span class="token function">styled</span> <span class="token punctuation">(</span> Title <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> &.ant-typography { color: red; } /* Cách khác */ /* &&& { color: red; } */ </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">Title</span></span> <span class="token attr-name">level</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">2</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">H2 - Antd</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">Title</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledTitle</span></span> <span class="token attr-name">level</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> <span class="token number">2</span> <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span><span class="token plain-text"> H2 - styled components </span><span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledTitle</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-antd-j8j2q1?file=/src/App.js
6. custom tagName
With styled-components
you can also change the tag name from the original definition.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledDiv <span class="token operator">=</span> styled <span class="token punctuation">.</span> div <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: red; font-size: 2rem; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token comment">// Thay đổi tag div => section</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDiv</span></span> <span class="token attr-name">as</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> section <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Hello World!</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-change-html-1fg2cl?file=/src/App.js
7. CSS Selector
In styled-components
you can use basic CSS selectors like > , + , ~ …
and use Nesting like SASS
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledDiv <span class="token operator">=</span> styled <span class="token punctuation">.</span> div <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: blue; /* div khi được hover */ &:hover { color: red; } /* div nằm phía sau không trực tiếp của div */ & ~ & { background: tomato; } /* div nằm phía sau trực tiếp của div */ & + & { background: lime; } /* div có class là something */ &.something { background: orange; } /* div có class .something nằm bên trong */ & .something { background: red; } /* div nằm bên trong html nào đó có class .something-else */ .something-else & { background: cyan; } </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Hello world!</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">How ya doing?</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDiv</span></span> <span class="token attr-name">className</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> something <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">The sun is shining...</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token punctuation">></span></span> <span class="token plain-text">Pretty nice day today.</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Don't you think?</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> div</span> <span class="token attr-name">className</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">"</span> something-else <span class="token punctuation">"</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Splendid.</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDiv</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> div</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-css-selector-x7g98s?file=/src/App.js
8. Responsive
Works well with responsive
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledTitle <span class="token operator">=</span> styled <span class="token punctuation">.</span> h1 <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> background: cyan; color: black; @media screen and (min-width: 768px) { background: tomato; } </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledTitle</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Hello World!</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledTitle</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-responsive-n77075?file=/src/App.js
9. Animations
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">import</span> <span class="token punctuation">{</span> keyframes <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token comment">// Tạo keyframes</span> <span class="token keyword">const</span> rotate <span class="token operator">=</span> keyframes <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> from { transform: rotate(0deg) } to { transform: rotate(360deg) } </span><span class="token template-punctuation string">`</span></span> <span class="token comment">// áp dụng vào animation css</span> <span class="token keyword">const</span> Rotate <span class="token operator">=</span> styled <span class="token punctuation">.</span> div <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> animation: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> rotate <span class="token interpolation-punctuation punctuation">}</span></span><span class="token string"> 2s linear infinite; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">Rotate</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Something</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">Rotate</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-animation-0ogv50?file=/src/App.js
10. With attribute
Style 1 : create a button with type submit
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledSubmitButton <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token punctuation">.</span> <span class="token function">attrs</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> type <span class="token operator">:</span> <span class="token string">'submit'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> border: none; padding: 10px; color: black; background: violet; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> <span class="token plain-text">Hello World</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledSubmitButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Submit Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledSubmitButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo 1: https://codesandbox.io/s/styled-component-attribute1-lsy7yb?file=/src/App.js
Style 2 : create common button, then create submit button inherit from this button
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledButton <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> border: none; padding: 10px; color: black; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">const</span> StyledSubmitButton <span class="token operator">=</span> <span class="token function">styled</span> <span class="token punctuation">(</span> StyledButton <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">attrs</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> type <span class="token operator">:</span> <span class="token string">'submit'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> background: violet; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Normal Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledSubmitButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Submit Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledSubmitButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo 2: https://codesandbox.io/s/styled-component-attribute2-8pettq?file=/src/App.js
type 3 : attrs
receive function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> StyledButton <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token punctuation">.</span> <span class="token function">attrs</span> <span class="token punctuation">(</span> <span class="token parameter">props</span> <span class="token operator">=></span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> type <span class="token operator">:</span> props <span class="token punctuation">.</span> type <span class="token operator">||</span> <span class="token string">'button'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> border: none; padding: 10px; color: black; background: violet; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Normal Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledButton</span></span> <span class="token attr-name">type</span> <span class="token attr-value"><span class="token punctuation attr-equals">=</span> <span class="token punctuation">'</span> submit <span class="token punctuation">'</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Submit Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo 3: https://codesandbox.io/s/styled-component-attribute3-hxs2nl?file=/src/App.js
11. Global style
Create a global style that applies to the entire project
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="token keyword">import</span> <span class="token punctuation">{</span> createGlobalStyle <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> GlobalStyle <span class="token operator">=</span> createGlobalStyle <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> h1 { color: red; } </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">GlobalStyle</span></span> <span class="token punctuation">/></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> h1</span> <span class="token punctuation">></span></span> <span class="token plain-text">Hello World</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> h1</span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-global-style-8jyog9?file=/src/App.js
12. Styled Theme
Create theme config for sharing
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <span class="token keyword">import</span> styled <span class="token punctuation">,</span> <span class="token punctuation">{</span> ThemeProvider <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'styled-components'</span> <span class="token keyword">const</span> styledTheme <span class="token operator">=</span> <span class="token punctuation">{</span> warning <span class="token operator">:</span> <span class="token punctuation">{</span> background <span class="token operator">:</span> <span class="token string">'#ffc107'</span> <span class="token punctuation">,</span> text <span class="token operator">:</span> <span class="token string">'#000'</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> danger <span class="token operator">:</span> <span class="token punctuation">{</span> background <span class="token operator">:</span> <span class="token string">'#dc3545'</span> <span class="token punctuation">,</span> text <span class="token operator">:</span> <span class="token string">'#fff'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token keyword">const</span> StyledWarningButton <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token punctuation">(</span> <span class="token parameter">props</span> <span class="token punctuation">)</span> <span class="token operator">=></span> props <span class="token punctuation">.</span> theme <span class="token punctuation">.</span> warning <span class="token punctuation">.</span> text <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">; background: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token punctuation">(</span> <span class="token parameter">props</span> <span class="token punctuation">)</span> <span class="token operator">=></span> props <span class="token punctuation">.</span> theme <span class="token punctuation">.</span> warning <span class="token punctuation">.</span> background <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">const</span> StyledDangerButton <span class="token operator">=</span> styled <span class="token punctuation">.</span> button <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string"> color: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token punctuation">(</span> <span class="token parameter">props</span> <span class="token punctuation">)</span> <span class="token operator">=></span> props <span class="token punctuation">.</span> theme <span class="token punctuation">.</span> danger <span class="token punctuation">.</span> text <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">; background: </span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span> <span class="token punctuation">(</span> <span class="token parameter">props</span> <span class="token punctuation">)</span> <span class="token operator">=></span> props <span class="token punctuation">.</span> theme <span class="token punctuation">.</span> danger <span class="token punctuation">.</span> background <span class="token interpolation-punctuation punctuation">}</span></span> <span class="token string">; </span><span class="token template-punctuation string">`</span></span> <span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token function">App</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">(</span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">ThemeProvider</span></span> <span class="token attr-name">theme</span> <span class="token script language-javascript"><span class="token script-punctuation punctuation">=</span> <span class="token punctuation">{</span> styledTheme <span class="token punctuation">}</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledWarningButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Warning Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledWarningButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"><</span> <span class="token class-name">StyledDangerButton</span></span> <span class="token punctuation">></span></span> <span class="token plain-text">Danger Button</span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">StyledDangerButton</span></span> <span class="token punctuation">></span></span> <span class="token tag"><span class="token tag"><span class="token punctuation"></</span> <span class="token class-name">ThemeProvider</span></span> <span class="token punctuation">></span></span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
Demo: https://codesandbox.io/s/styled-component-config-theme-n3ey3k?file=/src/App.js:0-836