CSS-in-JS
emotion.js를 사용하여 styling 적용
@emotion/styled를 통해 styled-components와 동일한 기능을 제공 하고, @emotion/core를 통해 확장성을 갖춤
/** @jsx jsx */
를 입력해 준다// this comment tells babel to convert jsx to calls to a function called jsx instead of React.createElement
/** @jsx jsx */
import { css, jsx } from '@emotion/core';
css = {css `css내용`}
의 형태로 입력하면 적용된다.function CakeContainer(props) {
return (
<div>
<h2 css={ css`
border: 1px solid pink;
color: pink;
`}>Number of Cakes - {props.numOfCakes}</h2>
</div>
);
}
npm i @emotion/styled
설치 해야함 import styled from "@emotion/styled"
const PinkButton= styled.button`
color: pink;
`
function CakeContainer(props) {
return (
<div>
<h2 css={ css`
border: 1px solid pink;
color: pink;
`}>Number of Cakes - {props.numOfCakes}</h2>
<PinkButton onClick={props.buyCake}>Buy Cake</PinkButton>
</div>
);
}
{ }
객체형태에 담는 형식 <h2 css={{
border: 1px solid pink;
color: pink;
}}>hello</h2>
<h2 css= {css `
border: 1px solid pink;
color: pink;
`}>hello</h2>
컴포넌트의 props 값으로 css 를 넘겨주어 스타일을 일정하게 관리하고 확장 할 수 있다.
먼저 부모의 컴포넌트에 자식 컴포넌트와 넘겨줄 props를 정해준다.
function Parent() {
return (
<div>
<Child />
<Child small />
<Child
small
css={{border: "1px solid red"}}
onClick={() => console.log('clicked')}
/>
</div>
)
}
function Child(props) {
//부모로 부터 props를 가져오기 위해 parameter에 props 입력
return (
<div
css={{
color: "orange",
fontSize: props.small ? 24 : 36
//props로 small을 가지고 있는 <Child small/>이라면 폰트를 24로 그게 아니라
//<Child />라면 36으로 적용해준다.
}}
{...props}
//spread operater를 통해 부모의 props 값을 자식에게 전달해주는 의미,
//즉 css, onClick 같은 이벤트가 전달 되는 것이다.
>
Hello World!
</div>
)
}
import {css, jsx} from @emotion/core
const red = css`
color: red;
`;
const yellowBase = css`
color: yellow;
background-color: black;
`;
return (
<div>
<h1 css={yellowBase}>이건 노란색</h1>
<h1 css={[red, yellowBase]}>이것도 노란색</h1>
<h1 css={[yellowBase, red]}>이건 빨간색</h1>
const red = css`
color: red;
p {
border-bottom: 1px solid red;
}
`;
const yellowBase = css`
color: yellow;
background-color: black;
`;
return (
<div>
<h1 css={red}>
<p>나는 nesting 된 p </p>
</h1>
<p>나는 그냥 p</p>
import { Global, css, jsx } from '@emotion/core';
return (
<div>
<Global styles = {css ` * {box-sizing : border-box; }`}/>