1️⃣ && 활용
const ResultCard = ({data}) => { return ( data && <Component1/> ) }
2️⃣ 삼항 연산자 : 조건이 true이면 첫번째, 조건이 false이면 두번째를 보여준다.
const Test = ({data}) =>{ return ( <div> {data ? <div>Hello</div> : null} </div> ) }
3️⃣ switch : 조건이 여러 개 일때 활용
switch(status){ case "resolved": return <div>Resolved</div> case "rejected": return <div>Rejected</div> default: return <div></div> }
❗️❗️ list를 렌더링 할 때는 반드시 props에 key를 설정해야 한다.
key는 각 요소의 고유값(id, index 등)으로 설정해야 하고, key를 설정하지 않으면 오류 메세지가 뜬다.
❓WHY❓
key가 있어야 배열이 변경되면 바뀌는 부분만 업데이트할 수 있으므로 배열을 효율적으로 렌더링 할 수 있기 때문이다.
// 💛 예시1 : 각 객체별로 고유한 값을 가지는 변수를 키값으로 활용
userData.map((data) =>{
return <Card key = {data.id} props = {data} />;
// 💛 예시2 : index는 고유하므로 index를 키값으로 활용
userData.map((data, index) =>{
return <Card key = {index} props = {data} />;
BEM
: Block Element Modifier
: css className을 정하는 방법론 중 하나이다.
.block__element--modifier
✔️ block : 재사용 가능한 기능적으로 독립적인 컴포넌트
✔️ element : 블록을 구성하는 단위
✔️ modifier : block이나 element의 속성
<예시>
<div className = "card">
<div className = "card__image>
{image
? <img className = "card_image--photo" src = {image}/>
: <img className = "card_image--empty" src = {EmptyImage}/>
}
</div>
</div
위의 예시에서는 card가 block에 해당하고
image, description, button이 element에 해당하며
success와 back이 modifier에 해당한다.
장점 | 단점 |
---|---|
✅ className의 중복방지 ✅ className만으로 마크업 구조 파악 가능 ✅ SASS에서 부모 선택자와 사용하면 편리하다 ✅ 유지 보수에 유리하다 | ✅ className이 길고 복잡해질 수 있다 |
SCSS
: Sassy CSS
: SASS의 기능을 지원하는 CSS의 Superset
: SASS의 문법은 기존 CSS와 다르지만, SCSS는 상당히 유사
: 변수, 연산자, 내장함수, 중첩 등 다양한 기능을 제공한다.
$ npm install -g node-sass
$ node-sass scss/main.scss public/main.css
: node-sass <입력파일경로>[출력파일경로]
$ node-sass --watch scss/main.scss public/main.css`
: --watch옵션으로 파일이 변경되면 자동으로 업데이트된다.
$main-color: #CEA0E3;
body{
background-color: $main-color;
}
p{
$main-color: white;
color: $main-color;
}
body{
width: 900px/300px;
height: 400px + 50px;
}
@import "style.scss";
@import "_style";
.class{
font-size: 24px;
}
p{
@extend .class;
}
@mixin box($color){
background-color : $color;
}
.class{
@include box(red);
}
body{
color : green;
li{
font-size : 2rem;
}
}
BEM | CSS | SCSS |
---|---|---|
1차원인 Flex Layout과 다르게 2차원 레이아웃 시스템이다.
display : grid;
grid-template-columns: 1fr 2fr 3fr;
grid-template-rows: 100px 200px;
repeat(반복횟수, 반복값)
minmax(최소값, 최대값)
repeat(auto-fit, minmax(20%, auto))
grid-column-start: 2;
grid-column-end: 4;
grid-row-start: 1;
grid-row-end: 3;
위와 같이 column방향에서 병합을 시작하는곳과 끝나는곳, row방향에서 병합을 시작하는 곳과 끝나는 곳을 지정할 수 있으나 아래와 같이 병합할 수도 있다.
grid-column: 2/4;
grid-row: 1/3;
: 화면 전환을 도와주는 React의 서드파티 라이브러리
설치 :
npm install --save react-router-dom
기존의 웹 페이지는 <a href="..."></a>
로 페이지를 이동하지만 페이지 전체를 렌더링 해야한다는 단점이 있다.
반면에 SPA에서는 하나의 html파일 (리액트에서 index.html와 같은)로 변화하는 부분만 교체한다. 이때 활용하는 것이 React Router이고, Link로 페이지를 이동한다.
<Link to="/"> Go to home </Link>
<Route path = "/diary" component = {Diary}/>
<BrowserRouter>
<Link to ="/"> Go to home </Link>
<Route path = "/diary" component = {Diary} />
</BrowserRouter>
<Switch>
<Route path = "/" component = {Main}/>
<Route path = "/diary" component = {Diary}/>
<Route component = {PageNotFound}/>
</Switch>
import {withRouter} from 'react-router-dom'
const Test = ({history}) =>{
return (
<div>
<button onClick={()=> history.push('/')}> Click </button>
</div>
);
};
: React에서 DOM요소를 가져올 때 사용한다.
const buttonEl = useRef();
const handleClick= () =>{
buttonEl.current.focus();
}
return (
<div>
<button ref = {buttonEl} onClick = {handleClick}/>
</div>