router-dom, props, state , memo, 상태값 불변 변수
1. SPA 페이지
2. react-router-dom
- BrowserRouter
- Link
- Router
3. useState
- useState
- props
- React.memo
- 불변변수로 관리하기 => 전개 연산자
4. 단일 페이지 어플리케이션(SPA)
1) MPA(멀티 페이지 애플리케이션) 와 SPA 비교
2) SPA가 가능하기 위한 조건
3) react-router-dom
import React from 'react';
import { BrowserRouter, Router, Link } from 'react-router-dom';
...
export default function App() {
return (
<BrowserRouter>
<div>
<Link to="/">홈</Link>
<Link to="/photo">사진</Link>
<Link to="/rooms">방 소개</Link>
<Route exact path="/" component={Home} />
<Route path="/photo" component={Photo} />
<Route path="/rooms" component={Rooms} />
</div>
);
}
export default function Rooms({ match }) {
return (
<div>
...
<Link to={`${match.url}/blueRoom`}>파란 방으로 이동하기</Link>
<Link to={`${match.url}/greenRoom`}>초록 방으로 이동하기</Link>
...
</div>
);
}
5. 컴포넌트의 속성과 상태값
1-1) state 상태값이 없을 때의 문제
import React from 'react';
let color = 'red';
export default function App() {
function onClick() {
color = 'blue';
}
return (
<button style={{ backgroundColor: color }} onClick={onClick}>
좋아요
</button>
)
}
onClick
함수가 실행이 되어도 버튼 색이 파란색으로 변경되지 않는다.color
변수값을 변경은 했지만 리액트가 이 값이 변경됐다는 사실을 모르기 때문이다.1-2) state 상태값이 있다면
import React from 'react';
export default function App() {
const [color, setColor] = useState('red');
function onClick() {
setColor('blue');
}
return (
<button style={{ backgroundColor: color }} onClick={onClick}>
좋아요
</button>
)
}
useState
함수를 호출하면 컴포넌트에 상태값을 추가할 수 있다.useState
의 매개변수인 red
는 상태값의 초기값을 의미한다.useState
는 배열을 반환한다. 배열의 첫 번째 아이템은 상태값이고 두 번째 아이템은 상태값 변경 함수이다.setColor
를 호출해서 상태값인 color
가 변경되면 리액트는 자동으로 ui를 변경해준다.2-1) props
props
: 부모 컴포넌트로부터 전달 받은 속성값.props.{속성명}
을 입력하지 않고 바로 {속성명}
으로 사용할 수 있기 때문에 좀 더 간편하게 작성할 수 있다.import React from 'react';
export default function Title(props) {
return <p>{props.title}</p>
}
// 위의 코드에서 객체의 비구조화 문법을 이용하면 아래와 같이 작성할 수 있다.
// export default function Title({ title }) {
// return <p>{title}</p>
// }
title
이라는 속성값을 내려주고 있다.count
라는 상태값을 기반으로 title
값을 계산하고 있는데 count
값이 변경되면 Counter 컴포넌트는 다시 렌더링이 될거고 Title 컴포넌트도 다시 렌더링 된다. 이 때 새로 생성된 속성값을 받는다.import React, { useState } from 'react';
import Title from './Title';
export default function Counter() {
const [count, setCount] = useState(0);
function onClick() {
setCount(count + 1);
}
return (
<div>
<Title title={`현재 카운트: ${count}`} />
<button onClick={onClick}>증가</button>
</div>
);
}
3) React memo
React.memo
import React from 'react';
function Title({ title }) {
return <p>{title}</p>
}
export default React.memo(Title);
4) 불변 변수로 관리되는 속성값과 상태값
불변 변수: 변수의 값을 바꿀 수 없는 것
속성값
상태값
불변변수로 관리하지 않은 코드
import React, { useState } from 'react';
import Title from './Title';
export default function Counter() {
const [count, setCount] = useState({ value: 0 });
function onClick() {
count.value += 1;
setCount(count);
}
return (
<div>
<Title title={`현재 카운트: ${count.value}`} />
<button onClick={onClick}>증가</button>
</div>
);
}
- 불변변수로 관리한 코드: 전개 연산자 문법에서 객체의 속성 값들을 풀어놓고 변경하고자 하는 값을 덮어 쓰는 방식이다.
import React, { useState } from 'react';
import Title from './Title';
export default function Counter() {
const [count, setCount] = useState({ value: 0 });
function onClick() {
setCount({ ...count, value: count.value + 1 });
}
return (
<div>
<Title title={`현재 카운트: ${count.value}`} />
<button onClick={onClick}>증가</button>
</div>
);
}