카테고리 없음
React vol.13 (React Transition Group)
곽빵
2022. 9. 30. 04:05
개요
React JS 를 공부하면서 기본을 정리해두고자 작성
React Transition 이란?
css의 animaition이나 transition으로 좀더 효과적이면 동적이고 부드러운 UI를 구현할 수 있지만, 이런 효과들중에 opacity: 0로 보이지 않게할 뿐 해당 element는 페이지내에 존재하는 경우가 있다. 그래서 React팀은 실제로 페이지 내에서 element를 삭제하고 다시 재생성할 때 transition과 animation효과를 쉽게 줄 수 있게하는 React Transition Group이라는 라이브러리를 만들었다.
Install
npm install react-transition-group
usage
import React, { Component } from "react";
import { Transition } from "react-transition-group";
...
class App extends Component {
state = {
modalIsOpen: false,
};
showModal = () => {
this.setState({ modalIsOpen: true });
};
closeModal = () => {
this.setState({ modalIsOpen: false });
};
render() {
return (
<Transition
in={this.state.modalIsOpen}
timeout={500}
mountOnEnter
unmountOnExit
>
{(state) => <Modal show={state} closed={this.closeModal} />}
</Transition>
);
}
}
export default App;
Transition의 props
- in => boolean값을 넘김으로써 false => true로 될 때 children의 영역에 있는 함수의 status가 entering으로 되고 timeout만큼의 시간이 지나면 entered로 된다. 반대로 true => false가 될 때 exiting이 되고 timeout만큼의 시간이 지나면 exited가 된다.
- timeout => transition의 time과 같으며 애니메이션 효과를 주는 시간이다.
- mountOnEnter => in가 true가 될 때 해당 element를 추가
- unmountOnExit => in가 false가 될 때 해당 element를 제거
Modal.js
import React from "react";
import "./Modal.css";
const modal = (props) => {
const cssClasses = [
"Modal",
props.show === "entering"
? "ModalOpen"
: props.show === "exiting"
? "ModalClosed"
: "",
];
return (
<div className={cssClasses.join(" ")}>
<h1>A Modal</h1>
<button className="Button" onClick={props.closed}>
Dismiss
</button>
</div>
);
};
export default modal;
Modal.css
.Modal {
position: fixed;
z-index: 200;
border: 1px solid #eee;
box-shadow: 0 2px 2px #ccc;
background-color: white;
padding: 10px;
text-align: center;
box-sizing: border-box;
top: 30%;
left: 25%;
width: 50%;
}
.ModalOpen {
animation: openModal 0.4s ease-in-out forwards;
}
.ModalClosed {
animation: closeModal 0.4s ease-in-out forwards;
}
@keyframes openModal {
0% {
opacity: 0;
transform: translateY(-100%);
}
50% {
opacity: 1;
transform: translateY(20%);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
@keyframes closeModal {
0% {
opacity: 1;
transform: translateY(0);
}
50% {
opacity: 0.8;
transform: translateY(20%);
}
100% {
opacity: 0;
transform: translateY(-100%);
}
}
말고도 다른 Props는 밑의 공식문서를 참조
https://reactcommunity.org/react-transition-group/transition
React Transition Group
A function child can be used instead of a React element. This function is called with the current transition status ('entering', 'entered', 'exiting', 'exited'), which can be used to apply context specific props to a component. {state => ( )}
reactcommunity.org