버튼이 3개가 있고 내용이 3개 있으면

버튼을 누르면 거기에 맞는 내용을 보여주면 됨.

그냥 모달 창이 3개있다 생각하면 됨.

react-bootstrap에서 가져오기

<Nav variant="tabs" defaultActiveKey="link0">
  <Nav.Item>
    <Nav.Link eventKey="link0">버튼0</Nav.Link>
  </Nav.Item>
  <Nav.Item>
    <Nav.Link eventKey="link1">버튼1</Nav.Link>
  </Nav.Item>
  <Nav.Item>
    <Nav.Link eventKey="link2">
      버튼2
    </Nav.Link>
  </Nav.Item>
</Nav>

state 만들어 tab 값 저장

  let [tab, setTab] = useState(0);

tabcontent 컴포넌트 만들어줌

function TabContent(props) {
  if (props.tab == 0) {
    return <div>내용0</div>
  } else if (props.tab == 1) {
    return <div>내용1</div>
  } else if (props.tab == 2) {
    return <div>내용2</div>
  }
}

이부분을 배열로도 처리할 수 있음

function TabContent({tab}) {
  [<div>내용0</div>,<div>내용1</div>,<div>내용2</div>][tab];
}

위와 같이도 사용 가능

tab 에 onclick 이벤트 걸어줌

<Nav variant="tabs" defaultActiveKey="link0">
  <Nav.Item>
    <Nav.Link
      onClick={() => {
        setTab(0);
      }}
      eventKey="link0"
    >
      버튼0
    </Nav.Link>
  </Nav.Item>
  <Nav.Item>
    <Nav.Link
      onClick={() => {
        setTab(1);
      }}
      eventKey="link1"
    >
      버튼1
    </Nav.Link>
  </Nav.Item>
  <Nav.Item>
    <Nav.Link
      onClick={() => {
        setTab(2);
      }}
      eventKey="link2"
    >
      버튼2
    </Nav.Link>
  </Nav.Item>
</Nav>
<TabContent tab={tab}></TabContent>

전환 애니메이션을 줘보자.

전환애니메이션은 class를 하나 만들어서

뗏다 붙였다 해보자.

1. 애니메이션 동작 전 class
2. 동작 후 class
3. transition을 넣어서 추가
4. 원할 때 2번 class 부착

1. css 만들기 (1,2,3번)

.start {
  opacity: 0;
}

.end {
  opacity: 1;
  transition: opacity 0.5s;
}

2. css 부착


function TabContent({ tab }) {
  let [fade, setFade] = useState('');

  useEffect(() => {
    let timer = setTimeout(() => {
      setFade('end');
    }, 100);

    return () => {
      
      setFade('');
    }
  }, [tab])
  return (
		<div className={"start "+fade}>{[<div>내용0</div>, <div>내용1</div>, <div>내용2</div>][tab]}</div>
	);
}

위와 같이 만들면 잘 동작하게 됨.

그런데 이상하다 왜 setTimeout을 써야만 하는가…

react 18버전 이후로는 automatic batching이라는 것이 있단다

state 변경해주는 애들이 근처에 있다면 모든 state를 변경해준 후 렌더링 해준다함.

합쳐서 해주기 때문임.