Prop
: 컴포넌트를 사용하는 외부자
를 위한 데이터State
: 컴포넌트를 만드는 내부자
를 위한 데이터Header
클릭하면 welcom 페이지 나오게Nav
클릭하면 Read 페이지 나오게function App() {
const mode = 'WELCOME'; // mode 변수
const topics = [
{id: 1, title: 'HTML', body: 'HTML is ...'},
{id: 2, title: 'CSS', body: 'CSS is ...'},
{id: 3, title: 'JavaScript', body: 'JavaScript is ...'},
]
let content = null; // content 변수
if (mode === 'WELCOME') { // 📍 mode의 값이 'WELCOME' 일 때
content = <Article title="Welcome" body="Hello, WEB"></Article>
} else if (mode === 'READ') { // 📍 mode의 값이 'READ' 일 때
content = <Article title="Read" body="Hello, Read"></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={() => {
mode = 'WELCOME';
}}></Header>
<Nav topics={topics} onChangeMode={(id) => {
mode = 'READ';
}}></Nav>
{content} // content 변수 출력
</div>
);
}
mode의 값을 READ
로 바꿨지만 APP 함수
는 다시 실행되지 않아 return 값이 변하지 않기 때문
mode
값이 바뀌면 컴포넌트 함수가 새로 실행
되면서 새로운 리턴값
이 만들어지고 UI 에 반영하려면 → state
사용 useState
라는 Hook을 사용 : 리액트에서 기본적으로 제공하는 함수 // 📍 useState Hook
import {useState} from 'react';
function App() {
// const _mode = useState('WELCOME');
// const mode = _mode[0];
// const setMode = _mode[1];
→ const [mode, setMode] = useState('WELCOME');
const topics = [
{id: 1, title: 'HTML', body: 'HTML is ...'},
{id: 2, title: 'CSS', body: 'CSS is ...'},
{id: 3, title: 'JavaScript', body: 'JavaScript is ...'},
]
let content = null;
if (mode === 'WELCOME') {
content = <Article title="Welcome" body="Hello, WEB"></Article>
} else if (mode === 'READ') {
content = <Article title="Read" body="Hello, Read"></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={() => {
setMode = 'WELCOME'; // 📍 값을 바꿀때 setMode 사용
}}></Header>
<Nav topics={topics} onChangeMode={(id) => {
setMode = 'READ'; // 📍 값을 바꿀때 setMode 사용
}}></Nav>
{content} // content 변수 출력
</div>
);
}
import {useState} from 'react';
function App() {
const [mode, setMode] = useState('WELCOME');
const topics = [
{id: 1, title: 'HTML', body: 'HTML is ...'},
{id: 2, title: 'CSS', body: 'CSS is ...'},
{id: 3, title: 'JavaScript', body: 'JavaScript is ...'},
]
let content = null;
if (mode === 'WELCOME') {
content = <Article title="Welcome" body="Hello, WEB"></Article>
} else if (mode === 'READ') {
content = <Article title="Read" body="Hello, Read"></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={() => {
setMode('WELCOME');
}}></Header>
<Nav topics={topics} onChangeMode={(id) => {
setMode('READ');
}}></Nav>
{content}
</div>
);
}
function Nav (props) {
const lis = [];
for (let i = 0; i < props.topics.length; i++) {
let t = props.topics[i];
lis.push(
// 📍 id가 태그의 속성으로 넘기면 문자가 되버림
<li key={t.id}>
<a href={'/read/'+t.id} onClick={(event) => {
event.preventDefault();
// 📍숫자로 컨버팅 Number 함수 사용
props.onChangeMode(Number(t.id));
}}>{t.title}</a>
</li>
)
}
return (
<nav>
<ol>
{lis}
</ol>
</nav>
)
}
function App() {
const [mode, setMode] = useState('WELCOME');
const [id, setId] = useState(null); // 초기값 없음
const topics = [
{id: 1, title: 'HTML', body: 'HTML is ...'},
{id: 2, title: 'CSS', body: 'CSS is ...'},
{id: 3, title: 'JavaScript', body: 'JavaScript is ...'},
]
let content = null;
if (mode === 'WELCOME') {
content = <Article title="Welcome" body="Hello, WEB"></Article>
} else if (mode === 'READ') {
let title, body = null; // 📍 초기값 없음
for (let i = 0; i < topics.length; i++) {
if (topics[i].id === id) {
title = topics[i].title;
body = topics[i].body;
}
}
content = <Article title={title} body={body}></Article>
}
return (
<div>
<Header title="WEB" onChangeMode={() => {
setMode('WELCOME');
}}></Header>
<Nav topics={topics} onChangeMode={(_id) => {
setMode('READ');
setId(_id); // 📍 setId 값 셋팅
}}></Nav>
{content}
</div>
);
}
✦ 출처 : 생활코딩 [React 2022년 개정판]