You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
968 B
32 lines
968 B
class ScrollingList extends React.Component {
|
|
constructor(props) {
|
|
super(props);
|
|
this.listRef = React.createRef();
|
|
}
|
|
|
|
getSnapshotBeforeUpdate(prevProps, prevState) {
|
|
// Are we adding new items to the list?
|
|
// Capture the scroll position so we can adjust scroll later.
|
|
if (prevProps.list.length < this.props.list.length) {
|
|
const list = this.listRef.current;
|
|
return list.scrollHeight - list.scrollTop;
|
|
}
|
|
return null;
|
|
}
|
|
|
|
componentDidUpdate(prevProps, prevState, snapshot) {
|
|
// If we have a snapshot value, we've just added new items.
|
|
// Adjust scroll so these new items don't push the old ones out of view.
|
|
// (snapshot here is the value returned from getSnapshotBeforeUpdate)
|
|
if (snapshot !== null) {
|
|
const list = this.listRef.current;
|
|
list.scrollTop = list.scrollHeight - snapshot;
|
|
}
|
|
}
|
|
|
|
render() {
|
|
return (
|
|
<div ref={this.listRef}>{/* ...contents... */}</div>
|
|
);
|
|
}
|
|
}
|
|
|