emotion๊ณต์ ์ฌ์ดํธ
: emotion.sh/docs/introduction
์ ๋ React ๊ฐ๋ฐ์ ์ฃผ๋ก emotion์ผ๋ก ์คํ์ผ๋ง์ ํฉ๋๋ค.
์คํ์ผ๋ง ๋ฐ๋ก ๋นผ์ ๊ด๋ฆฌํ๊ธฐ๋ ํธํ๊ณ SASS์ฒ๋ผ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
ํจ์ํ ์คํ์ผ๋ง๋ ์ง์ํฉ๋๋ค.
1. ์ค์น ๋ฐ Demo ์์ค ์ฌ์ฉ
yarn add @emotion/react
๊ณต์ ์ฌ์ดํธ์ ์๋ ์์ ๋ฅผ ๊ฐ์ ธ์ ๋ณด์.
/** @jsx jsx */
import { css, jsx } from '@emotion/react'
const color = 'white'
function App() {
return (
<div className="App">
<div
css={css`
padding: 32px;
background-color: hotpink;
font-size: 24px;
border-radius: 4px;
&:hover {
color: ${color};
}
`}
>
Hover to change color.
</div>
</div>
);
}
export default App;
๋ฆฌ์กํธ ์ต์ ๋ฒ์ ์ผ๋ก ์ค์นํ๊ฑฐ๋ npx๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ์์ฑํ ๊ฒฝ์ฐ, ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋ ๊ป๋๋ค.
errorSyntaxError: pragma and pragmaFrag cannot be set when runtime is automatic.
๊ธฐ์กด์ ์ ์ฌ์ฉํ๋ค๊ฐ ๊ฐ์๊ธฐ ์ด๋ฐ ์๋ฌ๊ฐ ๋์, ์ ๋ ๋ง์ด ๋นํฉํ๋๋ฐ์.
์ด์ ๋ React17๋ก ์ ๋ฐ์ดํธ ๋๋ฉด์ ๋ฐ๋ runtime ์์ง์ด emotion10 ๊ณผ ์ถฉ๋ ๋๋ค๊ณ ํฉ๋๋ค.
ํด๊ฒฐ๋ฐฉ๋ฒ์(๋ง์์ ๋ค์ง ์์ง๋ง... ์กฐ๋ง๊ฐ React๋ emotion ๋ ์ค ํ๋๊ฐ ์ ๋ฐ์ดํธ ํ๊ธธ ๋ฐ๋ผ๋ฉฐ... ๐ฅ)
๊ธฐ์กด runtime์ classic ๋ชจ๋๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋ฉ๋๋ค.
/** @jsx jsx */ ๋์ /** @jsxImportSource @emotion/react */ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค.
/** @jsxImportSource @emotion/react */
import { css, jsx } from '@emotion/react'
const color = 'white'
function App() {
return (
<div className="App">
<div
css={css`
padding: 32px;
background-color: hotpink;
font-size: 24px;
border-radius: 4px;
&:hover {
color: ${color};
}
`}
>
Hover to change color.
</div>
</div>
);
}
export default App;
์ ๋์ต๋๋ค. ๐
2. CSS ๊ณตํต ๊ฐ ์ ์
์์ฃผ ์ฌ์ฉ๋๋ ๊ธฐ๋ณธ ํฐํธ ํฌ๊ธฐ, ์ปฌ๋ฌ ๋ฑ์ ๋ฐ๋ก ๊ด๋ฆฌํ๋ฉด, ์ ์ง๋ณด์ํ๊ธฐ ์ข๊ณ , ์ฝ๋๋ ํจ์ฌ ๊น๋ํด ์ง๋๋ค.
๊ณตํต ์์ ๋ฐ๋ก ๋นผ์ colors.js ๋ผ๋ ํ์ผ์ ๊ฐ์ฒด๋ก ๋ฃ์ด์ค๋๋ค.
์ฌ์ฉํ ํ์ด์ง์์ ๋ถ๋ฌ์ ${color} ํํ๋ก ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
// colors.js
export const colors = {
default: 'darkseagreen',
warning: 'darkorange',
danger: 'lightcoral',
}
/** @jsxImportSource @emotion/react */
import { css, jsx } from '@emotion/react'
import { colors } from './colors'
function App() {
return (
<div className="App">
<button css={buttonStyle}>DEFAULT</button>
</div>
);
}
const buttonStyle = css`
background: ${colors.default}; // darkseagreen ์ปฌ๋ฌ๋ฅผ ๋ถ๋ฌ์ด
color: #fff;
border: 0 none;
padding: 8px;
margin: 5px;
border-radius: 3px;
`
export default App;
3. ํจ์ํ์ผ๋ก ์ฌ์ฉํ๊ธฐ
props๋ก ๊ฐ์ ์ ๋ฌํ์ฌ ์กฐ๊ฑด๋ถ๋ฅผ ์ฝ์ ํ ์๋ ์์ต๋๋ค.
props๊ฐ์ผ๋ก ์ ๋ฌ ๋ฐ์ผ๋ ค๋ฉด ํจ์ํํ๋ก ์์ฑํด์ค์ผ ํฉ๋๋ค.
{...}
function App() {
return (
<div className="App">
<button css={buttonStyle('default')}>DEFAULT</button>
<button css={buttonStyle('warning')}>DEFAULT</button>
<button css={buttonStyle('danger')}>DEFAULT</button>
</div>
);
}
{...}
const buttonStyle = (type) => {
return css`
background: ${
type === 'default' ? colors.default :
type === 'warning' ? colors.warning :
type === 'danger' ? colors.danger : 'lightgray'
};
color: #fff;
border: 0 none;
padding: 8px;
margin: 5px;
border-radius: 3px;
`
}
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ ํ์๋ ์์ด ์ถ๊ฐ๋ ๋๋ง๋ค ๋ ์ถ๊ฐํด์ผ๋์ง์?
๊ฐ์ฒดํํ๋ก ์์ฑ๋์ด ์๋ค๋ฉด, ๊ตณ์ด ์ผํญ์ฐ์ฐ์๋ฅผ ์ฐ์ง ์๊ณ ํค ๊ฐ๋ง ๋ถ๋ฌ์ค๋ฉด ๋๊ฒ ๋ค์.
const buttonStyle = (type) => {
return css`
background: ${colors[type]};
color: #fff;
border: 0 none;
padding: 8px;
margin: 5px;
border-radius: 3px;
`
}
ํจ์ฌ ๋ณด๊ธฐ ์ข์ต๋๋ค. ๐
'๊ฐ๋ฐ ๐พ > ReactJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React][ํ๊ฒฝ์ธํ ] react-router-dom ์ฌ์ฉํ๊ธฐ (0) | 2021.05.25 |
---|---|
[์๋ฌ๋ ธํธ] defaultState for reducer handling [object Object] should be defined (0) | 2021.03.17 |
React Hook ์์ Scroll ์ปจํธ๋กค ํ๊ธฐ! top๋ฒํผ ๊ตฌํ (1) | 2021.02.09 |
๋ชจ๋๊ฐ ์์ฃผ ์ฌ์ฉํ๋ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ๋ฆฌ (0) | 2021.02.06 |
React-datepicker ์ปค์คํ ํ๊ธฐ (2) | 2021.02.02 |