🔹 Create, Update와 다르게 클릭 시 바로 삭제되기 때문에 링크가 아닌 버튼으로 생성한다.
🔹 새로운 배열을 생성하고 현재 클릭한 id 값을 제외한 나머지 데이터들을 새 배열에 push한다.
( 컴포넌트는 항상 최상단 태그로 묶여야돼서 빈 태그를 감싸준다 )
contextControl = <>
<li>
<a href={'/update/'+id} onClick={event => {
event.preventDefault();
setMode('UPDATE');
}}>Update</a>
</li>
<li>
<input type='button' value='Delete' onClick={() => {
const newTopics = []
for (let i = 0; i < topics.length; i++) {
if (topics[i].id !== id) {
newTopics.push(topics[i]);
}
}
setTopics(newTopics)
}}/>
</li>
</>
그럼 이렇게 바로 삭제가 된다 ! 👏
🔸 그리고 데이터를 삭제했으니 setMode('WELCOME')을 사용해서 메인화면을 뿌려준다.
setTopics(newTopics);
setMode('WELCOME');
휴 delete는 그나마 쉽다 다행이다
끗 - 😎
// import './App.css';
import {useState} from 'react';
function Header(props) {
return (
<header>
<h1>
<a href="/" onClick={(event) => {
event.preventDefault();
props.onChangeMode();
}}>{props.title}</a>
</h1>
</header>
);
}
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 Create(props) {
return (
<article>
<h2>Create</h2>
<form onSubmit={event => {
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onCreate(title, body);
}}>
<p><input type='text' name='title' placeholder='title'/></p>
<p><textarea name='body' placeholder='body'></textarea></p>
<p><input type='submit' value='Create'/></p>
</form>
</article>
)
}
function Update (props) {
const [title, setTitle] = useState(props.title);
const [body, setBody] = useState(props.body);
return (
<article>
<h2>Update</h2>
<form onSubmit={event => {
event.preventDefault();
const title = event.target.title.value;
const body = event.target.body.value;
props.onUpdate(title, body);
}}>
<p><input type='text' name='title' placeholder='title' value={title} onChange={event => {
setTitle(event.target.value);
}}/></p>
<p><textarea name='body' placeholder='body' value={body} onChange={event => {
setBody(event.target.value);
}}></textarea></p>
<p><input type='submit' value='Update'/></p>
</form>
</article>
)
}
function App() {
const [mode, setMode] = useState('WELCOME');
const [id, setId] = useState(null);
const [nextId, setNextId] = useState(4);
const [topics, setTopics] = useState([
{id: 1, title: 'html', body: 'html is ...'},
{id: 2, title: 'css', body: 'css is ...'},
{id: 3, title: 'javascript', body: 'javascript is ...'},
])
let content = null;
let contextControl = 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>
contextControl = <>
<li>
<a href={'/update/'+id} onClick={event => {
event.preventDefault();
setMode('UPDATE');
}}>Update</a>
</li>
<li>
<input type='button' value='Delete' onClick={() => {
const newTopics = []
for (let i = 0; i < topics.length; i++) {
if (topics[i].id !== id) {
newTopics.push(topics[i]);
}
}
setTopics(newTopics);
setMode('WELCOME');
}}/>
</li>
</>
} else if (mode === 'CREATE') {
content = <Create onCreate={(_title, _body) => {
const newTopic = {id: nextId, title: _title, body: _body}
const newTopics = [...topics]
newTopics.push(newTopic);
setTopics(newTopics);
setMode('READ');
setId(nextId);
setNextId(nextId+1);
}}></Create>
} else if (mode === 'UPDATE') {
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 = <Update title={title} body={body} onUpdate={(title, body) => {
const newTopics = [...topics]
const updatedTopic = {id: id, title: title, body: body}
for(let i = 0; i<newTopics.length; i++) {
if (newTopics[i].id === id) {
newTopics[i] = updatedTopic;
break;
}
}
setTopics(newTopics);
setMode('READ');
}}></Update>
}
return (
<div className="App">
<Header title='WEB' onChangeMode={() => {
setMode('WELCOME');
}}></Header>
<Nav topics={topics} onChangeMode={(_id) => {
setMode('READ');
setId(_id);
}}></Nav>
{content}
<ul>
<li>
<a href='/create' onClick={event => {
event.preventDefault();
setMode('CREATE');
}}>Create</a>
</li>
{contextControl}
</ul>
</div>
);
}
export default App;