import React, { useState, useRef, useEffect } from 'react';
import './Modal.css';

const Modal = () => {
  const dialogRef = useRef();
  const [isOpen, setOpen] = useState(false);

  const handleOpenModal = () => {
    dialogRef.current.showModal();
    setOpen(true);
  };

  const handleCloseModal = () => {
    dialogRef.current.close();
    setOpen(false);
  };

  const handleOverlayClick = (event) => {
    if (event.target === dialogRef.current) {
      handleCloseModal();
    }
  };

  useEffect(() => {
    window.addEventListener('click', handleOverlayClick);
    return () => {
      window.removeEventListener('click', handleOverlayClick);
    };
  }, [isOpen]);

  return (
    <div>
      <button onClick={handleOpenModal}>Open Modal</button>
      <dialog ref={dialogRef} open={isOpen}>
        <button className="close-button" onClick={handleCloseModal}>
          X
        </button>
        <h2>Modal Content</h2>
        <p>This is a modal example using the dialog element tag.</p>
        <button className="next-button" onClick={handleCloseModal}>
          다음으로 이동하기
        </button>
      </dialog>
    </div>
  );
};

export default Modal;
import React, { useState } from "react";
import "./Body.css";

import ItemList from "./ItemList";
import ItemTotal from "./ItemTotal ";
import ItemInput from "./ItemInput";
import Modal from "./Modal";
import Reward from "./Reward";

function Viewer({ number }) {
  return <div>{number % 2 === 0 ? <h3>짝수</h3> : <h3>홀수</h3>}</div>;
}
const Body = () => {
  const [number, setNumber] = useState(1);

  const onIncrease = () => {
    setNumber(number + 1);
  };
  const onDecrease = () => {
    if (number > 1) {
      setNumber(number - 1);
      onChangePrice(number - 1);
    }
  };

  const itemDateArray = [
    {
      name: "비왈츠 로지 보틀",
      price: 33500,
      number: 1,
    },
  ];

  const [items, setItems] = useState(itemDateArray);

  const onChangePrice = (name, newNumber) => {
    console.log("onChangePrice name : " + name + "number : " + number);

    setItems((prevItems) =>
    prevItems.map((item) =>
      item.name === name ? { ...item, number: newNumber } : item
      )
    );
  };

  const onQuantityChange = (event) => {
    const newNumber = parseInt(event.target.value);
    if (!isNaN(newNumber) && newNumber >= 1) {
      setNumber(newNumber);
      onChangePrice("비왈츠 로지 보틀",newNumber);  // 기본적으로 "비왈츠 로지 보틀"에 대해서 처리
    } else {
      setNumber("");
      onChangePrice(0);
    }
  };
  const handleBlur = () => {
    if (!number || isNaN(number) || number < 1) {
      alert("수량을 올바르게 입력해 주세요.");
      setNumber(1);
      onChangePrice("비왈츠 로지 보틀", 1);
    }
  };
  return (
    <div class="body">
      <div class="purchase-title">프로젝트 이름</div>
      <div id="purchaseWrap">
        <div id="purchase-step">
          <div class="container">
            <div class="circle-container">
              <div class="circle_selected circle">
                <div class="word">리워드 선택</div>
              </div>
            </div>

            <div class="circle-container">
              <div class="circle">
                <div class="word">결제 하기</div>
              </div>
            </div>

            <div class="circle-container">
              <div class="circle">
                <div class="word">결제 완료</div>
              </div>
            </div>
          </div>
          <div class="connector"></div>
        </div>
        <h4>리워드 선택</h4>
        <div class="rewardItemPrice">
          <input type="checkbox" name="reward1" value="33,500" />
          <span>33,500</span>
          &nbsp;원
        </div>
        <div class="rewardItemContent">
          <div class="rewardItemTitle">비왈츠 로지 보틀</div>
          <span class="rewardItemMax">최대 구매 가능 수량 500개</span>
          <div class="rewardItemDesciption">
            14%할인 39,000원 - 33,500원
            <br />
            비왈츠 로지 보틀 1병
          </div>
          <div class="rewardDelivery">
            <img src=""></img>
            <span>배송비 3,000원</span>
            <span class="rewardDeliveryDivide"> | </span>
            <span>2023년 09월 중순 리워드 제공 예정</span>
            <ul>
              <li class="rewardItem">
                <div class="rewardCardName">
                  비왈츠 로지 보틀
                  <button type="button" class="rewardCardCancel">
                    x
                  </button>
                </div>
                <div class="rewardCardContent">
                  <div class="ItemQuantityContainer">
                    <button onClick={onDecrease}> - </button>
                    <input
                      type="number"
                      value={number}
                      name="quantity"
                      min="1"
                      onChange={onQuantityChange}
                      onBlur={handleBlur}
                    />
                    <button onClick={onIncrease}> + </button>
                  </div>
                  <p class="rewardCardPrice"></p>
                </div>
              </li>
            </ul>
          </div>
        </div>

        <h2>{number}</h2>
        <Viewer number={number} />

        <Reward />
        <Modal />
        <div class="circle1"></div>
        <div class="dotted-line"></div>

        <ItemInput
        items={items}
        onChangePrice={onChangePrice}
        number={number}
        onQuantityChange={onQuantityChange}
        onIncrease={onIncrease}
        onDecrease={onDecrease}
        onBlur={handleBlur}
      />
        <hr />
        <ItemList items={items} number={number}  />
        <ItemTotal items={items} number={number} />
      </div>
    </div>
  );
};

