버전이 올라가면서 바뀐점!

componentWillMount => getDerivedStateFromProps

componentWillReceiveProps => getDerivedStateFromProps
componentWillUpdate => getSnapshotBeforeUpdate (dom 에 적용되기 적전)
// 이전에는 props가 변경되었을 때만 호출 되었지만, 이제는 state만 변경되도 호출된다.
// 시간의 흐름에 따라 변하는 props에 state 가 의존할 때 사용 추천. 드문경우
      static getDerivedStateFromProps(nextProps, prevState) {
        console.log('getDerivedStateFromProps', nextProps, prevState);
        // return 에 새로운 state 를 설정 해 줄 수 있다.
        return {
          age: 300,
        };
      }
let i = 0;
    class App extends React.Component {
      state = {
        list: []
      };

      render() {
        return(
          <div id="list" style={ {height: 100, overflow: "scroll"}}>
            { this.state.list.map(i => {
              return (<div>{i}</div>)
            }) }
          </div>
        );
      }

      componentDidMount() {
        setInterval(() => {
          this.setState(state => ({
            list: [...state.list, i++]
          }))
        }, 1000);
      }

      getSnapshotBeforeUpdate(prevProps, prevState) {
        if(prevState.list.length === this.state.list.length) return null;
        const list = document.querySelector('#list');
        console.log(list.scrollHeight, list.scrollTop);
        return list.scrollHeight - list.scrollTop;
      }

      componentDidUpdate(prevProps, prevState, snapShot) {
        if(snapShot === null) return;
        const list = document.querySelector('#list');
        list.scrollTop = list.scrollHeight - snapShot;
        console.log(list.scrollTop);
      }
    }

    ReactDOM.render(<App name="Malza"/>, document.querySelector('#root'));

Component 에러 캐치