react lifescyle정리

Posted by negabaro kim on Saturday, February 16, 2019 Tags: react js   4 minute read

UI를 구성하기 위해서는 화면에 컴포넌트를 그리고(Mounting), 갱신하고(Updating), 지워야(Unmounting) 함. 컴포넌트는 각 프로세스가 진행될 때에 따라 Lifecycle 함수로 불리는 특별한 함수가 실행되는데 개발자는 이를 재정의하여 컴포넌트를 제어함.

이 함수에는 최근 변화가 생겼는데 각 액션에 따른 변화는 이하와 같음.

마운트란?

컴포넌트가 처음 실행될 때 그것을 Mount라고 표현합니다. 컴포넌트가 시작되면 우선 context, defaultProps와 state를 저장합니다. 그 후에 componentWillMount 메소드를 호출합니다. 그리고 render로 컴포넌트를 DOM에 부착한 후 Mount가 완료된 후 componentDidMount가 호출됩니다. https://www.zerocho.com/category/React/post/579b5ec26958781500ed9955

컴포넌트 생성시

before

Constructor -> ComponentWillMount -> render -> ComponentDidMount

after

Constructor -> getDerivedStateFromProps -> render -> ComponentDidMount

prop변화시

before

componentWillReceiveProps -> shouldComponentUpdate -> componentWillUpdate -> render -> componentDidUpdate

after

getDerivedStateFromProps -> shouldComponentUpdate -> render -> componentDidUpdate

state변화시

before

shouldComponentUpdate -> componentWillUpdate -> render -> componentDidUpdate

after

shouldComponentUpdate -> render -> componentDidUpdate

컴포넌트 제거

componentWillUnmount

안바뀜

React.js component의LifeCycle Map

image

image

image

각 메소드의 의미

constructor

처음에 실행됨 constructor(props) 초기화 처리등에 사용

ComponentWillMount(React17이후에 삭제될 예정)

컴퍼넌트 마운트 직전에 한번 실행(render메소드 보다 먼저)되므로 초기화 처리에 사용 setState()하면 render시 한꺼번에 실행됨

통상적으로는 constructor에서 실행되므로 필요없음

componentDidMount

마운트된후에 1번 실행되므로 DOM에 관계된 초기화처리에 사용 즉 render후에 실행됨. 메소드안에서 render된 DOM에 억세스함.

이 안에서 다른 JavaScript 프레임워크를 연동하거나, setTimeout, setInterval 및 AJAX 처리 등을 기술

componentWillReceiveProps(React17이후에 삭제될 예정)

컴포넌트가 프로퍼티값을 받을때(갱신했을때) 불려짐 부모 컴퍼넌트의 State가Props로서 넘겨지고 그변화를 표시이외의것으로 할때 사용

prop 에 따라 state 를 업데이트 해야 할 때 사용하면 유용 이 안에서 this.setState() 를 해도 추가적으로 렌더링 되지않음.

새로운 props는 취득하지 않기떄문에 변수로 받은 nextProps과 this.props를 비교후 어떤 처리를 하기도함

新しい props は取得していないので、引数の nextProps と this.props とで比較可能 setState も実行可能なので props の比較結果を state として扱う場合はこのメソッドで行う

컴포넌트 생성후에 첫 렌더링을 마친 후 호출되는 메서드다. 컴포넌트가 처음 마운트 되는 시점에서는 호출되지 않는다. props를 받아서 state를 변경해야 하는 경우 유용하다. 이 메소드 내부에서 setState를 사용해도 추가적인 렌더링이 발생하지 않는다.

https://teratail.com/questions/175017?modal=q-comp react17 以降から componentWillReceiveProp メッソドが削除される理由について

getDerivedStateFromProps

componentWillReceiveProps과 같은 타이밍에 불려짐 componentWillReceiveProps과의 차이는 갱신할때 뿐만이 아니라 마운트시에도 불려진다는점

static getDerivedStateFromProps(nextProps, prevState)

현재 State값과 merge된후에 Props를 기준으로 State값을 갱신하고싶을때 사용하는

現在の State 値とマージされるので Props を元に State の値を更新したいような場面で使う State を更新する必要がない時は、null を返す

shouldComponentUpdate

コンポーネントを更新してもいいかの判断に使う 戻り値が False の場合は更新が行われないのでパフォーマンスで描画を抑制したいときに使う

prop 혹은 state 가 변경 되었을 때, 리렌더링을 할지 말지 정하는 메소드입니다.

위 예제에선 무조건 true 를 반환 하도록 하였지만, 실제로 사용 할 떄는 필요한 비교를 하고 값을 반환하도록 하시길 바랍니다.

예: return nextProps.id !== this.props.id;

JSON.stringify() 를 쓰면 여러 field 를 편하게 비교 할 수 있답니다.

引数に次の props と state を取得 shouldComponentUpdate(nextProps, nextState) 返り値として真偽値(true/false)を返す必要あり props や state に変更があった際に実行され、返り値によって render を実行するか判断 デフォルトは true で常に render を実行する 主にパフォーマンスチューニングに使用 通常は React.PureComponent を継承して使用する

