ABOUT ME

chanho Yoon
chyoon0512@gmail.com


깃허브


블로그 이사!

이 블로그로 이사했어요!!


Today
-
Yesterday
-
Total
-
  • React FadeIn 함수 만들기 (useRef, useEffect)
    Programming/React 2021. 4. 25. 11:09
    반응형

    실습은 codesandbox를 이용했고, 노마드코더님의 인강을 참조하고 공부 및 복습 목적으로 작성했습니다.

     

    실습을 시작하기에 앞서 css 트랜지션을 사용하도록 하겠습니다.

     

    transition-duration : 트랜지션이 일어나는 지속 시간을 명시하는 속성입니다.

    transition-delay : 속성이 변하는 시점과 트랜지션이 실제로 시작하는 사이에 기다리는 시간을 정의합니다.


    export default function App() {
      return (
        <div className="App">
          <h1>hello!</h1>
          <p>fadeIn Training</p>
        </div>
      );
    }

    시작은 화면에 h1과 p태그에 fadeIn 효과를 주도록 하겠습니다.

     

    먼저 useFadeIn 함수를 만들고 인자값으로는 duration 과 delay 값을 받도록 하겠습니다.

    const useFadeIn = (duration = 0, delay = 0) => {
      if (typeof duration !== "number" || typeof duration !== "number") {
        return;
      }
    };

    이제 저희는 duration 과 delay 를 받아왔으니 hooks useRef()를 사용하여 특정 element의 DOM에 접근하도록 하겠습니다 그리고 useEffect()를 사용하여 componentDidMount와 같은 상태로 렌더링이 완료됐을 때 실행되도록 하겠습니다.

    const useFadeIn = (duration = 0, delay = 0) => {
      if (typeof duration !== "number" || typeof delay !== "number") {
        return;
      }
      const element = useRef();
      useEffect(() => {
        if (element.current) {
          const { current } = element;
          console.log(current);
        }
      }, []);
      return { ref: element };
    };
    <h1 {...fadeInH1}>hello!</h1>
    <p {...fadeInP}>fadeIn Training</p>

     

    위와 같이 작성하고 console.log로 current 값을 확인해보면 해당 태그가 콘솔창에 출력되는 것을 알 수 있습니다.

    이제 정상적으로 element의 current 값들을 가져오는 것을 확인했으니 실제 current에 style을 추가하도록 하겠습니다.

    const useFadeIn = (duration = 0, delay = 0) => {
      if (typeof duration !== "number" || typeof delay !== "number") {
        return;
      }
      const element = useRef();
      useEffect(() => {
        if (element.current) {
          const { current } = element;
          current.style.transition = `opacity ${duration}s ${delay}s`;
          current.style.opacity = 1;
        }
      }, []);
      return { ref: element, style: { opacity: 0 } };
    };

    전체적인 코드

    import React, { useEffect, useRef } from "react";
    import "./styles.css";
    
    const useFadeIn = (duration = 0, delay = 0) => {
      if (typeof duration !== "number" || typeof delay !== "number") {
        return;
      }
      const element = useRef();
      useEffect(() => {
        if (element.current) {
          const { current } = element;
          current.style.transition = `opacity ${duration}s ${delay}s`;
          current.style.opacity = 1;
        }
      }, []);
      return { ref: element, style: { opacity: 0 } };
    };
    
    export default function App() {
      const fadeInH1 = useFadeIn(3, 2);
      const fadeInP = useFadeIn(4, 2);
      return (
        <div className="App">
          <h1 {...fadeInH1}>hello!</h1>
          <p {...fadeInP}>fadeIn Training</p>
        </div>
      );
    }
    

     

    댓글

Designed by Tistory.