React Transition Groupμ μ¬μ©νμ¬ λ§€λ ₯μ μ΄κ³ λμ μΈ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό μν΄ React μ»΄ν¬λνΈ λͺ©λ‘μ μ λλ©μ΄μ μ μ μ©νλ λ°©λ²μ μμ보μΈμ. μ΄ κ°μ΄λμμλ μ€μΉ, ꡬν, κ³ κΈ κΈ°μ λ° λͺ¨λ² μ¬λ‘λ₯Ό λ€λ£Ήλλ€.
React Transition Groupμ μ¬μ©ν React μ»΄ν¬λνΈ λͺ©λ‘ μ λλ©μ΄μ : ν¬κ΄μ μΈ κ°μ΄λ
νλ μΉ κ°λ°μμ μ¬μ©μ κ²½ν(UI)μ ν₯μμν€κΈ° μν΄ λ§€λ ₯μ μ΄κ³ λμ μΈ μ¬μ©μ μΈν°νμ΄μ€(UI)λ₯Ό λ§λλ κ²μ λ§€μ° μ€μν©λλ€. Reactμμ μ»΄ν¬λνΈ λͺ©λ‘μ μ λλ©μ΄μ μ μ μ©νλ©΄ μ΄λ¬ν λͺ©νμ ν¬κ² κΈ°μ¬νμ¬ μ νμ λ λΆλλ½κ² λ§λ€κ³ μνΈ μμ©μ λ μ§κ΄μ μΌλ‘ λ§λ€ μ μμ΅λλ€. React Transition Group(RTG)μ μ»΄ν¬λνΈ μ§μ λ° ν΄μ₯ μ λλ©μ΄μ μ κ΄λ¦¬νλ νλ‘μΈμ€λ₯Ό λ¨μννλ κ°λ ₯ν λΌμ΄λΈλ¬λ¦¬μ λλ€. μ΄ ν¬κ΄μ μΈ κ°μ΄λλ React Transition Groupμ μ¬μ©νμ¬ React μ»΄ν¬λνΈ λͺ©λ‘μ ν¨κ³Όμ μΌλ‘ μ λλ©μ΄μ μ μ μ©νλ λ° νμν λͺ¨λ κ²μ μλ΄ν©λλ€.
React Transition Groupμ΄λ 무μμΈκ°μ?
React Transition Groupμ νΉν μ λλ©μ΄μ κ³Ό κ΄λ ¨νμ¬ μκ° κ²½κ³Όμ λ°λ₯Έ μ»΄ν¬λνΈ μν(μ§μ , ν΄μ₯)λ₯Ό κ΄λ¦¬νκΈ° μν μ»΄ν¬λνΈ μ§ν©μ λλ€. μ체μ μΌλ‘ μ€νμΌμ μ λλ©μ΄μ νμ§ μμ΅λλ€. λμ CSS μ ν, CSS μ λλ©μ΄μ λλ κΈ°ν μ λλ©μ΄μ κΈ°μ μ React μ»΄ν¬λνΈμ μ μ©ν μ μλλ‘ νλ λΌμ΄νμ¬μ΄ν΄ ν μ λ ΈμΆν©λλ€.
React Transition Groupμ μ£Όμ μ»΄ν¬λνΈ
- <Transition>: λ¨μΌ μμμ μ λλ©μ΄μ μ μ μ©νκΈ° μν κΈ°λ³Έ μ»΄ν¬λνΈμ λλ€. μ§μ , ν΄μ₯ λ° μ€κ° μνμ λν λΌμ΄νμ¬μ΄ν΄ ν μ μ 곡ν©λλ€.
- <CSSTransition>: μ ν λ¨κ³μμ CSS ν΄λμ€λ₯Ό μλμΌλ‘ μ μ©νλ νΈλ¦¬ν μ»΄ν¬λνΈμ λλ€. μ΄λ κ°λ¨ν CSS μ ν λ° μ λλ©μ΄μ μ κ°μ₯ μΌλ°μ μΌλ‘ μ¬μ©λλ μ»΄ν¬λνΈμ λλ€.
- <TransitionGroup>: <Transition> λλ <CSSTransition> μ»΄ν¬λνΈ μ§ν©μ κ΄λ¦¬ν©λλ€. λͺ©λ‘μμ μ»΄ν¬λνΈλ₯Ό μΆκ°νκ±°λ μ κ±°ν λ μ»΄ν¬λνΈμ μ λλ©μ΄μ μ μ μ©ν μ μμ΅λλ€.
λͺ©λ‘μ μ λλ©μ΄μ μ μ μ©νκΈ° μν΄ React Transition Groupμ μ¬μ©νλ μ΄μ λ 무μμΈκ°μ?
CSS λλ λ€λ₯Έ JavaScript μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ μ§μ μ λλ©μ΄μ μ ꡬνν μ μμ§λ§ React Transition Groupμ λͺ κ°μ§ μ΄μ μ μ 곡ν©λλ€.
- μ μΈμ μ κ·Ό λ°©μ: RTGλ μ λλ©μ΄μ μνλ₯Ό κ΄λ¦¬νλ μ μΈμ λ°©μμ μ 곡νμ¬ μ½λλ₯Ό λ μ½κΈ° μ½κ³ μ μ§ κ΄λ¦¬ν μ μλλ‘ ν©λλ€.
- λΌμ΄νμ¬μ΄ν΄ ν : μ»΄ν¬λνΈμ λΌμ΄νμ¬μ΄ν΄μμ νΉμ μμ μ μ λλ©μ΄μ μ νΈλ¦¬κ±°νμ¬ μ λλ©μ΄μ νλ‘μΈμ€λ₯Ό μ ννκ² μ μ΄ν μ μλλ‘ νλ λΌμ΄νμ¬μ΄ν΄ ν μ λ ΈμΆν©λλ€.
- κ°μνλ κ΄λ¦¬: λͺ©λ‘μ λν μ λλ©μ΄μ κ΄λ¦¬λ 볡μ‘ν μ μμ΅λλ€. RTGλ μ°κ²°λ μ λλ©μ΄μ μ΄ μλ μ»΄ν¬λνΈμ λ§μ΄νΈ λ° μΈλ§μ΄νΈλ₯Ό μ²λ¦¬νμ¬ μ΄ νλ‘μΈμ€λ₯Ό λ¨μνν©λλ€.
- νΈνμ±: CSS μ ν, CSS μ λλ©μ΄μ λ° GSAP λλ Framer Motionκ³Ό κ°μ λ€λ₯Έ JavaScript μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ μννκ² μλν©λλ€.
μμνκΈ°: μ€μΉ λ° μ€μ
μμνκΈ° μ μ React νλ‘μ νΈκ° μ€μ λμ΄ μλμ§ νμΈνμμμ€. κ·Έλ μ§ μμ κ²½μ° Create React Appμ μ¬μ©νμ¬ νλλ₯Ό λ§λ€ μ μμ΅λλ€.
npx create-react-app my-animated-list
cd my-animated-list
λ€μμΌλ‘ React Transition Groupμ μ€μΉν©λλ€.
npm install react-transition-group
λλ
yarn add react-transition-group
κΈ°λ³Έ μμ : κ°λ¨ν λͺ©λ‘μ μ λλ©μ΄μ μ μ©
<CSSTransition> λ° <TransitionGroup>μ μ¬μ©νμ¬ μ»΄ν¬λνΈ λͺ©λ‘μ μ λλ©μ΄μ μ μ μ©νλ λ°©λ²μ 보μ¬μ£Όλ κ°λ¨ν μμ λ‘ μμν΄ λ³΄κ² μ΅λλ€.
λͺ©λ‘ μ»΄ν¬λνΈ λ§λ€κΈ°
λ¨Όμ νλͺ© λͺ©λ‘μ λ λλ§νλ μ»΄ν¬λνΈλ₯Ό λ§λλλ€.
// src/components/TodoList.js
import React, { useState } from 'react';
import { CSSTransition, TransitionGroup } from 'react-transition-group';
import './TodoList.css';
const TodoList = () => {
const [items, setItems] = useState(['Item 1', 'Item 2', 'Item 3']);
const handleAddItem = () => {
setItems([...items, `Item ${items.length + 1}`]);
};
const handleRemoveItem = (index) => {
const newItems = [...items];
newItems.splice(index, 1);
setItems(newItems);
};
return (
<div className="todo-list-container">
<button onClick={handleAddItem}>Add Item</button>
<TransitionGroup className="todo-list" component="ul">
{items.map((item, index) => (
<CSSTransition key={item} timeout={500} classNames="item">
<li>
{item}
<button onClick={() => handleRemoveItem(index)}>Remove</button>
</li>
</CSSTransition>
))}
</TransitionGroup>
</div>
);
};
export default TodoList;
μ΄ μ»΄ν¬λνΈμμ:
useState
ν μ μ¬μ©νμ¬ νλͺ© λͺ©λ‘μ κ΄λ¦¬ν©λλ€.handleAddItem
ν¨μλ λͺ©λ‘μ μ νλͺ©μ μΆκ°ν©λλ€.handleRemoveItem
ν¨μλ λͺ©λ‘μμ νλͺ©μ μ κ±°ν©λλ€.- λͺ©λ‘ νλͺ©μ
<TransitionGroup>
μΌλ‘ λννμ¬ κΈ°λ³Έμ μΌλ‘<ul>
μμλ₯Ό λ λλ§ν©λλ€. - κ° λͺ©λ‘ νλͺ©μ μ ν λ¨κ³μμ CSS ν΄λμ€λ₯Ό μ μ©νλ
<CSSTransition>
μΌλ‘ λνλ©λλ€. timeout
propμ μ λλ©μ΄μ μ κΈ°κ°(λ°λ¦¬μ΄)μ μ§μ ν©λλ€.classNames
propμ μ ν λ¨κ³μμ μ μ©λ CSS ν΄λμ€μ κΈ°λ³Έ μ΄λ¦μ μ§μ ν©λλ€.
CSS μ€νμΌ λ§λ€κΈ°
μ΄μ μ λλ©μ΄μ μ μ μνλ CSS μ€νμΌμ λ§λλλ€.
/* src/components/TodoList.css */
.todo-list-container {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 20px;
}
.todo-list {
list-style: none;
padding: 0;
width: 300px;
}
.todo-list li {
display: flex;
justify-content: space-between;
align-items: center;
padding: 10px;
border: 1px solid #ccc;
margin-bottom: 5px;
background-color: #f9f9f9;
}
.item-enter {
opacity: 0;
transform: translateX(-100%);
}
.item-enter-active {
opacity: 1;
transform: translateX(0);
transition: opacity 500ms, transform 500ms;
}
.item-exit {
opacity: 1;
}
.item-exit-active {
opacity: 0;
transform: translateX(-100%);
transition: opacity 500ms, transform 500ms;
}
μ΄ CSS νμΌμμ:
.item-enter
: DOMμ λ€μ΄κ° λ μμμ μ΄κΈ° μνλ₯Ό μ μν©λλ€. μ¬κΈ°μλ λΆν¬λͺ λκ° 0μΌλ‘ μ€μ λκ³ μμκ° μΌμͺ½μΌλ‘ λ³νλ©λλ€..item-enter-active
: DOMμ λ€μ΄κ° λ μμμ μ΅μ’ μνλ₯Ό μ μν©λλ€. μ¬κΈ°μλ λΆν¬λͺ λκ° 1λ‘ μ€μ λκ³ μμκ° μλ μμΉλ‘ λ³νλ©λλ€. transition μμ±μ μ λλ©μ΄μ μ κΈ°κ°κ³Ό μ νμ μ μν©λλ€..item-exit
: DOMμμ λκ° λ μμμ μ΄κΈ° μνλ₯Ό μ μν©λλ€..item-exit-active
: DOMμμ λκ° λ μμμ μ΅μ’ μνλ₯Ό μ μν©λλ€. μ¬κΈ°μλ λΆν¬λͺ λκ° 0μΌλ‘ μ€μ λκ³ μμκ° μΌμͺ½μΌλ‘ λ³νλ©λλ€. transition μμ±μ μ λλ©μ΄μ μ κΈ°κ°κ³Ό μ νμ μ μν©λλ€.
μ»΄ν¬λνΈλ₯Ό μ±μ ν΅ν©νκΈ°
λ§μ§λ§μΌλ‘ TodoList
μ»΄ν¬λνΈλ₯Ό κΈ°λ³Έ App
μ»΄ν¬λνΈμ ν΅ν©ν©λλ€.
// src/App.js
import React from 'react';
import TodoList from './components/TodoList';
import './App.css';
const App = () => {
return (
<div className="App">
<h1>Animated Todo List</h1>
<TodoList />
</div>
);
};
export default App;
/* src/App.css */
.App {
text-align: center;
padding: 20px;
}
μ΄μ μ ν리μΌμ΄μ μ μ€ννλ©΄ μΆκ°νκ±°λ μ κ±°ν λ νλͺ©μ΄ λΆλλ½κ² λνλκ³ μ¬λΌμ§λ μ λλ©μ΄μ λͺ©λ‘μ΄ νμλ©λλ€.
κ³ κΈ κΈ°μ λ° μ¬μ©μ μ§μ
κΈ°λ³Έ μμ κ° μ’μ μμμ μ μ 곡νμ§λ§ React Transition Groupμ ν¨μ¬ λ λ§μ κ³ κΈ κΈ°λ₯κ³Ό μ¬μ©μ μ§μ μ΅μ μ μ 곡ν©λλ€.
<Transition> μ»΄ν¬λνΈ μ¬μ©
<Transition>
μ»΄ν¬λνΈλ <CSSTransition>
μ λΉν΄ μ λλ©μ΄μ
νλ‘μΈμ€λ₯Ό λ λ§μ΄ μ μ΄ν μ μμ΅λλ€. λ€μν μ ν μνμ λν μ¬μ©μ μ§μ μ½λ°±μ μ μν μ μμ΅λλ€.
import React, { useState } from 'react';
import { Transition, TransitionGroup } from 'react-transition-group';
import './TransitionExample.css';
const duration = 300;
const defaultStyle = {
transition: `opacity ${duration}ms ease-in-out`,
opacity: 0,
}
const transitionStyles = {
entering: { opacity: 0 },
entered: { opacity: 1 },
exiting: { opacity: 1 },
exited: { opacity: 0 },
};
const TransitionExample = () => {
const [inProp, setInProp] = useState(false);
return (
<div>
<button onClick={() => setInProp(!inProp)}>
Toggle
</button>
<Transition in={inProp} timeout={duration}>
{state => (
<div style={{
...defaultStyle,
...transitionStyles[state]
}}>
I'm a fade Transition!
</div>
)}
</Transition>
</div>
);
};
export default TransitionExample;
μ΄ μμ μμ:
<Transition>
μ»΄ν¬λνΈλ₯Ό μ§μ μ¬μ©ν©λλ€.in
propμ μ»΄ν¬λνΈκ° μ§μ λλ ν΄μ₯ μνμ μμ΄μΌ νλμ§ μ μ΄ν©λλ€.<Transition>
μ»΄ν¬λνΈμ μμμ νμ¬ μ ν μνλ₯Ό μΈμλ‘ λ°λ ν¨μμ λλ€.- μ ν μνλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈμ μλ‘ λ€λ₯Έ μ€νμΌμ μ μ©ν©λλ€.
JavaScript μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬ μ¬μ©
React Transition Groupμ GSAP(GreenSock Animation Platform) λλ Framer Motionκ³Ό κ°μ λ€λ₯Έ JavaScript μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ κ²°ν©νμ¬ λ 볡μ‘νκ³ μ κ΅ν μ λλ©μ΄μ μ λ§λ€ μ μμ΅λλ€.
GSAP μ¬μ© μ:
import React, { useRef, useEffect, useState } from 'react';
import { Transition } from 'react-transition-group';
import { gsap } from 'gsap';
const duration = 500;
const GSAPExample = () => {
const [inProp, setInProp] = useState(false);
const boxRef = useRef(null);
useEffect(() => {
if (boxRef.current) {
gsap.set(boxRef.current, { opacity: 0, x: -100 });
}
}, []);
const handleEnter = () => {
gsap.to(boxRef.current, { opacity: 1, x: 0, duration: duration / 1000 });
};
const handleExit = () => {
gsap.to(boxRef.current, { opacity: 0, x: -100, duration: duration / 1000 });
};
return (
<div>
<button onClick={() => setInProp(!inProp)}>
Toggle
</button>
<Transition in={inProp} timeout={duration} onEnter={handleEnter} onExit={handleExit}>
<div ref={boxRef} style={{ width: '100px', height: '100px', backgroundColor: 'lightblue' }}>
Animated Box
</div>
</Transition>
</div>
);
};
export default GSAPExample;
μ΄ μμ μμ:
- GSAPλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈμ μ λλ©μ΄μ μ μ μ©ν©λλ€.
<Transition>
μ»΄ν¬λνΈμonEnter
λ°onExit
propμ GSAP μ λλ©μ΄μ μ νΈλ¦¬κ±°νλ λ° μ¬μ©λ©λλ€.useRef
λ₯Ό μ¬μ©νμ¬ μ λλ©μ΄μ μ μ μ©νλ €λ DOM μμμ λν μ°Έμ‘°λ₯Ό κ°μ Έμ΅λλ€.
μ¬μ©μ μ§μ μ ν ν΄λμ€
<CSSTransition>
μ μ¬μ©νλ©΄ classNames
propμ μ¬μ©νμ¬ μ ν λ¨κ³μμ μ μ©λλ ν΄λμ€ μ΄λ¦μ μ¬μ©μ μ§μ ν μ μμ΅λλ€. μ΄λ CSS λͺ¨λ λλ κΈ°ν μ€νμΌ μ루μ
μΌλ‘ μμ
ν λ νΉν μ μ©ν©λλ€.
<CSSTransition key={item} timeout={500} classNames={{
enter: 'my-enter',
enterActive: 'my-enter-active',
exit: 'my-exit',
exitActive: 'my-exit-active',
}}>
<li>{item}</li>
</CSSTransition>
μ΄λ κ² νλ©΄ μ λλ©μ΄μ μ λν΄ λ μ€λͺ μ μ΄κ±°λ ꡬ체μ μΈ ν΄λμ€ μ΄λ¦μ μ¬μ©ν μ μμ΅λλ€.
React Transition Group μ¬μ©μ μν λͺ¨λ² μ¬λ‘
μ λλ©μ΄μ μ΄ λΆλλ½κ³ , μ±λ₯μ΄ μ’μΌλ©°, μ μ§ κ΄λ¦¬ν μ μλλ‘ νλ €λ©΄ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμμμ€.
- μ λλ©μ΄μ μ κ°λ¨νκ² μ μ§νμΈμ.: μ±λ₯μ μν₯μ μ€ μ μλ μ§λμΉκ² 볡μ‘ν μ λλ©μ΄μ μ νΌνμΈμ. κ°λ¨νκ³ λ―Έλ¬ν μ λλ©μ΄μ μ΄ μ’ μ’ λ ν¨κ³Όμ μ λλ€.
- μ±λ₯ μ΅μ ν:
shouldComponentUpdate
λΌμ΄νμ¬μ΄ν΄ λ©μλ λλReact.memo
λ₯Ό μ¬μ©νμ¬ λΆνμν λ€μ λ λλ§μ λ°©μ§ν©λλ€. - νλμ¨μ΄ κ°μ μ¬μ©:
transform
λ°opacity
μ κ°μ CSS μμ±μ μ¬μ©νμ¬ νλμ¨μ΄ κ°μμ νμ©νμ¬ λ λΆλλ¬μ΄ μ λλ©μ΄μ μ λ§λλλ€. - ν΄λ°± μ 곡: νΉμ μ λλ©μ΄μ κΈ°μ μ μ§μνμ§ μμ μ μλ μ₯μ κ° μλ μ¬μ©μ λλ μ΄μ λΈλΌμ°μ λ₯Ό μν΄ ν΄λ°± μ λλ©μ΄μ λλ μ μ μ½ν μΈ λ₯Ό μ 곡νλ κ²μ κ³ λ €ν©λλ€.
- λ€μν μ₯μΉμμ ν μ€νΈ: λ€μν μ₯μΉ λ° νλ©΄ ν¬κΈ°μμ μ λλ©μ΄μ μ΄ μ μλνλμ§ νμΈν©λλ€.
- μ κ·Όμ±: λμ λ―Όκ°λκ° μλ μ¬μ©μλ₯Ό μΌλμ λμΈμ. μ λλ©μ΄μ μ λΉνμ±ννλ μ΅μ μ μ 곡ν©λλ€.
μΌλ°μ μΈ λ¬Έμ λ° λ¬Έμ ν΄κ²°
React Transition GroupμΌλ‘ μμ ν λ λͺ κ°μ§ μΌλ°μ μΈ λ¬Έμ κ° λ°μν μ μμ΅λλ€. λ¬Έμ ν΄κ²°μ μν λͺ κ°μ§ νμ λ€μκ³Ό κ°μ΅λλ€.
- μ λλ©μ΄μ
μ΄ νΈλ¦¬κ±°λμ§ μμ:
<Transition>
μ»΄ν¬λνΈμin
prop λλ<CSSTransition>
μ»΄ν¬λνΈμkey
propμ΄ μ»΄ν¬λνΈμ μ λλ©μ΄μ μ μ μ©ν΄μΌ ν λ μ¬λ°λ₯΄κ² μ λ°μ΄νΈλμλμ§ νμΈν©λλ€. - CSS ν΄λμ€κ° μ μ©λμ§ μμ: CSS ν΄λμ€ μ΄λ¦μ λ€μ νμΈνκ³
<CSSTransition>
μ»΄ν¬λνΈμclassNames
propκ³Ό μΌμΉνλμ§ νμΈν©λλ€. - μ λλ©μ΄μ λκΉ νμ: νλμ¨μ΄ κ°μμ μ¬μ©νκ³ λΆνμν λ€μ λ λλ§μ λ°©μ§νμ¬ μ λλ©μ΄μ μ μ΅μ νν©λλ€.
- μμμΉ λͺ»ν λμ: νΉμ μ»΄ν¬λνΈ λμ λ° λΌμ΄νμ¬μ΄ν΄ ν μ λν React Transition Group λ¬Έμλ₯Ό μ£Όμ κΉκ² κ²ν νμμμ€.
μ€μ μ λ° μ¬μ© μ¬λ‘
React Transition Groupμ μ¬μ©μ κ²½νμ ν₯μμν€κΈ° μν΄ λ€μν μλ리μ€μμ μ¬μ©ν μ μμ΅λλ€. λͺ κ°μ§ μλ λ€μκ³Ό κ°μ΅λλ€.
- νμ λ©λ΄: νμ λ©λ΄λ₯Ό μ΄κ³ λ«λ μ λλ©μ΄μ μ μ μ©νμ¬ λ λΆλλ½κ³ λ§€λ ₯μ μΈ κ²½νμ μ 곡ν©λλ€.
- λͺ¨λ¬ μ°½: λͺ¨λ¬ μ°½μ λͺ¨μκ³Ό μ¬λΌμ§μ μ λλ©μ΄μ μ μ μ©νμ¬ μ¬μ©μμ κ΄μ¬μ λκ³ μκ°μ νΌλλ°±μ μ 곡ν©λλ€.
- μ΄λ―Έμ§ κ°€λ¬λ¦¬: μ΄λ―Έμ§ κ°€λ¬λ¦¬μμ μ΄λ―Έμ§ κ°μ μ νμ μ λλ©μ΄μ μ μ μ©νμ¬ λ λͺ°μ κ° μκ³ μκ°μ μΌλ‘ λ§€λ ₯μ μΈ κ²½νμ λ§λλλ€.
- λ°μ΄ν° ν μ΄λΈ: λ°μ΄ν° ν μ΄λΈμμ νμ μΆκ° λ° μ κ±°μ μ λλ©μ΄μ μ μ μ©νμ¬ λ³κ²½ μ¬νμ κ°μ‘° νμνκ³ λ°μ΄ν° μκ°νλ₯Ό κ°μ ν©λλ€.
- μμ μ ν¨μ± κ²μ¬: μ ν¨μ± κ²μ¬ λ©μμ§ νμλ₯Ό μ λλ©μ΄μ νμ¬ μ¬μ©μμκ² λͺ ννκ³ μ¦κ°μ μΈ νΌλλ°±μ μ 곡ν©λλ€.
λ체 μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬
React Transition Groupμ κ°λ ₯ν λꡬμ΄μ§λ§ React μ»΄ν¬λνΈμ μ λλ©μ΄μ μ μ μ©νκΈ° μν μ μΌν μ΅μ μ μλλλ€. λͺ κ°μ§ λ체 μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬λ λ€μκ³Ό κ°μ΅λλ€.
- Framer Motion: 볡μ‘ν μ λλ©μ΄μ λ° μνΈ μμ©μ λ§λ€κΈ° μν κ°λ¨νκ³ μ§κ΄μ μΈ APIλ₯Ό μ 곡νλ μΈκΈ° μλ λΌμ΄λΈλ¬λ¦¬μ λλ€.
- GSAP(GreenSock Animation Platform): κ΄λ²μν κΈ°λ₯κ³Ό λ°μ΄λ μ±λ₯μ μ 곡νλ μ λ¬Έμ μΈ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ λλ€.
- React Spring: νμ€μ μ΄κ³ μμ°μ€λ¬μ΄ λͺ¨μμ μ λλ©μ΄μ μ λ§λλ μ€νλ§ κΈ°λ° μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ λλ€.
- Anime.js: κ°λ¨νκ³ μ μ°ν APIλ₯Ό κ°μΆ κ°λ²Όμ΄ JavaScript μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ λλ€.
κ²°λ‘
React Transition Groupμ μ»΄ν¬λνΈ λͺ©λ‘ λ° κΈ°ν UI μμμ μ λλ©μ΄μ μ μ μ©νμ¬ λ§€λ ₯μ μ΄κ³ λμ μΈ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λ§λλ λ° μ μ©ν λꡬμ λλ€. μ£Όμ μ»΄ν¬λνΈ, λΌμ΄νμ¬μ΄ν΄ ν λ° λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄ν¨μΌλ‘μ¨ React Transition Groupμ ν¨κ³Όμ μΌλ‘ μ¬μ©νμ¬ React μ ν리μΌμ΄μ μ μ¬μ©μ κ²½νμ ν₯μμν¬ μ μμ΅λλ€. λ€μν μ λλ©μ΄μ κΈ°μ μ μ€ννκ³ , κ³ κΈ κΈ°λ₯μ νμνκ³ , νμ μ±λ₯κ³Ό μ κ·Όμ±μ μ°μ μνμ¬ μ§μ μΌλ‘ λ°μ΄λ μ¬μ©μ μΈν°νμ΄μ€λ₯Ό λ§λμμμ€.
μ΄ κ°μ΄λλ React Transition Groupμ μμνκΈ° μν κ²¬κ³ ν κΈ°λ°μ μ 곡ν©λλ€. λ λ§μ κ²½νμ μμΌλ©΄μ λ κ³ κΈ κΈ°μ μ νμνκ³ React Transition Groupμ λ€λ₯Έ μ λλ©μ΄μ λΌμ΄λΈλ¬λ¦¬μ ν΅ν©νμ¬ ν¨μ¬ λ μ κ΅νκ³ μκ°μ μΌλ‘ λ§€λ ₯μ μΈ μ λλ©μ΄μ μ λ§λ€ μ μμ΅λλ€. μ¦κ±°μ΄ μ λλ©μ΄μ !