componentWillUpdate(React17이후에 삭제될 예정)

컴포넌트가 업데이트 되기 전에 실행됩니다.

이 메소드 안에서는 this.setState() 를 사용하지 마세요 – 무한루프에 빠져들게 됩니다

引数に次の props と state を取得 componentWillUpdate(nextProps, nextState) render 前に呼ばれる最後のライフサイクルメソッド ここで setState などの再レンダリングを促す処理は行わない shouldComponentUpdate で false を返した場合は実行されない UNSAFE_ componentWillUpdate

getDerivedStateFromProps

componentWillUpdate と違い、更新前に必ず一度だけ呼ばれる static getDerivedStateFromProps(nextProps, prevState) DOM の更新前後の値を比較して何かしたい場合に使う

componentDidUpdate

コンポーネントが更新された後に呼ばれる メソッド内で再描画された DOM にアクセスできます

컴포넌트가 리렌더링을 마친 후 실행됩니다.

引数に前の props と state を取得 componentDidUpdate(prevProps, prevState, snapshot) render 直後に実行される アップデート後の DOM にアクセスするタイミングとして最適 API への変更完了通知にも利用可能 shouldComponentUpdate で false を返した場合は実行されない

componentWillUnmount

컴포넌트가 DOM 에서 사라진 후 실행되는 메소드입니다.

コンポーネントがアンマウントされる前に呼ばれる 定期的に実行される処理や DOM のイベントを解除するために使う

コンポーネントがアンマウントされる直前に実行 各種コンポーネントに紐づいた処理のクリア等に使用

エラーハンドリングに関するライフサイクルメソッド

componentDidCatch

React v16 から実装 引数にスタックトレースが入った error とその他の情報が入った info を取得 componentDidCatch(error, info) 記述したコンポーネントのエラーは検知できないため、子コンポーネントで発生したエラーを検知するためのメソッド

라이프사이클 example

//コンポーネントの作成
class Component extends React.Component {
  constructor(props) {
    super(props);
  }
  componentWillMount(){
    console.log("컴퍼넌트 마운트 전에 실행됩니다.")
  }
  componentDidMount(){
    console.log("コンポーネントのマウント直後に呼ばれます")
  }
  componentWillReceiveProps(nextProps){
    console.log("コンポーネントが新しいpropsを受け取ったときに呼ばれます")
  }
  shouldComponentUpdate(nextProps, nextState){
    console.log("コンポーネントがアップデートされる前1によばれます")
    return true;
  }
  componentWillUpdate(nextProps, nextState){
    console.log("コンポーネントがアップデートされる前2に呼ばれます")
  }
  componentDidUpdate(){
    console.log("コンポーネントがアップデートされた後に呼ばれます")
  }
  componentWillUnmount(){
    console.log("コンポーネントがアンマウントされる直前に呼ばれます")
  }
  render() {
    return (
      <div>Component</div>
    )
  }
};

outing: Creating 중인 componentWillMount()에서 Ajax 요청을 날리면 응답 시간만큼 컴포넌트를 그리는 것이 늦어짐을 알 수 있습니다. 따라서 일반적으로 componentDidMount()에서 Ajax 요청을 하는 게 낫다는 것을 알 수 있습니다. Updating: Receiving State 중에 setState() API를 호출하면 프로세스가 끝난 후 또다시 Receiving State 할 것을 알 수 있습니다. 따라서 setState() API를 해당 Lifecycle 함수에서 호출하면 개념적으로 무한 루프에 빠질 수밖에 없다는 것을 알 수 있습니다. (물론 실제로도 무한 루프에 빠지게 됩니다.)

처음에 실행되는 라이프 사이클

サンプルを見ると一目瞭然だが、最初に実行されるライフサイクルは以下の 5 つである。

componentDidMount render componentWillMount getInitialState getDefaultProps props は getDefaultProps ではなく ReactDOM.render で指定したほうが良いため、getDefaultProps はなるべく使用しないほうが良い。

getDefaultProps: function() { return {name: ‘foo’}; },

변경후의 라이프사이클

サンプルに a と入力すると以下の内容が表示される。

componentDidUpdate{“name”:”foo”}{“len”:0} render componentWillUpdate{“name”:”foo”}{“len”:1,”val”:”a”} shouldComponentUpdate{“name”:”foo”}{“len”:1,”val”:”a”}

https://medium.com/@baphemot/understanding-react-react-16-3-component-life-cycle-23129bc7a705
https://iwb.jp/react-component-lifecycle-howto-sample/
https://qiita.com/f-a24/items/40b83d4c6c7d147cda9e
https://medium.com/little-big-programming/react%EC%9D%98-%EA%B8%B0%EB%B3%B8-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8%EB%A5%BC-%EC%95%8C%EC%95%84%EB%B3%B4%EC%9E%90-92c923011818
https://velopert.com/1130
https://morizyun.github.io/javascript/react-js-tips-lifecycle-outline.html