export default Body;

 

어려웠던 부분

도형 사이를 잇는 점선 구현

input type="text"에 값을 정해놨더니 직접 수정이 안되는 것

질문할 것
1. input type text로 했는데 value값을 {number}로 넣었더니 텍스트 직접 수정 불가능
2. {number}의 값을 number에 대입하고 싶은데 안됨.
3. 수량 Maximum과 Mininum 제한하는 법

4.도형 사이를 잇는 점선 구현

 

Modal을 이용해 팝업창 구현하기

 

터미널에 입력

npm install react-modal

 

=>모달 라이브러리를 사용할 수 있게 되었다.

 

import Modal from 'react-modal';

로 import

Modal이라는 객체는 isOpen을 필수적으로 가지고 있어야한다.

isOpen값은 true/false여야한다.

https://curryyou.tistory.com/533

어려웠던 부분

도형 사이를 잇는 점선 구현

input type="text"에 값을 정해놨더니 직접 수정이 안되는 것

질문할 것
1. input type text로 했는데 value값을 {number}로 넣었더니 텍스트 직접 수정 불가능
2. {number}의 값을 number에 대입하고 싶은데 안됨.
3. 수량 Maximum과 Mininum 제한하는 법

4.도형 사이를 잇는 점선 구현

 

Modal을 이용해 팝업창 구현하기

 

터미널에 입력

npm install react-modal

 

=>모달 라이브러리를 사용할 수 있게 되었다.

 

import Modal from 'react-modal';

로 import

Modal이라는 객체는 isOpen을 필수적으로 가지고 있어야한다.

isOpen값은 true/false여야한다.

https://curryyou.tistory.com/533

최종 후원 금액이 올라감.

https://unho94.tistory.com/242

 

[React] 숫자 증가 애니메이션 만들기 (with. TypeScript)

여러 웹 서비스를 이용하다 보면 숫자를 강조하는 방법 중 하나로 숫자가 빠르게 올라가는 애니메이션을 확인할 수 있습니다. 리액트를 이용하여 어떻게 구현할지에 대해 작성해보도록 하겠습

unho94.tistory.com

 

https://namhandong.tistory.com/93

 

React | number count 기능 구현하기 , onScroll 스크롤에 따라 animation 실행

먼저 react-spring을 사용해서 숫자 Count 애니메이션을 구현할 것이다. react-spring은 React에서 여러 애니메이션을 구현하기 위해 사용하는 애니메이션이며 이를 사용하기 위해서는 npm을 통해 설치해

namhandong.tistory.com

 

수량에 따라 가격 변동

https://velog.io/@frontjsw/React-001-%EB%B2%84%ED%8A%BC-%ED%81%B4%EB%A6%AD%EC%8B%9C-%EC%88%AB%EC%9E%90-%EC%A6%9D%EA%B0%80

 

[React] 001 버튼 클릭시 숫자 증가

[React] 001 버튼 클릭시 숫자 증가

velog.io

https://velog.io/@eunjin/React-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EC%88%98%EB%9F%89-%EB%8D%94%ED%95%98%EA%B8%B0-%EB%B9%BC%EA%B8%B0-%EB%B2%84%ED%8A%BC-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

 

