본문 바로가기

FRAME WORK/REACT

React ) state

props는 하위컴퍼넌트로 값을 전달하는 방법, state는 한 컴퍼넌트안에서 값을 전달하는방법

 

app내에 변수값은 최초 콜 시에만 인지하고 변경된 값은 인지하지못한다.

그래서 변화되는 값을 추적하기위해 useState를 사용한다.

useState는 배열을 리턴하는데 0번째 데이터는 값, 1번째 데이터는 값을 변경하는 함수를 가진다.

보통 함수는 변수명, set어쩌고 로 받는다.

 

 

 

 

 

위의 코드에서 기존의 topics를 복제하여 복제된 변수에 새로운 객체를 추가하고 그 객체를 setTopics로 변경해주었는데 그렇게해야 변경이된다. topics는읽기속성이기 때문에 읽기속성에 puch를 때려봤자이기도하고 useState의 경우 원래 값과 변경함수를 사용하여 변경한 값이 같으면 다시 로드를 안하기 때문이다.

import { useState } from 'react';
import './App.css';
function Header(props){
  return <header>
    <h1><a href='/' onClick={event=>{
      event.preventDefault();
      props.onChangeMode();
    }}>{props.title}</a></h1>
  </header>
}
function Nav(props){
  //console.log(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){
  console.log(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'></input></p>
      <p><textarea name="body" placeholder='body'></textarea></p>
      <p><input type='submit' value='Create'></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 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)
      if(topics[i].id === id){
        title = topics[i].title;
        body = topics[i].body;
      }
    }
    content =  <Article title={title} body={body}></Article>
  } 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>
  }
  return (
    <div>
      <Header title="WEB" onChangeMode={()=>{
        setMode("WELCOME");
      }}></Header>
      <Nav topics={topics} onChangeMode={(_id)=>{
        setMode("READ");
        setId(_id);
      }}></Nav>
      {content}
      <a href='/create' onClick={(event)=>{
        event.preventDefault();
        setMode("CREATE");
      }}>CREATE</a>
    </div>
  );
}

export default App;
반응형

'FRAME WORK > REACT' 카테고리의 다른 글

React ) 리액트로 사업자번호 유효검사  (2) 2024.09.25
React ) 컴퍼넌트  (0) 2024.09.20
React ) 수정하기 기초  (1) 2024.09.20
React ) 리액트 설치  (0) 2024.09.20