저장을 습관화

React - 입문 기록 7 본문

공부/React

React - 입문 기록 7

ctrs 2023. 10. 24. 21:35

React로 CRUD를 구성해보자

 

지금까지 컴포넌트, 프롭, 스테이트로 Read는 충족하였다.

 

다음은 Create를 적용해보자

사용자가 제목과 내용을 입력하면 HTML, CSS, JaavScript 밑으로 목록이 추가되는 것이 목표이다.

 

우선 Create 컴포넌트를 준비한다.

// ..
const Create = () => {
  return (
    <article>
      <h2>Create</h2>
    </article>
  );
};

function App() {
  if (mode === "WELCOME") {
    // ..
  } else if (mode === "CREATE") {
    content = <Create></Create>;
  }
  return (
    // ..
      {content}
      <br></br>
      <a
        href="/create"
        onClick={(event) => {
          event.preventDefault();
          setMode("CREATE");
        }}
      >
        Create
      </a>
  )
}

 

화면 하단에 Create 텍스트가 생겼다.

해당 텍스트를 클릭하면 content의 내용이 바뀌게 하였다.

이 빈 공간에 입력할 입력창과 확인 버튼을 만들고,

사용자가 입력한 내용이 서버에 저장되도록(지금은 DB 연결을 하지 않았으니 메모리에 저장되겠지만)

HTML의 form 태그를 사용한다.

 

// ..
const Create = () => {
  return (
    <article>
      <h2>Create</h2>
      <form
        onSubmit={(event) => {
          event.preventDefault();
        }}
      >
        <p>
          <input type="text" name="title" placeholder="title" />
        </p>
        <p>
          <textarea name="body" placeholder="body" />
        </p>
        <p>
          <input type="submit" value="Create" />
        </p>
      </form>
    </article>
  );
};

function App() {
  // ..
  let content = null;
  if (mode === "WELCOME") {
    // ..
  } else if (mode === "CREATE") {
    content = (
      <Create></Create>
    );
  }
  return (
    <div>
      // ..
      {content}
      <a
        href="/create"
        onClick={(event) => {
          event.preventDefault();
          setMode("CREATE");
        }}
      >
        Create
      </a>
    </div>
  );
}
// ..

페이지 구성 완료

 

 

내용 추가

// ..
const 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" />
        </p>
        <p>
          <input type="submit" value="Create" />
        </p>
      </form>
    </article>
  );
};

function App() {
  // ..
  if (mode === "WELCOME") {
  // ..
  } else if (mode === "CREATE") {
    content = (
      <Create
        onCreate={(title, body) => {
          //
        }}
      ></Create>
    );
  }
  return (
    <div>
      <a
        href="/create"
        onClick={(event) => {
          event.preventDefault();
          setMode("CREATE");
        }}
      >
        Create
      </a>
    </div>
  );
}

 

title과 body에 내용을 입력한 후 Create 버튼을 클릭하면,

onClick에 의해 mode가 CREATE로 변경되고,

컴포넌트 Create가 실행된다. 

속성 onCreate에 의해 컴포넌트의 원본 함수의 프롭이 실행되고

form 태그에 onSubmit 이벤트가 발생했을때

name이 title인 태그와 body인 태그의 값(사용자가 입력한 값)을 받아온다.

 

이 값을 컴포넌트 Create의 사용자에게 공급하도록 하여

프롭의 함수 onCreate에 인자로써 전달한다.

 

 

컴포넌트 Create의 사용자가 함수 onCreate를 실행시키기 전에

배열 topics의 내용이 늘어나고 줄어들 수 있게끔 상태(state)로 만든다.

 

 

내용 추가

새로 추가될 항목의 ID가 될 nextId,

항목 추가 후 그 다음 추가될 항목의 기본 ID를 지정할 setNextId 선언

 

아래 내용 추가

위에서부터.. 

const newTopic = { id: nextId, title: title, body: body };

객체 newTopic 선언

id는 위에서 선언한 nextId, title과 body는 사용자가 입력한 title, body의 값

 

const newTopics = [...topics];

배열 newTopics 선언

기존 배열 topics을 전개연산자로 열고, 배열로 다시 선언한다.

이는 배열 topics을 복사하여 새로운 배열 newTopics로 만든다는 의미이다.

 

이 과정이 없이 간단히 const newTopics = topics라고 적는다면

이는 복사가아닌 배열 topics에 대한 새로운 참조 newTopics를 만든다는 의미가 되어버린다.

 

두 배열명이 하나의 배열을 바라보게 되므로

이후 배열 newTopics에 대한 작업이 배열 topics에저 적용되는 오류가 발생한다.

 

newTopics.push(newTopic);

새로 만든 객체(사용자 입력값) newTopic을 새로 만든 배열 newTopics에 넣는다.

 

setTopics(newTopics);

state의 새로운 상태를 newTopics로 선언한다.

 

setMode("READ");
setId(nextId);
setNextId(nextId + 1);

mode를 READ로 바꾸고,

id를 방금 등록한 항목의 id로 바꾸고,

 

다음 등록할 항목을 위해 nextId를 1더한다.

 

 

실행

 

한번 더

 

create 완료

'공부 > React' 카테고리의 다른 글

React - 입문 기록 9  (0) 2023.10.25
React - 입문 기록 8  (0) 2023.10.25
React - 입문 기록 6  (0) 2023.10.24
React - 입문 기록 5  (0) 2023.10.23
React - 입문 기록 4  (0) 2023.10.23