@@ -74,71 +74,62 @@ class CSSTransition extends React.Component {
74
74
static defaultProps = {
75
75
classNames : ''
76
76
}
77
- onEnter = ( node , appearing ) => {
78
- const { className } = this . getClassNames ( appearing ? 'appear' : 'enter' )
79
77
78
+ appliedClasses = {
79
+ appear : { } ,
80
+ enter : { } ,
81
+ exit : { } ,
82
+ }
83
+
84
+ onEnter = ( node , appearing ) => {
80
85
this . removeClasses ( node , 'exit' ) ;
81
- addClass ( node , className )
86
+ this . addClass ( node , appearing ? 'appear' : 'enter' , 'base' ) ;
82
87
83
88
if ( this . props . onEnter ) {
84
89
this . props . onEnter ( node , appearing )
85
90
}
86
91
}
87
92
88
93
onEntering = ( node , appearing ) => {
89
- const { activeClassName } = this . getClassNames (
90
- appearing ? 'appear' : 'enter'
91
- ) ;
92
-
93
- this . reflowAndAddClass ( node , activeClassName )
94
+ const type = appearing ? 'appear' : 'enter' ;
95
+ this . addClass ( node , type , 'active' )
94
96
95
97
if ( this . props . onEntering ) {
96
98
this . props . onEntering ( node , appearing )
97
99
}
98
100
}
99
101
100
102
onEntered = ( node , appearing ) => {
101
- const appearClassName = this . getClassNames ( 'appear' ) . doneClassName ;
102
- const enterClassName = this . getClassNames ( 'enter' ) . doneClassName ;
103
- const doneClassName = appearing
104
- ? `${ appearClassName } ${ enterClassName } `
105
- : enterClassName ;
106
-
107
- this . removeClasses ( node , appearing ? 'appear' : 'enter' ) ;
108
- addClass ( node , doneClassName ) ;
103
+ const type = appearing ? 'appear' : 'enter'
104
+ this . removeClasses ( node , type ) ;
105
+ this . addClass ( node , type , 'done' ) ;
109
106
110
107
if ( this . props . onEntered ) {
111
108
this . props . onEntered ( node , appearing )
112
109
}
113
110
}
114
111
115
112
onExit = ( node ) => {
116
- const { className } = this . getClassNames ( 'exit' )
117
-
118
113
this . removeClasses ( node , 'appear' ) ;
119
114
this . removeClasses ( node , 'enter' ) ;
120
- addClass ( node , className )
115
+ this . addClass ( node , 'exit' , 'base' )
121
116
122
117
if ( this . props . onExit ) {
123
118
this . props . onExit ( node )
124
119
}
125
120
}
126
121
127
122
onExiting = ( node ) => {
128
- const { activeClassName } = this . getClassNames ( 'exit' )
129
-
130
- this . reflowAndAddClass ( node , activeClassName )
123
+ this . addClass ( node , 'exit' , 'active' )
131
124
132
125
if ( this . props . onExiting ) {
133
126
this . props . onExiting ( node )
134
127
}
135
128
}
136
129
137
130
onExited = ( node ) => {
138
- const { doneClassName } = this . getClassNames ( 'exit' ) ;
139
-
140
131
this . removeClasses ( node , 'exit' ) ;
141
- addClass ( node , doneClassName ) ;
132
+ this . addClass ( node , 'exit' , 'done' ) ;
142
133
143
134
if ( this . props . onExited ) {
144
135
this . props . onExited ( node )
@@ -148,46 +139,69 @@ class CSSTransition extends React.Component {
148
139
getClassNames = ( type ) => {
149
140
const { classNames } = this . props ;
150
141
const isStringClassNames = typeof classNames === 'string' ;
151
- const prefix = isStringClassNames && classNames ? classNames + '-' : '' ;
142
+ const prefix = isStringClassNames && classNames
143
+ ? `${ classNames } -`
144
+ : '' ;
152
145
153
- let className = isStringClassNames ?
154
- prefix + type : classNames [ type ]
146
+ let baseClassName = isStringClassNames
147
+ ? `${ prefix } ${ type } `
148
+ : classNames [ type ]
155
149
156
- let activeClassName = isStringClassNames ?
157
- className + '-active' : classNames [ type + 'Active' ] ;
150
+ let activeClassName = isStringClassNames
151
+ ? `${ baseClassName } -active`
152
+ : classNames [ `${ type } Active` ] ;
158
153
159
- let doneClassName = isStringClassNames ?
160
- className + '-done' : classNames [ type + 'Done' ] ;
154
+ let doneClassName = isStringClassNames
155
+ ? `${ baseClassName } -done`
156
+ : classNames [ `${ type } Done` ] ;
161
157
162
158
return {
163
- className ,
159
+ baseClassName ,
164
160
activeClassName,
165
161
doneClassName
166
162
} ;
167
163
}
168
164
169
- removeClasses ( node , type ) {
170
- const { className, activeClassName , doneClassName } = this . getClassNames ( type )
171
- className && removeClass ( node , className ) ;
172
- activeClassName && removeClass ( node , activeClassName ) ;
173
- doneClassName && removeClass ( node , doneClassName ) ;
174
- }
165
+ addClass ( node , type , phase ) {
166
+ let className = this . getClassNames ( type ) [ ` ${ phase } ClassName` ] ;
167
+
168
+ if ( type === 'appear' && phase === 'done' ) {
169
+ className += ` ${ this . getClassNames ( 'enter' ) . doneClassName } ` ;
170
+ }
175
171
176
- reflowAndAddClass ( node , className ) {
177
172
// This is for to force a repaint,
178
173
// which is necessary in order to transition styles when adding a class name.
179
- if ( className ) {
174
+ if ( phase === 'active' ) {
180
175
/* eslint-disable no-unused-expressions */
181
176
node && node . scrollTop ;
182
- /* eslint-enable no-unused-expressions */
183
- addClass ( node , className ) ;
184
177
}
178
+
179
+ this . appliedClasses [ type ] [ phase ] = className
180
+ addClass ( node , className )
185
181
}
186
182
187
- render ( ) {
188
- const props = { ...this . props } ;
183
+ removeClasses ( node , type ) {
184
+ const {
185
+ base : baseClassName ,
186
+ active : activeClassName ,
187
+ done : doneClassName
188
+ } = this . appliedClasses [ type ]
189
+
190
+ this . appliedClasses [ type ] = { } ;
189
191
190
- delete props . classNames ;
192
+ if ( baseClassName ) {
193
+ removeClass ( node , baseClassName ) ;
194
+ }
195
+ if ( activeClassName ) {
196
+ removeClass ( node , activeClassName ) ;
197
+ }
198
+ if ( doneClassName ) {
199
+ removeClass ( node , doneClassName ) ;
200
+ }
201
+ }
202
+
203
+ render ( ) {
204
+ const { classNames : _ , ...props } = this . props ;
191
205
192
206
return (
193
207
< Transition
0 commit comments