styled-components xây dựng với mục tiêu giữ cho các styles của component nằm chính trong component đó
1. Cài đặt
1 2 | <span class="token function">npm</span> <span class="token function">install</span> styled-components |
Cách sử dụng
1 2 | <span class="token keyword">import</span> styled <span class="token keyword">from</span> <span class="token string">'styled-components'</span> |
2. Tạo component với các thẻ html cơ bản
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 ra HTML với class được sinh ra ngẫu nhiên không bị trùng nhau
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
Ta có thể truyền props vào các styled components như sau
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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Kế thừa style từ component khác
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 plain-text"> </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 plain-text"> </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 plain-text"> </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 với các thư viện khác
Kế thừa cả những component của bên thứ 3
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 plain-text"> </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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Cài đặt thư viện MUI
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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Cài đặt thư viện Antd
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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Với styled-components
bạn cũng có thể thay đổi tag name so với định nghĩa ban đầu.
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
Trong styled-components
có thể sử dụng những CSS selector cơ bản như > , + , ~ …
và sử dụng Nesting như 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 plain-text"> </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 plain-text"> </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 plain-text"> </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 plain-text"> </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 plain-text"> </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 plain-text"> </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 plain-text"> </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 plain-text"> </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"> </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
Hoạt động tốt với 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
Kiểu 1: tạo ra button có type là 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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Kiểu 2: tạo ra common button, sau đó tạo submit button kế thừa từ button này
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 plain-text"> </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 plain-text"> </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 plain-text"> </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
kiểu 3: attrs
nhận vào 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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Tạo ra global style áp dụng cho toàn dự án
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 plain-text"> </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 plain-text"> </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 plain-text"> </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
Tạo ra theme config để dùng chung
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 plain-text"> </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 plain-text"> </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 plain-text"> </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