본문 바로가기
React를 같이 배워보자

React 마지막 간단한 프로젝트 3일차- detail화면

by 멈추지않아 2022. 3. 2.

안녕하세요 마지막 detail을 해보겠습니다.

Detailcontainer.jsx Detail.jsx를 만들어주세요

css는 Buy꺼를 그대로 사용하겠습니다.

pages/detail.jsx

import { useContext, useEffect } from "react";
import { useNavigate, useParams } from "react-router-dom";
import Form from "../Components/Form";
import Detailcontainer from "../container/Detailcontainer";
import store from "../context/store";

export default function Detail() {
  const navigate = useNavigate();
  const value = useContext(store);
  const { id } = useParams();
  useEffect(() => {
    if (value.data.find((p) => p.id == id) == null) navigate("/");
  });
  if (value.data.find((p) => p.id == id) != null) {
    return (
      <div>
        <Detailcontainer />
      </div>
    );
  } else {
    return <Form>오류입니다.</Form>;
  }
}

이부분은 if문을 통해서 data안에 주소의 id값이 없으면 나타낼 정보가 없는 것이므로 자동으로 home화면으로 이동시켜주는 것입니다. return을 고쳐준것은 저렇게안고치면  표시해줄 데이터가 없다라고 하면서 오류가 나게 됩니다.

Detailcontainer.jsx

import React, { useContext, useState } from "react";
import { useNavigate, useParams } from "react-router-dom";
import Detail from "../Components/Detail";
import store from "../context/store";

export default function Detailcontainer() {
  const time = new Date();

  const times = time.getHours() + ":" + time.getMinutes();
  const navigate = useNavigate();
  const value = useContext(store);

  const { id } = useParams();

  const filter = value.data.find((p) => p.id == id);

  const [odeng, setOdeng] = useState(filter.odeng);

  const [gimbab, setGimbab] = useState(filter.gim);
  const [addition, setAddition] = useState(filter.addition);
  const gimminus = () => {
    setGimbab(gimbab - 1);
  };
  const gimplus = () => {
    setGimbab(gimbab + 1);
  };
  const odengminus = () => {
    setOdeng(odeng - 1);
  };
  const odengplus = () => {
    setOdeng(odeng + 1);
  };
  const gimchange = (e) => {
    setGimbab(e.target.value);
  };
  const odengchange = (e) => {
    setOdeng(e.target.value);
  };
  const additionchange = (e) => {
    setAddition(e.target.value);
  };
  const addorder = () => {
    if (gimbab === 0 && odeng === 0) {
      alert("주문을 추가해주세요");
      return;
    }
    if (value.id <= 10000) {
      value.id = value.id + 1;
    } else {
      value.id = 1;
    }

    filter.gim = gimbab;
    filter.odeng = odeng;
    filter.addition = addition;
    filter.date = times;
    alert("변경되었습니다.");
    navigate("/order");
  };

  return (
    <Detail
      value={value}
      odeng={odeng}
      gimbab={gimbab}
      addition={addition}
      gimminus={gimminus}
      gimplus={gimplus}
      odengminus={odengminus}
      odengplus={odengplus}
      gimchange={gimchange}
      odengchange={odengchange}
      additionchange={additionchange}
      addorder={addorder}
    />
  );
}

Menu부분과 큰차이가 없는데 여기서는 value를 다 find를 이용해서 해당 주소에있는 id와 같은 id를 가지고있는 데이터만 가지고 왔습니다. 왜 그렇게 하는지 알아보면 우리가 링크를 해당줄의 id를 detail주소의 id에 저장해주었습니다.

그래서 그 id에 맞는 데이터만 가져와서 꺼내옵니다. 기본값도 id와 연관된 데이터로 변경해주고 작성도

id와 연관된 데이터를 수정하게 되줍니다. 즉 value대신 filter를 사용한다고 보시면 편합니다.

 

그럼 마지막 Component/detail.jsx

import React from "react";
import Form from "./Form";
import style from "./css/Menu.module.css";

export default function Menu({
  gimbab,
  odeng,
  addition,
  gimminus,
  gimplus,
  odengminus,
  odengplus,
  odengchange,
  gimchange,
  additionchange,
  addorder,
  value,
}) {
  return (
    <Form>
      <div className={style.menus}>
        <div className={style.item}>
          <div className={style.imgs}>
            <img
              width={200}
              className={style.img}
              alt="#"
            />
          </div>
          <div className={style.name}>김밥</div>
          <div className={style.price}>2000원</div>
          <div className={style.buttons}>
            <button className={style.minus} onClick={gimminus}>
              -
            </button>
            <input
              type="number"
              onChange={gimchange}
              value={gimbab}
              className={style.menuinput}
            />
            <button className={style.plus} onClick={gimplus}>
              +
            </button>
          </div>
        </div>
        <div className={style.item}>
          <div className={style.imgs}>
            <img
              width={200}
              className={style.img}
              alt="#"
            />
          </div>
          <div className={style.name}>오뎅</div>
          <div className={style.price}>500원</div>
          <div className={style.buttons}>
            <button className={style.minus} onClick={odengminus}>
              -
            </button>

            <input
              type="number"
              onChange={odengchange}
              value={odeng}
              className={style.menuinput}
            />

            <button className={style.plus} onClick={odengplus}>
              +
            </button>
          </div>
        </div>
      </div>
      <div className={style.addition}>
        <h3 className={style.title}>요청 사항</h3>
        <hr className={style.hr}></hr>
        <div className={style.requests}>
          <textarea
            value={addition}
            onChange={additionchange}
            className={style.request}
            placeholder="요청사항을 입력하세요"
          />
        </div>
      </div>

      <div className={style.orders}>
        <button className={style.order} onClick={addorder}>
          주문
        </button>
      </div>
    </Form>
  );
}

이렇게 menu와 똑같이 하면 됩니다 왜냐하면 데이터들을 container에서 다 수정해주었기때문에 이렇게만 수정해주시면 됩니다.

오늘은 매우 간단하게 되었습니다.

다음에는 간단하게 로그인 기능을 만들어서 오겠습니다. ㅎㅎㅎ

또 몇일 걸릴수도 잇으니 다들 조금만 기다려 주세요