React 로 크리스마스 위시 리스트 앱 만들기

ReactBeginner
지금 연습하기

소개

이 프로젝트는 React 를 사용하여 축제 분위기의 크리스마스 위시리스트 빌더 웹 애플리케이션을 구축하는 과정을 안내합니다. 이 앱은 아름다운 전체 화면 크리스마스 테마 배경과 매력적인 눈 내리는 애니메이션을 특징으로 하여 휴일 분위기를 고조시킵니다. 사용자는 반투명 위시 벽에 소원을 추가할 수 있으며, 각 소원은 엽서 형태로 표시됩니다. 프론트엔드에는 React 를 사용하고, 스타일링과 애니메이션에는 CSS 를 사용합니다.

참고: 이 프로젝트는 주로 Material UI 와 React 를 사용하여 구축되었습니다.

👀 미리보기

Wish List Builder Preview

🎯 과제

이 프로젝트에서 다음을 배우게 됩니다.

  • React 프로젝트를 설정하고 종속성을 설치하는 방법
  • React 에서 함수형 컴포넌트를 생성하는 방법
  • useState 와 같은 React 훅을 사용하여 컴포넌트의 상태를 관리하는 방법
  • props 를 사용하여 부모 컴포넌트와 자식 컴포넌트 간에 데이터를 전달하는 방법
  • React 에서 폼 제출을 처리하는 방법
  • CSS 를 사용하여 React 애플리케이션의 스타일을 지정하는 방법
  • React 와 CSS 를 사용하여 시각적으로 매력적이고 인터랙티브한 웹 애플리케이션을 구축하는 방법

🏆 성과

이 프로젝트를 완료하면 다음을 수행할 수 있습니다.

  • React 프로젝트를 설정하고 필요한 종속성을 설치합니다.
  • React 에서 함수형 컴포넌트를 생성하고 훅을 사용하여 상태를 관리합니다.
  • props 를 사용하여 부모 컴포넌트와 자식 컴포넌트 간에 데이터를 전달합니다.
  • React 애플리케이션에서 폼 제출을 처리합니다.
  • CSS 를 사용하여 React 애플리케이션의 스타일을 지정하여 시각적으로 매력적이고 인터랙티브한 사용자 인터페이스를 만듭니다.
  • 크리스마스 테마 배경, 눈 내리는 애니메이션, 위시리스트 벽과 같은 기능을 통합하여 React 와 CSS 를 사용하여 완전한 웹 애플리케이션을 구축합니다.
이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 초급 레벨의 실험이며 완료율은 82%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

의존성 설치

React 프로젝트 파일은 이미 환경에 있습니다.

  1. 종속성 설치:
npm install
  1. 필요한 디렉토리와 파일 생성:
mkdir src/components
touch src/components/{AddWishForm.js,WishList.js,Postcard.js,Snowflakes.js}
touch src/components/{Snowflakes.css,Postcard.css,WishList.css}
✨ 솔루션 확인 및 연습

Snowflakes 컴포넌트 설정

떨어지는 눈 애니메이션을 표시하기 위해 snowflakes 컴포넌트를 생성합니다.

  1. src/components/Snowflakes.js 파일에 다음을 작성합니다.
// Snowflakes.js - CSS 를 사용하여 떨어지는 눈송이를 생성합니다.
import React from "react";
import "./Snowflakes.css";

const Snowflakes = () => {
  // 눈송이를 나타내는 div 배열을 생성합니다.
  const snowflakes = Array.from({ length: 200 }).map((_, index) => (
    <div
      key={index}
      className="snowflake"
      style={{
        left: `${Math.random() * 100}vw`,
        animationDuration: `${Math.random() * 3 + 2}s`,
        animationDelay: `${Math.random() * 5}s`
      }}
    >
      ❅
    </div>
  ));

  return <div className="snow-container">{snowflakes}</div>;
};

export default Snowflakes;
  1. src/components/Snowflakes.css 파일에 다음을 작성합니다.
/* Snowflakes.css - 떨어지는 눈송이 스타일 */
.snow-container {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  overflow: hidden;
  z-index: 1;
  pointer-events: none;
}

.snowflake {
  position: absolute;
  top: -2vh;
  color: #fff;
  font-size: 1em;
  opacity: 0.8;
  user-select: none;
  pointer-events: none;
  /* 클릭 이벤트를 통과시킵니다. */
}

@keyframes snowfall {
  0% {
    transform: translateY(0);
  }

  100% {
    transform: translateY(100vh);
  }
}

.snowflake {
  animation: snowfall linear infinite;
}
✨ 솔루션 확인 및 연습

Add Wish Form 컴포넌트 생성

이 컴포넌트를 통해 사용자는 소원을 입력할 수 있습니다.

  1. src/components/AddWishForm.js 파일에 다음을 작성합니다.
// AddWishForm.js - 새로운 소원을 추가하기 위한 Form 컴포넌트
import React, { useState } from "react";
import { TextField, Button, Box } from "@mui/material";

function AddWishForm({ onAddWish }) {
  const [wish, setWish] = useState("");

  const handleSubmit = (event) => {
    event.preventDefault();
    onAddWish(wish);
    setWish("");
  };

  return (
    <Box
      component="form"
      onSubmit={handleSubmit}
      sx={{
        mt: 2,
        display: "flex",
        alignItems: "center",
        justifyContent: "center"
      }}
    >
      <TextField
        label="Your Wish"
        variant="outlined"
        value={wish}
        onChange={(e) => setWish(e.target.value)}
        sx={{ mr: 2 }}
      />
      <Button variant="contained" color="secondary" type="submit">
        Submit Wish
      </Button>
    </Box>
  );
}

