React/Style
React - CSS Modules
고코모옹
2021. 6. 5. 23:21
https://create-react-app.dev/docs/adding-a-css-modules-stylesheet
Adding a CSS Modules Stylesheet | Create React App
Note: this feature is available with react-scripts@2.0.0 and higher.
create-react-app.dev
- CSS Module
- CSS 클래스가 중첩되는 것을 방지
- CSS 파일의 확장자를 .module.css 로 생성
- CSS Module 적용
// App.js
import logo from './logo.svg';
import styles from './App.module.css';
import Button from './components/Button';
function App() {
return (
<div className={styles['App']}>
<header className={styles['header']}>
<img src={logo} className={styles['logo']} alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<Button>Button</Button>
</header>
</div>
);
}
// Button.jsx
import React from 'react';
import styles from './Button.module.css';
const Button = (props) => <button className={styles['button']} {...props} />;
export default Button;
// Button.module.css
.button {
background: transparent;
border-radius: 3px;
border: 2px solid palevioletred;
color: palevioletred;
margin: 0 1em;
padding: 0.25em 1em;
font-size: 20px;
}
- classnames 라이브러리
- 적용해야 할 CSS가 여러개일 경우 번거로움 발생
- classnames 라이브러리 사용
- npm i classnames
.button {
background: transparent;
border-radius: 3px;
border: 2px solid palevioletred;
color: palevioletred;
margin: 0 1em;
padding: 0.25em 1em;
font-size: 20px;
}
.loading {
border: 2px solid grey;
color: grey;
}
import React from 'react';
import styles from './Button.module.css';
import classNames from 'classnames/bind';
const cx = classNames.bind(styles);
class Button extends React.Component {
state = {
loading: false,
};
render() {
const { loading } = this.state;
return (
<button
onClick={this.startLoading}
className={cx('button', { loading })}
{...this.props}
/>
);
}
startLoading = () => {
this.setState({
loading: true,
});
setTimeout(() => {
this.setState({ loading: false });
}, 1000);
};
}
export default Button;