What I'm doing:
Simple - I need to scroll to the bottom of a message list as soon as the component contains it (Messages) is mounted.
The Monkey Wrench In My Program :)
Scrolling to bottom after mounting was fine until...
I simply moved some furniture around by taking the header of a scroll-able child component(Messages) and moved it into the it's parent component(MessageSection) in order to get the header to stick.
Here is a BEFORE and an AFTER:
Before(Yay it work!) MessageSection.js
if(this.state.messages !== null)
return (
<ScrollArea speed={0.8} className="area" contentClassName="content">
<Messages messages={this.state.messages} />
</ScrollArea>
);
}else{
return (
<ScrollArea speed={0.8} className="area" contentClassName="content">
<EmptyMessages />
</ScrollArea>
);
}
The Simple Diff:
(Basically just moved the Heading of Messages into the parent MessageSection)
Pulled the header out of the scrolling child component(
Messages).Put the header above the ScrollArea
Then to render the new JSX -I Wrapped the Header and ScrollArea in a new div ("messages")
AFTER:(What! Y U NO Working??)
MessageSection.js
if(this.state.messages !== null) {
return (
<div className="messages">
<div className ="messages-section-header">
<span className="header">{this.props.name}</span>
</div>
<ScrollArea speed={0.8} className="area scrollarea-flex" contentClassName="content">
<Messages messages={this.state.messages} />
</ScrollArea>
</div>
);
}else{
return (
<div className="messages">
<ScrollArea speed={0.8} className="area scrollarea-flex" contentClassName="content">
<EmptyMessages />
</ScrollArea>
</div>
);
}
The Error:
After the restructuring I got this error from ScrollArea.jsx#L222
Uncaught TypeError: Cannot read property 'offsetHeight'
The Cause of the Error:
When scroll-able component Messages mounts in it's componentDidMount it tries to scroll to the bottom using a exposed context of the ScrollArea component, but refs inside the ScrollArea do not exist. Which is weird because the refs will exist if called later by componentDidUpdate
For Reference, here is the child component where the failure occurs.
MessageList.js(Scroll-able component that tries to scroll to bottom as it mounts)
contextTypes: {
scrollArea: React.PropTypes.object //Used by the Library to Access the Scrolling Panel(The Parent Component)
},
componentDidMount: function() {
this._scrollToBottom();
},
_scrollToBottom: function() {
var scrollHeight = this.refs.messages.scrollHeight;
this.context.scrollArea.scrollYTo(scrollHeight);//ERROR -the refs will not exist inside context as expected
}
Why I Am Baffled:
It doesn't make sense how ScrollArea can be mounted and that it's child Messages can also be mounted and calling the defined context ScrollArea exposed to it, yet the refs of ScrollArea don't exist???
Which is double confusing since it worked before I did the little change.
Question:
How could a simple change in the structure of my code cause the context to not have access to it's refs