리액트는 가상의 돔 트리를 사용해서, 이전 상태와 이후 상태를 비교하여, 바뀐 부분을 찾아내서 자동으로 바꾼다.(Virtual DOM)
출처 : 생활코딩 - WEB - React
src폴더 > index.js(react project가 시작하는 코드) > .render() : main함수 > App(애플리케이션 컴포넌트의 시작) > Id('root') : root라는 아이디의 DOM
public(static한 파일을 serve)폴더 > index.html > div id="root"
import App.js > export default App > App이라는 이름의 컴포넌트로 return
속성값(props)을 이용해서 출력 가능 - 표현식사용 {}
정보가 여러개일 경우 배열로 생성 (반복문 작성 시 키값 필요!!)
event.preventDefault(); : a태그의 기본 동작을 방지
event.target : event를 유발시킨 태그를 의미(a태그)
import './App.css';
function Nav(props) {
const lis = []
for (let i = 0; i < props.topics.length; i++) {
let t = props.topics[i];
lis.push(
<li key={t.id}>
<a
id={t.id}
href={'/read/' + t.id}
onClick={event => {
event.preventDefault();
props.onChangeMode(event.target.id);
}}>{t.title}</a>
</li>
)
}
return <nav>
<ol>
{lis}
</ol>
</nav>
}
function Article(props) {
return <article>
<h2>{props.title}</h2>
{props.body}
</article>
}
function Header(props) {
console.log('props', props, props.title);
return <header>
<h1>
<a
href='/'
onClick={(event) => {
event.preventDefault();
props.onChangeMode();
}}>{props.title}</a>
</h1>
</header>
}
function App() {
const topics = [
{
id: 1,
title: 'html',
body: 'html is ...'
}, {
id: 2,
title: 'css',
body: 'css is ...'
}, {
id: 3,
title: 'javascript',
body: 'javascript is ...'
}
]
return (
<div>
<Header
title="WEB"
onChangeMode={() => {
alert('Header');
}}></Header>
<Nav
topics={topics}
onChangeMode={(id) => {
alert(id);
}}></Nav>
<Article title="Welcome" body="Hello, WEB"></Article>
</div>
);
}
export default App;
import {useState} from 'react';
const _mode = useState("WELCOME"); //초기값
const mode = _mode[0];
const setMode = _mode[1];
const[mode, setMode] = useState('WELCOME')
props.onChangeMode(Number(event.target.id));
import './App.css';
import {useState} from 'react';
function Nav(props) {
const lis = []
for (let i = 0; i < props.topics.length; i++) {
let t = props.topics[i];
lis.push(
<li key={t.id}>
<a id={t.id}
href={'/read/' + t.id}
onClick={event => {
event.preventDefault();
props.onChangeMode(Number(event.target.id));
}}>{t.title}</a>
</li>
)
}
return <nav>
<ol>
{lis}
</ol>
</nav>
}
function Article(props) {
return <article>
<h2>{props.title}</h2>
{props.body}
</article>
}
function Header(props) {
return <header>
<h1>
<a
href='/'
onClick={(event) => {
event.preventDefault();
props.onChangeMode();
}}>{props.title}</a>
</h1>
</header>
}
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);
}}></Nav>
{content}
</div>
);
}
export default App;