티스토리 뷰

React

리액트 hook (useState와 useEffect)

이채야채 2021. 11. 23. 11:28

React의 단방향 데이터 흐름

props를 단방향으로 내려준다. 

동일한 props를 전달하면, 동일한화면이 렌더링되어야한다.

한 함수는 동일한 Input에, 동일한 output이 나와야한다 => pure function

 

 

리액트의 훅은 컴포넌트의 lifecycle 개념과 관련이있다.

 

일부 블로그들을 보면 개념설명이 너무 어렵게되어있어서 이해가 어려웠다.

내가 알아볼수있도록 정리해보자!

 

컴포넌트의 Lifecycle : 컴포넌트의 인생

컴포넌트 -> 등장 -> 업데이트(재렌더링) -> 퇴장

 

Hook을 통하여 컴포넌트의 인생에 딴지를 걸수있다.

 

Lifecycle의 hook 

원래는 class 컴포넌트에서

componentDidmount() : 컴포넌트가 마운트(등장)가되엇을때 특정 코드를 실행해주세요

componenWillunmount() : 컴포넌트가 언마운트(퇴장,빠이빠이)가되엇을때 특정 코드를 실행해주세요

 

useEffect hook

 

UseEffect를 통해 우리는 언제 코드를 실행할지 선택권을 가질수있다. 

 

  • 컴포넌트가 마운트 되었을때
  • 컴포넌트가 업데이트 되었을때
  • 컴포넌트가 사라질때 

특정코드를 실행할수있다.

 

useEffect(()=>{
	setTimeout(()=>{
    실행할코드
    },2000)
})
  • 컴포넌트가 사라질때 
useEffect(()=>{
	return function 어쩌구(){실행할코드 <- 컴포넌트 언마운트될때 실행된다}
}) //무조건 함수를 써야한다. arrow function으로도 사용가능

요즘 만들고있는 쇼핑몰 프로젝트를 통해 useEffect를 사용해보자

2초후 aleart 창을 안보이게 하고싶다 ?? 

 

내가짠 코드

import React, { useEffect, useState } from 'react'
import { useHistory , useParams } from 'react-router-dom'



function Detail(props){

    const [isRest, setIsrest] = useState(false)

    useEffect(()=>{
        setTimeout(() => {
           setIsrest(true)
        }, 2000);
    })

    let { id } = useParams()
    let items = props.shoes.find((item) => item.id == id)
    let history = useHistory(); //history라는 object 방문기록등을 저장해놓은!!
    //history.pupsh('/')<-버튼을 누르면 이 경로로 이동해주세요 : 버튼 커스터마이징할수있슴다~!

    function Rest (){
        return( 
        <div className="my-alert2">
          <p>재고가 얼마 남지 않았습니다.</p>
        </div>
        )
 
    }

    return (
        <div className="container">
            <div>
                <p className="red">Detail</p>
            </div>
          {isRest ? null : <Rest /> }
          <div className="row">
            <div className="col-md-6">
              <img src="https://codingapple1.github.io/shop/shoes1.jpg" width="100%" />
            </div>
            <div className="col-md-6 mt-4">
              <h4 className="pt-5">{items.title}</h4>
              <p>{items.title}</p>
              <p>{items.price}원</p>
              <button className="btn btn-danger">주문하기</button> 
              <button className="btn btn-danger">뒤로가기</button> 
            </div>
          </div>
      </div>  
      )
    };
  export default Detail;

인강에서 짠 코드

 

function Detail(){

  let [ alert, alert변경 ] = useState(true);
  useEffect(()=>{
    let 타이머 = setTimeout(()=>{ alert변경(false) }, 2000);
  });
  
  return (
    <HTML많은곳/>
    {
      alert === true
      ? (<div className="my-alert2">
          <p>재고가 얼마 남지 않았습니다</p>
        </div>)
      : null
    }
  )
}

 

컴포넌트 등장/업데이트 될시 실행된다 => 위의 코드는 버그가 생길 가능성이높다.

=> 두번째 인자의 배열을 이용해서 자원낭비를 막을수있다. 

[isRest]를 집어넣으면  <- isRest가 변경이 될때만 실행이되는 훅이된다. 

 

useEffect는 여러개 쓸수있다

그러나. 적은 순서대로 실행이된다.

 

'React' 카테고리의 다른 글

상태끌어올리기 : 함수를 내려주셈  (0) 2021.12.02
useRef  (0) 2021.11.29
coin making  (0) 2021.11.28
todo list  (0) 2021.11.27
React  (0) 2021.11.17
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함