[React] Update

Seunghee Lee·2022년 12월 3일

WEB

목록 보기
17/20

※ props = 외부 사용자가 내부 사용자에게 전달하는 값

업데이트를 하기 위해선: useState로 바꿔줘야 한다 !

  • state는 내부 사용자가 사용하는 데이터

React에서 onChange vs HTML에서 onChange 의 차이점

  • html: 값이 바뀌고 마우스 포인터가 밖으로 나갈 때 onChange가 호출된다
  • react: 값이 바뀔 때마다 onChange가 호출된다

import {useState} from 'react';
 
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;
      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');
  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 contextControl = null;
  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++){
      console.log(topics[i].id, id);
      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>	// '/update/'+id = url 주소에 id값 표시하기 위함 
  } 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;				// 102~109: 기존에 있던 title, body값을 가져오기 위함
    for(let i=0; i<topics.length; i++){
      console.log(topics[i].id, id);
      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>
      <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;
profile
자라나라 개발개발 ~..₩

0개의 댓글