버글버글

[React] mui DataGrid를 통한 API 호출 CRUD (2) Create 본문

React/react 공부기록

[React] mui DataGrid를 통한 API 호출 CRUD (2) Create

Bugle 2023. 4. 26. 12:00
반응형

 

상품등록(Create)

 

1. 상품명. 카테고리등 입력을 위한 TextField import

import TextField from '@mui/material/TextField';

2. useState Hook을 이용한 state 변수 선언하기

 - 이 변수들은 각각의 input element와 바인딩 되어 있으며,
 - 사용자가 input element에 값을 입력하면 해당 state 변수의 값을 변경하게 된다.

const [itemCd, setItemCd] = useState('');
const [itemNm, setItemNm] = useState('');
const [catCd, setCatCd] = useState('');
const [catNm, setCatNm] = useState('');

3. 입력을 위한 TextField

 - value : 현재 입력값을 나타내는 상태 변수

 - onChange : 입력값이 변경될 때마다 호출되는 함수로, 새로운 값을 state 변수에 저장하는 역할이며,

e.target.value를 통해 입력값을 가져옴

  <span>품목코드</span>
  <TextField type="text" value={itemCd} onChange={(e) => setItemCd(e.target.value)} />

  <span>품명</span>
  <TextField type="text" value={itemNm} onChange={(e) => setItemNm(e.target.value)} />

  <span>카테고리</span>
  <TextField type="text" value={catCd} onChange={(e) => setCatCd(e.target.value)} />

  <span>카테고리 번호</span>
  <TextField type="text" value={catNm} onChange={(e) => setCatNm(e.target.value)} />

 

4. 등록을 위한 Button

 - 버튼클릭시 실행되는 handleJoin

<Button onClick={handleJoin}>등록</Button>

 

5. Button의 handleJoin 함수

 - axios.post를 사용하여 'API url'의 엔드포인트로 POST 요청을 보낸다.
 - itemCd, itemNm, catCd, catNm 값을 요청 바디에 담아서 보낸다.

  const handleJoin = () => {
    if(itemCd === "" || itemNm === "") {
      alert("품목코드와 품명은 필수입력 사항입니다.");
    } else {
      axios.post('API url', {
        itemCd: itemCd,
        itemNm: itemNm,
        catCd: catCd,
        catNm: catNm,
      })
      .then(() => {
        alert("상품등록이 완료되었습니다.");
        window.location.reload();
      })
      .catch(() => {
        alert("상품등록에 실패하였습니다.");
      })
    }
  }

 

 

최종 코드
import React, { useState } from 'react';
import axios from 'axios';
import Button from '@mui/material/Button';
import { DataGrid } from '@mui/x-data-grid';
import TextField from '@mui/material/TextField';

function Crud() {

  // 1. useState
  const [rows, setRows] = useState([]);
  const [itemCd, setItemCd] = useState('');
  const [itemNm, setItemNm] = useState('');
  const [catCd, setCatCd] = useState('');
  const [catNm, setCatNm] = useState('');
  
  
  // 2-1. 상품 조회
  const columns = [
    { field: 'id', headerName: '순번', width: 100 },
    { field: 'itemCd', headerName: '품목 코드', width: 150 },
    { field: 'itemNm', headerName: '품명', width: 250 },
    { field: 'catCd', headerName: '카테고리', width: 200 },
    { field: 'catNm', headerName: '카테고리 번호', width: 180 },
    { field: 'cdt', headerName: '제조일', width: 200 },
  ];
  
  // 2-2. 상품조회 Button
  const handleView = () => {
    axios.post('API url', {
      itemCd: "",
      itemNm: "",
      catCd: "",  
      catNm: "",
    })
    .then((response) => {
      const array = response.data.data.map((item, index) => ({
        // id: index + 1,
        id: item.id,
        itemCd: item.itemCd,
        itemNm: item.itemNm,
        catCd: item.catCd,
        catNm: item.catNm,
        cdt: item.cdt,
      }));
      setRows(array);
    })
    .catch((error) => {
      console.log(error);
    });
  }
  
  // 3. 상품 등록
  const handleJoin = () => {
    if(itemCd === "" || itemNm === "") {
      alert("품목코드와 품명은 필수입력 사항입니다.");
    } else {
      axios.post('API url', {
        itemCd: itemCd,
        itemNm: itemNm,
        catCd: catCd,
        catNm: catNm,
      })
      .then(() => {
        alert("상품등록이 완료되었습니다.");
        window.location.reload();
      })
      .catch(() => {
        alert("상품등록에 실패하였습니다.");
      })
    }
  }
  

  return (
  
    <div>

      <span>품목코드</span>
      <UploadTextField
        type="text"
        value={itemCd}
        onChange={(e) => setItemCd(e.target.value)}
        size="small"
      />

      <span>품명</span>
      <UploadTextField
        type="text"
        value={itemNm}
        onChange={(e) => setItemNm(e.target.value)}
        size="small"
      />

      <span>카테고리</span>
      <UploadTextField
        type="text"
        value={catCd}
        onChange={(e) => setCatCd(e.target.value)}
        size="small"
      />

      <span>카테고리 번호</span>
      <UploadTextField
        type="text"
        value={catNm}
        onChange={(e) => setCatNm(e.target.value)}
        size="small"
      />

      <Button
        onClick={handleJoin}
      >등록
      </Button>

      <Button
        onClick={handleView}
      >조회
      </Button>


  <div style={{ height: 600, width: '100%' }}>
    <DataGrid
      rows={rows}
      columns={columns}
      pageSize={5}
      rowsPerPageOptions={[5]}
      checkboxSelection
    />
  </div>



    );
}

export default Crud;

 

 

반응형