Skip to content
Permalink
Newer
Older
100644 127 lines (116 sloc) 3.5 KB
1
import React , { useRef , useState } from 'react'
Aug 29, 2018
2
import anime from 'animejs'
3
import Transition from 'react-transition-group/Transition'
4
import TransitionGroup from 'react-transition-group/TransitionGroup'
6
// we will trigger an event on the grid node after the exit animation completes
7
// to let the transitiongroup know that it can be removed from the DOM
May 3, 2018
8
// this is the only way to let react-transition-group delegate timing
9
// to the JavaScript animation
Aug 29, 2018
10
const ANIMATION_DONE_EVENT = 'animation::done'
11
const triggerAnimationDoneEvent = node =>
12
node . dispatchEvent ( new Event ( ANIMATION_DONE_EVENT ) )
14
const createOpacityAnimationConfig = animatingIn => ( {
15
value : animatingIn ? [ , 1 ] : ,
Aug 29, 2018
16
easing : 'linear' ,
May 6, 2018
17
duration : 300
May 5, 2018
18
} )
19
20
const easing = 'spring(1, 150, 10)'
21
22
const animateGridIn = gridContainer =>
23
anime
24
. timeline ( )
25
. add ( {
26
targets : gridContainer ,
27
translateX : [ - 1000 , ] ,
28
opacity : createOpacityAnimationConfig ( true ) ,
29
easing
31
. add (
32
{
33
targets : gridContainer . querySelectorAll ( '.card' ) ,
34
easing ,
35
opacity : createOpacityAnimationConfig ( true ) ,
36
translateY : [ - 30 , ] ,
37
complete : ( ) => triggerAnimationDoneEvent ( gridContainer ) ,
38
delay : anime . stagger ( 70 )
39
} ,
40
'-=500'
41
)
43
const animateGridOut = gridContainer =>
44
anime
45
. timeline ( )
46
. add ( {
47
targets : gridContainer . querySelectorAll ( '.card' ) ,
48
easing ,
49
opacity : createOpacityAnimationConfig ( false ) ,
50
translateY : - 30 ,
51
delay : anime . stagger ( 50 )
53
. add (
54
{
55
targets : gridContainer ,
56
translateX : 1000 ,
57
opacity : createOpacityAnimationConfig ( false ) ,
58
easing ,
59
complete : ( ) => triggerAnimationDoneEvent ( gridContainer )
60
} ,
61
'-=1400'
62
)
63
64
const animateCardIn = card =>
65
anime ( {
66
targets : card ,
67
opacity : createOpacityAnimationConfig ( true ) ,
68
translateY : [ 50 , ] ,
69
complete : ( ) => triggerAnimationDoneEvent ( card ) ,
70
easing
71
} )
72
73
const animateCardOut = card =>
74
anime ( {
75
targets : card ,
76
translateY : - 10 ,
77
opacity : createOpacityAnimationConfig ( false ) ,
78
complete : ( ) => triggerAnimationDoneEvent ( card ) ,
79
easing
80
} )
81
82
const addEndListener = ( node , done ) =>
83
node . addEventListener ( ANIMATION_DONE_EVENT , done )
84
85
const TransitionGrid = ( { items , visible , removeItem } ) => {
86
// the code below makes sure we force re-mount the transition component
87
// every time it enters, to avoid the transition caching old state
88
// if someone rapidly toggles the component in and out
89
const transitionKey = useRef ( 1 )
90
const [ prevVisible , setPrevVisible ] = useState ( visible )
91
if ( visible !== prevVisible ) setPrevVisible ( visible )
92
if ( visible && ! prevVisible ) {
93
transitionKey . current += 1
94
}
95
96
return (
97
< Transition
98
unmountOnExit
99
appear
100
addEndListener = { addEndListener }
101
onEnter = { animateGridIn }
102
onExit = { animateGridOut }
103
in = { visible }
104
key = { transitionKey . current }
105
>
106
< ul className = "grid animated-grid" >
107
< TransitionGroup component = { null } >
108
{ items . map ( item => (
109
< Transition
110
key = { item }
111
onEnter = { animateCardIn }
112
onExit = { animateCardOut }
113
addEndListener = { addEndListener }
114
>
115
< li className = "card" onClick = { ( ) => removeItem ( item ) } >
116
< div className = "close-card" > < / div >
117
< div > { item } < / div >
118
< / li >
119
< / Transition >
120
) ) }
121
< / TransitionGroup >
122
< / ul >
123
< / Transition >
124
)
125
}
126
127
export default TransitionGrid

友情链: IM·体育网上直播_IM·体育赛事最新版_im体育官网在线官网在线 | im体育app平台下载|IM体育v2.3 安卓版|IM体育今天官网赛表 | im体育推荐官网_im体育今晚高清_im体育买软件 | 2022im体育网网址_分析观看比赛_2022im体育在线软件 | IM体育开户网址-Im体育官方网站-IM体育期胜负彩专家分析 | im电竞体育登录入口_IM·体育比分分析在线_IM·体育v8.5 IOS版 | im体育app官网下载|IM体育最新今天观看|IM体育赛事注册 |