export default AddWishForm;
✨ 솔루션 확인 및 연습

Wish List 및 Postcard 컴포넌트 구현

추가된 소원을 엽서 스타일의 반투명 소원 벽에 표시합니다.

  1. src/components/WishList.js 파일에 다음을 작성합니다.
// WishList.js - 소원 벽에 소원을 표시하는 컴포넌트
import React from "react";
import Postcard from "./Postcard";
import "./WishList.css";

function WishList({ wishes, onRemoveWish }) {
  return (
    <div className="wish-wall">
      {wishes.map((wish, index) => (
        <Postcard key={index} wish={wish} onRemoveWish={onRemoveWish} />
      ))}
    </div>
  );
}

export default WishList;
  1. src/components/Postcard.js 파일에 다음을 작성합니다.
// Postcard.js - 각 소원을 엽서로 표시합니다.
import React from "react";
import { Card, CardContent, Typography, IconButton } from "@mui/material";
import CloseIcon from "@mui/icons-material/Close";
import "./Postcard.css";

function Postcard({ wish, onRemoveWish }) {
  return (
    <Card className="postcard">
      <CardContent>
        <IconButton
          className="delete-button"
          onClick={() => onRemoveWish(wish)}
          size="small"
        >
          <CloseIcon fontSize="inherit" />
        </IconButton>
        <Typography variant="h6" component="div">
          {wish}
        </Typography>
      </CardContent>
    </Card>
  );
}

export default Postcard;
✨ 솔루션 확인 및 연습

애플리케이션 스타일 적용

애플리케이션이 원하는 모양과 느낌을 갖도록 합니다.

  1. src/App.css 파일에 다음을 작성합니다.
/* App.css - 배경 이미지를 포함한 전역 스타일 */
.App {
  color: #fff;
  font-family: "Your-Christmas-Theme-Font", sans-serif;
}
.app-container {
  margin-top: -4vh;
  position: relative;
  z-index: 2;
  background: url("./tijana-drndarski-1L4q_S1atmc-unsplash.jpg") no-repeat
    center center;
  background-size: cover;
  min-height: 100vh;
  min-width: 200vh;
  color: #fff;
}
  1. src/components/Postcard.css 파일에 다음을 작성합니다.
.postcard {
  width: 200px;
  height: 140px;
  margin: 10px;
  box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.2);
  transform: rotate(-5deg);
}

.postcard:nth-child(odd) {
  transform: rotate(5deg);
}

.delete-button {
  position: absolute;
  top: 0;
  right: 0;
}
  1. src/components/WishList.css 파일에 다음을 작성합니다.
.wish-wall {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  padding: 20px;
  background-color: rgba(255, 255, 255, 0.5);
  border-radius: 15px;
  box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
  margin-top: 20px;
}
✨ 솔루션 확인 및 연습

App 컴포넌트 조립

메인 애플리케이션 컴포넌트를 구성합니다.

  1. src/App.js 파일에 다음을 작성합니다.
// App.js - 메인 애플리케이션 컴포넌트
import React, { useState } from "react";
import AddWishForm from "./components/AddWishForm";
import WishList from "./components/WishList";
import Snowflakes from "./components/Snowflakes";
import { Container, Button, Box } from "@mui/material";
import "./App.css";

function App() {
  const [wishes, setWishes] = useState([]);
  const [showForm, setShowForm] = useState(false);

  const handleAddWish = (newWish) => {
    setWishes([...wishes, newWish]);
    setShowForm(false);
  };

  const handleRemoveWish = (wish) => {
    setWishes(wishes.filter((item) => item !== wish));
  };

  return (
    <Container maxWidth="md" className="app-container">
      <Snowflakes />
      <Box sx={{ my: 4, textAlign: "center" }}>
        <Button
          variant="contained"
          color="primary"
          onClick={() => setShowForm(!showForm)}
        >
          {showForm ? "Close" : "Add Wish"}
        </Button>
        {showForm && <AddWishForm onAddWish={handleAddWish} />}
        <WishList wishes={wishes} onRemoveWish={handleRemoveWish} />
      </Box>
    </Container>
  );
}

export default App;
✨ 솔루션 확인 및 연습

프로젝트 실행

마침내, 크리스마스 위시 리스트 빌더 (Christmas Wish List Builder) 를 실제로 볼 시간입니다.

npm start

이 명령은 기본 웹 브라우저에서 애플리케이션을 실행합니다. 크리스마스 테마의 위시 리스트 앱이 떨어지는 눈송이, 반투명 위시 벽, 엽서 스타일의 위시와 함께 표시되어야 합니다.

✨ 솔루션 확인 및 연습

요약

이 프로젝트에서 React 를 사용하여 크리스마스 위시 리스트 빌더를 성공적으로 구축했습니다. 전체 화면의 축제 배경, 매력적인 눈송이 효과, 사용자가 엽서 형태로 위시를 추가하고 볼 수 있는 반투명 위시 벽을 특징으로 합니다. 이 프로젝트는 React 및 CSS 기술을 향상시킬 뿐만 아니라 재미있고 인터랙티브한 웹 애플리케이션으로 휴가 분위기를 조성합니다.