Skip to content

Commit 7003c58

Browse files
committed
fix(Transition): Stale nodes in transition callbacks
1 parent 3f3c1e3 commit 7003c58

File tree

2 files changed

+19
-19
lines changed

2 files changed

+19
-19
lines changed

src/Transition.js

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -222,19 +222,18 @@ class Transition extends React.Component {
222222
if (nextStatus !== null) {
223223
// nextStatus will always be ENTERING or EXITING.
224224
this.cancelNextCallback()
225-
const node = ReactDOM.findDOMNode(this)
226225

227226
if (nextStatus === ENTERING) {
228-
this.performEnter(node, mounting)
227+
this.performEnter(mounting)
229228
} else {
230-
this.performExit(node)
229+
this.performExit()
231230
}
232231
} else if (this.props.unmountOnExit && this.state.status === EXITED) {
233232
this.setState({ status: UNMOUNTED })
234233
}
235234
}
236235

237-
performEnter(node, mounting) {
236+
performEnter(mounting) {
238237
const { enter } = this.props
239238
const appearing = this.context.transitionGroup
240239
? this.context.transitionGroup.isMounting
@@ -246,43 +245,43 @@ class Transition extends React.Component {
246245
// if we are mounting and running this it means appear _must_ be set
247246
if (!mounting && !enter) {
248247
this.safeSetState({ status: ENTERED }, () => {
249-
this.props.onEntered(node)
248+
this.props.onEntered(ReactDOM.findDOMNode(this))
250249
})
251250
return
252251
}
253252

254-
this.props.onEnter(node, appearing)
253+
this.props.onEnter(ReactDOM.findDOMNode(this), appearing)
255254

256255
this.safeSetState({ status: ENTERING }, () => {
257-
this.props.onEntering(node, appearing)
256+
this.props.onEntering(ReactDOM.findDOMNode(this), appearing)
258257

259-
this.onTransitionEnd(node, enterTimeout, () => {
258+
this.onTransitionEnd(enterTimeout, () => {
260259
this.safeSetState({ status: ENTERED }, () => {
261-
this.props.onEntered(node, appearing)
260+
this.props.onEntered(ReactDOM.findDOMNode(this), appearing)
262261
})
263262
})
264263
})
265264
}
266265

267-
performExit(node) {
266+
performExit() {
268267
const { exit } = this.props
269268
const timeouts = this.getTimeouts()
270269

271270
// no exit animation skip right to EXITED
272271
if (!exit) {
273272
this.safeSetState({ status: EXITED }, () => {
274-
this.props.onExited(node)
273+
this.props.onExited(ReactDOM.findDOMNode(this))
275274
})
276275
return
277276
}
278-
this.props.onExit(node)
277+
this.props.onExit(ReactDOM.findDOMNode(this))
279278

280279
this.safeSetState({ status: EXITING }, () => {
281-
this.props.onExiting(node)
280+
this.props.onExiting(ReactDOM.findDOMNode(this))
282281

283-
this.onTransitionEnd(node, timeouts.exit, () => {
282+
this.onTransitionEnd(timeouts.exit, () => {
284283
this.safeSetState({ status: EXITED }, () => {
285-
this.props.onExited(node)
284+
this.props.onExited(ReactDOM.findDOMNode(this))
286285
})
287286
})
288287
})
@@ -322,7 +321,8 @@ class Transition extends React.Component {
322321
return this.nextCallback
323322
}
324323

325-
onTransitionEnd(node, timeout, handler) {
324+
onTransitionEnd(timeout, handler) {
325+
const node = ReactDOM.findDOMNode(this);
326326
this.setNextCallback(handler)
327327

328328
const doesNotHaveTimeoutOrListener = timeout == null && !this.props.addEndListener

test/Transition-test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -465,13 +465,13 @@ describe('Transition', () => {
465465
})
466466

467467
describe('node in callbacks', () => {
468-
it('use stale nodes', done => {
468+
it('does not use stale nodes', done => {
469469
const enteringNode = React.createRef();
470470
const enteredNode = React.createRef();
471471

472472
function makeAssertions() {
473-
expect(enteringNode.current.nodeName).toBe('H1');
474-
expect(enteredNode.current.nodeName).toBe('H1');
473+
expect(enteringNode.current.nodeName).toBe('H2');
474+
expect(enteredNode.current.nodeName).toBe('H3');
475475

476476
done();
477477
}

0 commit comments

Comments
 (0)