728x90
사전준비 4일차
웹개발 종합반, 토이프로젝트1 등이 끝났다.
오늘은 2일차에 못끝냈던 react를 이용해서
CRUD를 구현해보고 입학시험을 준비하였다
---------------------------------------------------------------------- 공부시작 ---------------------------------------------------------------------
1. React CRUD
import './App.css';
import {useState} from 'react'; // useState를 사용하기위한 import
// Components
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 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 Create(props){
return <article>
<h2>CREATE</h2>
<form onSubmit={event=>{
event.preventDefault();
const title = event.target.title.value; // submit의 값을 가져오기
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"></input></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"></input></p>
</form>
</article>
}
function App() {
const [mode, setMode] = useState('WELCOME'); // mode 상태 업데이트
const [id, setId] = useState(null); // list의 순서 상태 업데이트
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;
// mode별 상태 변화
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>
// Read에 update 버튼 추가
contextControl = <li><a href={'/update/'+id} onClick={event=>{
event.preventDefault();
setMode('UPDATE');
}}>Update</a></li>
// delete는 여기서 관리 - newTopics을 아예 비워버리고, 빈 array를 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);
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)=>{
console.log(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>
<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>
{/* 업데이트 버튼은 read될때만 나오게 하기위함 */}
{contextControl}
</ul>
</div>
);
}
export default App;
728x90
'Sparta > 항해99' 카테고리의 다른 글
항해 사전준비 6-7일차 - React.js (0) | 2022.05.05 |
---|---|
항해 사전준비 5일차 - 입학시험/ 웹개발플러스 1/토이프로젝트2 - 나의 작은 여행기 (0) | 2022.05.04 |
항해 사전준비 3일차 - 토이프로젝트 1 - 날씨를 알려줘! (0) | 2022.05.02 |
항해 사전준비 2일차 - 종합반2~5주차,토이프로젝트 기획, React, Redux (0) | 2022.04.30 |
항해 사전준비 1일차 - JS, Python, Ajax, 종합반1주차 정리 (0) | 2022.04.29 |