2024.04.08 TIL - 최종프로젝트 14일차(이미지 드래그 앤 드롭, 디자이너 회의)

Innes·2024년 4월 8일
1

TIL(Today I Learned)

목록 보기
110/147
post-thumbnail

📝 오늘 한 일

✔️ hook으로 리팩토링 - 게시글 수정, 게시글 글쓰기, 개인액션 수정
✔️ 개인액션 수정 - 이미지 삭제버튼 변경
✔️ 이미지 드래그 앤 드랍
✔️ 상세모달창 로딩처리

이미지 드래그 앤 드롭

  • 기존에 있던 이미지 미리보기, 이미지 삭제 로직
  // 이미지 미리보기 띄우기
  const handleShowPreview = (e: React.ChangeEvent<HTMLInputElement>) => {
    const file = e.target.files?.[0];
    if (!file) {
      return;
    }
    const imageUrl = URL.createObjectURL(file);
    setUploadedFileUrls((prev) => [...prev, imageUrl]);
    setFiles((prev) => [...prev, file]);
  };

  // 미리보기 이미지 삭제
  const handleDeleteImage = (index: number) => {
    setUploadedFileUrls((prev) => {
      const updatedUrls = [...prev];
      updatedUrls.splice(index, 1);
      return updatedUrls;
    });
    setFiles((prev) => {
      const updateFiles = [...prev];
      updateFiles.splice(index, 1);
      return updateFiles;
    });
  };
  • 드래그, 드롭 로직 추가
    • 드래그 상태를 useState로 관리, 드래그 중, 드래그 멈췄을 때, 드롭 했을 때 를 모두 함수로 관리하고, event를 받아서 브라우저 기본동작(페이지 새로고침)을 막아주고, 함수를 통해 드래그 상태를 변경한다.
    • 드롭할 경우 이미지 url과 file을 state에 set해준다.
  // 드래그 앤 드랍 상태
  const [isDragging, setIsDragging] = useState(false);

  // 드래그 앤 드랍 이벤트 핸들러
  const handleDragStart = (e: React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
    setIsDragging(true);
  };

  // 드래그 중인 아이템이 요소 위로 이동할 때 발생하는 이벤트를 처리
  // (기본적으로 브라우저의 기본 동작을 막음)
  // (드래그한 아이템을 요소 위에 올렸을 때 특정 스타일을 적용, 드롭이 허용되는 영역임을 시각적으로 표시할 수 있음)
  const handleDragOver = (e: React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
  };

  const handleDragEnd = (e: React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
    setIsDragging(false);
  };

  const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {
    e.preventDefault();
    setIsDragging(false);

    // ⭐️ e.target.files가 아니라, dataTransfer라는 점 주의!
    const files = e.dataTransfer.files;
    if (!files || files.length === 0) {
      return;
    }
    const file = files[0];
    const imageUrl = URL.createObjectURL(file);
    setUploadedFileUrls((prev) => [...prev, imageUrl]);
    setFiles((prev) => [...prev, file]);
  };
  • 컴포넌트에서 사용하는 법 - onDragEnter 등 속성에 주목!
<div
        className={`flex gap-2 w-full h-auto mb-8 ${
          isDragging ? "border-blue-400" : "border-gray-300"
        }`}
        onDragEnter={handleDragStart}
        onDragOver={handleDragOver}
        onDragLeave={handleDragEnd}
        onDrop={handleDrop}
      >
        {[...Array(4)].map((_, index) => (
          <div
            key={index}
          >
      
      // ... 생략

디자이너 회의

  • 90% 최종본 도착! 두근두근
    이대로 구현만 제대로 할수 있다면 넘 멋질 것 같다! 디자이너의 손길이란....ㄷㄷ

📝 2시간 가량의 회의내용

1. 해주세요

  • 들어갈 이미지, 로고 전달 (월요일까지)

  • (추가) : 로딩 스피너 애니메이션 전달해주기로함

  • confirm창 디자인 수정해주세요

  • 채팅기능 디자인 (수요일까지)

  • 모바일 반응형 (다음주 월요일까지)

2. ToDo

  • 기업단체 한페이지에 8장 - 페이지네이션

  • 커뮤니티 리스트 - 그리드로 수정

  • 커뮤니티 게시글 - 디자인 수정 (그라데이션)

  • 댓글 입력칸 - 아래로 이동 (스크롤 영역 외로)

  • 인증글 올리면 포인트 축하 모달 뜨게

profile
무서운 속도로 흡수하는 스폰지 개발자 🧽

0개의 댓글