[React] 리액트 수량 더하기, 빼기 버튼 구현하기

리액트로 프로젝트를 진행하던 중, 필터 팝업에서 plus, minus 버튼을 구현하게 되었다. 처음에는 대체 어떻게 접근할지 감이 안 왔는데, 차근차근 접근하다 보니 구현할 만 했다. 다른 기능들이 워

velog.io

 

여러개의 버튼 중 하나만 선택

https://velog.io/@intersoom/React-%EC%97%AC%EB%9F%AC-%EA%B0%9C-%EB%B2%84%ED%8A%BC-%EC%A4%91-%ED%95%98%EB%82%98%EB%A7%8C-%ED%81%B4%EB%A6%AD%ED%95%98%EA%B2%8C-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

[React] 여러 개 버튼 중 하나만 클릭하게 만들기

버튼 클릭 기능 구현

velog.io

가독성을 위한 리워드 선택 옆 창

 

사용여부를 체크해서 
delete를 사용하는 것이 아니라 검색이 안되게 
disave

포인트 만료기간select where해서 기간이 지나면 조회가 안되게


움직이는 파도

https://velog.io/@intersoom/%EC%A1%B8%EC%A0%84%EB%A1%9C%EA%B7%B8-415-React-Canvas-%EB%B0%98%EC%9D%91%ED%98%95-%EC%95%A0%EB%8B%88%EB%A9%94%EC%9D%B4%EC%85%98-Canvas%EB%A1%9C-wave-%ED%8C%8C%EB%8F%99-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

[졸전로그: 4/15] React + Canvas / 반응형 애니메이션 / Canvas로 wave (파동) 만들기

성공적인 졸업 전시를 위하여 ! 🎓

velog.io

 

슬라이드

https://velog.io/@intersoom/React-%EC%8A%AC%EB%9D%BC%EC%9D%B4%EB%93%9C-%EC%87%BC-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0

 

[React] 슬라이드 쇼 구현하기

간단하게 라이브러리 없이 React를 통해서 슬라이드 쇼 구현하기

velog.io

 

https://help.tumblbug.com/hc/ko/articles/900006673363--%ED%9B%84%EC%9B%90-%ED%9B%84%EC%9B%90%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%98%EB%82%98%EC%9A%94-

 

https://cocoder16.tistory.com/37

 

반응형 웹 만드는 법 (ft. 디바이스 종류별 width값)

반응형 웹을 만드는 방법 반응형 웹이란 각 디바이스의 크기와 뷰포트의 크기를 고려하여 어떠한 크기에서도 서비스를 제대로 화면에 보여주는 웹을 말합니다. 반응형 웹은 흑과 백처럼 이분법

cocoder16.tistory.com

 

 

화면에 고정되는 메인메뉴 만들기 - 리액트, 자바스크립트

https://www.walterz.net/2023/03/22/sticky-menu-react-javascript/

 

화면에 고정되는 메인메뉴 만들기 - 리액트, 자바스크립트 - Creative Nomad LondonCity

리액트와 자바스크립트를 사용하여 화면 상단에 고정되는 메뉴를 만드는 방법입니다. 많은 사이트에서 적용하고 있는 레이아웃으로, 스크롤을 내리면 메인 메뉴만 상단에 고정되는 방식입니다

www.walterz.net

 

[React/Typescript] 반응형 네비게이션 만들기 (Navigation with CSS media queries)

https://jeewonscript.tistory.com/6

 

[React/Typescript] 반응형 네비게이션 만들기

[React/Typescript] 반응형 네비게이션 만들기 (Navigation with CSS media queries) 이번 포스팅에서는 React 라이브러리와 Typescript로 화면 크기에 따라 배치가 바뀌는 반응형 네비게이션을 만들어보겠습니다.

jeewonscript.tistory.com

 

개발 🐾/ReactJS

React 스크롤시 Fix 하기 (Window scroll)

https://wazacs.tistory.com/28

 

React 스크롤시 Fix 하기 (Window scroll)

스크롤바를 어느 값만큼 내리면 특정 엘레먼트의 css 속성이 변경되어야 하는 경우가 종종 있습니다. 우선 해당 환경을 만들기 위해 마크업을 합니다. Window가 아닌 div 스크롤인 경우 - App.js 'I will

wazacs.tistory.com

 

+ Recent posts