react.js의 인스턴스 v 상태 변수


121

react.js에서 타임 아웃 참조를 인스턴스 변수 (this.timeout) 또는 상태 변수 (this.state.timeout)로 저장하는 것이 더 낫습니까?

React.createClass({
     handleEnter: function () {
         // Open a new one after a delay
         var self = this;
         this.timeout = setTimeout(function () {
             self.openWidget();
         }, DELAY);
     },
     handleLeave: function () {
        // Clear the timeout for opening the widget
        clearTimeout(this.timeout); 
     }
    ...
})

또는

React.createClass({
     handleEnter: function () {
         // Open a new one after a delay
         var self = this;
         this.state.timeout = setTimeout(function () {
             self.openWidget();
         }, DELAY);
     },
     handleLeave: function () {
        // Clear the timeout for opening the widget
        clearTimeout(this.state.timeout); 
     }
    ...
})

이 두 가지 접근 방식이 모두 작동합니다. 하나를 사용하는 이유를 알고 싶습니다.


13
로부터 문서 : " NEVER 의 mutate this.state직접 전화로 setState()돌연변이를 대체 할 수 나중에 당신이 만든 취급합니다. this.state이 불변 인 것처럼."
Felix Kling

6
팁 : React의 자동 바인딩 사용 :this.timeout = setTimeout(this.openWidget, DELAY);
David Hellsing 2014 년

1
DELAY는 무엇으로 설정해야합니까?
justingordon

답변:


171

인스턴스에 저장하는 것이 좋지만 state. state업데이트 될 때마다 ( setState댓글에서 제안한 대로만 수행해야 함 ) React render는 실제 DOM을 호출 하고 필요한 변경을 수행합니다.

의 값은 timeout구성 요소의 렌더링에 영향을주지 않으므로 state. 거기에두면 불필요한 호출이 발생합니다 render.


12

@ssorallen이 말한 것 외에도 handleLeave가 호출되기 전에 컴포넌트 마운트 해제를 처리하는 것을 기억해야합니다.

React.createClass({
     handleEnter: function () {
         // Open a new one after a delay
         this._timeout = setTimeout(function () {
             this.openWidget();
         }.bind(this), DELAY);
     },
     handleLeave: function () {
        // Clear the timeout for opening the widget
        clearTimeout(this._timeout); 
     },
     componentWillUnmount: function(){
        // Clear the timeout when the component unmounts
        clearTimeout(this._timeout); 
     },
    ...
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.