useState
임포트하여 사용use
로 시작하는 함수를 훅(Hook)
이라고 함useState
: React에서 제공하는 빌트인 훅자바스크립트 네이티브 모듈을 기반으로 한 데브 서버
웹팩보다 빠르게 개발, 배포 가능
프레임워크에 구애받지 X : @stitches/core
styled API를 포함한 React wrapper : @stitches/react
https://stitches.dev/docs/introduction#key-features
Variants https://stitches.dev/docs/variants
Toekns
Theming
Utils
Responsive Variants
Overrides
Developer Experience
https://stitches.dev/docs/typescript
단점
CSS의 단점을 해결하기 위해 CSS-in-CSS 방식의 CSS Modules 와 CSS-in-JS 방식을 사용한다.
pure CSS와 마찬가지로 전체 페이지에 필요한 CSS를 처음부터 전부 로딩하여 style 태그를 생성함
장점
단점
CSS 모듈
: CSS Module을 사용하면 CSS 파일에 선언한 클래스 이름들이 모두 고유해지기 때문에 Global namespace 문제를 해결할 수 있다.
CSS 전처리기(Preprocessor)
: Saas, Less, Stylus
css 프레임워크
: tailwind, bootstrap 등
styled components
라고 이야기 함컴포넌트 위주의 프레임워크
CSS-in-CSS : 사용하지 않는 CSS 스타일 요소까지 로딩하기 때문에 비효율적이다.
CSS-in-JS : 필요한 컴포넌트 페이지의 CSS 스타일 요소만 로딩한다.
인터렉티브한 웹 사이트
CSS-in-CSS : 랜더링할 때 모든 CSS 스타일 요소를 로딩하기 때문에 컴포넌트 상태가 변하더라도 바로 적용이 가능하다.
CSS-in-JS : 상태 변경으로 인한 랜더링 때마다 JS 파일 내의 CSS 코드를 로딩 (파싱 등)해야하기 때문에 성능이 떨어질 수 있다. (컴포넌트 내 인터렉티브한 변화는 다를 수 있다)
콘텐츠가 많은 웹 사이트
콘텐츠가 많은 웹사이트의 경우 초기 랜더링 시간이 길어져버리면 유저가 불편함을 느낀다.
CSS-in-JS를 사용할 경우 라이브러리를 설치해야하기 때문에 번들링 크기가 커져 초기 구동 속도가 늦어질 수 있다.
이를 해결하기 위해 html이 먼저 렌더링 되는 서버사이드 랜더링을 사용한다고 해도 SSR를 위한 라이브러리를 설치해야하기 때문에 잘 고려해야한다.
서버사이드 렌더링인 nextjs는 9.3버전 부터 CSS Modules 를 권장한다.
https://legacy.reactjs.org/docs/faq-styling.html
React에서는 명확한 스타일링 가이드를 제공하지 않음, 의심이 되면 className 선언으로 스타일링 시작
https://www.geeksforgeeks.org/8-ways-to-style-react-components/
https://www.daleseo.com/react-styling/
인라인 스타일링에서는 기본적으로 스타일의 객체를 만듭니다. 그리고 React 기법을 사용하여 JSX 내부에 JavaScript 변수를 통합하는 스타일 속성의 구성요소 내부에 렌더링합니다('{ }' 사용)
// ex1
import React, { Component } from 'react'
class StudentList extends Component{
render(){
const {name, classNo, roll, addr} = this.props
const ulStyle = {border: '2px solid green', width:'40%', listStyleType:'none'}
const liStyle = {color : 'blue', fontSize:'23px'}
return(
<ul style={ulStyle}>
<li style={liStyle}>Name : {name}</li>
<li style={liStyle}>Class: {classNo}</li>
<li style={liStyle}>Roll: {roll}</li>
<li style={liStyle}>Address : {addr}</li>
</ul>
)
}
}
export default StudentList
// ex2
import React,{ Component } from 'react'
import Ball from './Ball'
class Lottery extends Component{
static defaultProps = {
title : 'lotto',
numbers : [1,2,3,4,5,6]
}
render(){
const lotteryStyle={
border: '2px solid grey',
borderRadius: '10px',
width:'40em',
textAlign:'center',
margin: '1em auto auto',
padding: '1em 0 2em 0'
}
return(
<div style={lotteryStyle}>
<h3>{this.props.title}</h3>
<div>
{this.props.numbers.map(n => (
<Ball num={n} />
))}
</div>
</div>
)
}
}
export default Lottery
각 구성 요소에 대한 외부 CSS 파일을 생성하고 필요한 클래스 스타일링
.StudentList{
border: 2px solid green;
width: 40%:
list-style-type: none;
}
.StudentList-details{
color: blue;
font-size: 23px;
}
import React, { Component } from 'react'
class StudentList extends Component{
render(){
const {name, classNo, roll, addr} = this.props
return(
<ul className='StudentList'>
<li className='StudentList-details'>Name : {name}</li>
<li className='StudentList-details'>Class: {classNo}</li>
<li className='StudentList-details'>Roll: {roll}</li>
<li className='StudentList-details'>Address : {addr}</li>
</ul>
)
}
}
export default StudentList
CSS 모듈은 단순한 CSS 파일이지만 기본적으로 모든 클래스 이름을 가져올 때마다 CSS 모듈 내부의 애니메이션이 로컬로 범위가 지정되며 CSS 파일 이름은 'filename.module.css' 형식을 따라야 합니다. 이를 통해 응용 프로그램의 다른 클래스 이름과 충돌할 염려 없이 CSS 클래스에 유효한 이름을 사용할 수 있습니다.
.list{
border: 2px solid green;
width: 40%:
list-style-type: none;
}
.details{
color: blue;
font-size: 23px;
}
import React, { Component } from 'react'
import style from './StudentList.module.css'
const StudentList = (props) => {
const {name, classNo, roll, addr} = props
return(
<ul className={style.list}>
<li className={style.details}>Name : {name}</li>
<li className={style.details}>Class: {classNo}</li>
<li className={style.details}>Roll: {roll}</li>
<li className={style.details}>Address : {addr}</li>
</ul>
)
}
export default StudentList
import React, { Component } from 'react'
import {createUseStyles} from 'react-jss'
const styles = createUseStyles({
student : {
border : '2px solid green',
width: '40%',
listStyleType:'none'
},
studentDetails : {
color : 'blue',
fontSize : '23px'
}
})
const StudentList = (props) => {
const classes = styles()
const {name, classNo, roll, addr} = props
return(
<ul className={classes.student}>
<li className={classes.studentDetails}>Name : {name}</li>
<li className={classes.studentDetails}>Class: {classNo}</li>
<li className={classes.studentDetails}>Roll: {roll}</li>
<li className={classes.studentDetails}>Address : {addr}</li>
</ul>
)
}
export default StudentList
스타일화된 구성 요소를 사용하면 JavaScript에서 생성된 변수 아래에서 CSS를 스타일화할 수 있습니다. style components는 이미 CSS 코드로 스타일이 지정되어 있고 주 구성 요소에 해당 스타일 구성 요소를 사용하는 JavaScript 변수로 구성 요소를 만들 수 있는 타사 패키지입니다. 스타일리시한 구성요소를 사용하면 유지 관리가 더 번거로울 수 있는 맞춤형 재사용 가능한 구성요소를 만들 수 있습니다.
import React, { Component } from 'react'
import styled from 'styled-components'
//styled component Li
const Li = styled.li`
color : blue;
font-size : 23px
`
//Styled component Ul
const Ul = styled.ul`
border : 2px solid green;
width: 40%;
list-style-type:none
`
const StudentList = (props) => {
const {name, classNo, roll, addr} = props
return(
<Ul>
<Li>Name : {name}</Li>
<Li>Class: {classNo}</Li>
<Li>Roll: {roll}</Li>
<Li>Address : {addr}</Li>
</Ul>
)
}
export default StudentList
&blue-shade: #264BC4;
&pale-green-color: #3CC27F;
.list{
border: 2px solid &pale-green-color;
width: 40%:
list-style-type: none;
}
.details{
color: &blue-shade;
font-size: 23px;
}
import React, { Component } from 'react'
import './StudentList.scss'
const StudentList = (props) => {
const {name, classNo, roll, addr} = props
return(
<ul className='list'>
<li className='details'>Name : {name}</li>
<li className='details'>Class: {classNo}</li>
<li className='details'>Roll: {roll}</li>
<li className='details'>Address : {addr}</li>
</ul>
)
}
export default StudentList
=> UI library는 5번 방향성 ?
https://npmtrends.com/@stitches/react-vs-emotion-vs-jss-vs-styled-components
Styled Components
Emotion
JSS
stitches
Radium