0

に反応私が使用してプロジェクト内のコードの単純な部分を有する反応-ReduxのES6と(バベルを通じて)+反応:動作は、クラスコンストラクタ

class HomeScreen extends React.Component { 
    // problematic piece of code: 
    showLockTimer = setTimeout(this.authenticate, 2000); 

    leaveAnimationTimer = setTimeout(() => { 
    this.setState({ hide: true }); // setState is correctly called 
    }, 1000); 

    authenticate =() => { // Never runs. 
    // do some stuff... 
    this.props.showLock(); 
    } 
} 

何らかの理由でメソッドが呼び出されることはありません認証...しかし、私はクラスのコンストラクタの内部でのsetTimeoutを置けば、それは動作します:

class HomeScreen extends React.Component { 
    // This is the only changed code: 
    constructor(props) { 
    super(props); 
    this.showLockTimer = setTimeout(this.authenticate, 2000); 
    } 

    leaveAnimationTimer = setTimeout(() => { 
    this.setState({ hide: true }); // setState is correctly called 
    }, 1000); 

    authenticate =() => { // Now it runs! 
    // do some stuff... 
    this.props.showLock(); 
    } 
} 

は私が矢印機能と、非常によく結合thisを理解と思ったが、私はその理由を理解することはできませんしない彼は起こる?私はこの問題のためにたくさんのGoogleを試みましたが、同様の質問を読んでいましたが、それを説明するものは何も見つかりませんでした。

申し訳ありませんが重複した質問です。

+1

最初の例では、 'ShowLockTimer'の上に' authenticate'メソッドを移動します。 – Krizzu

答えて

2

最初の例では、それが存在する前にthis.authenticateを使用します。別の矢印の関数にラップする() => {this.authenticate()}

+0

ああ私はそれが簡単だとは信じられません!だから、私はjavascriptでクラスメソッドを定義する順序は重要ですか? 最後に何が起こったのですか?コンストラクタは、オブジェクトがそのメソッドで初期化された後にのみ呼び出されますか? – andredp

+1

クラスメソッドは任意の順序で定義できますが、これらはクラスメソッドではなく、パブリッククラスフィールドです。クラス本体の 'foo = ...'のようなプロパティは、 'super()'があるクラスコンストラクタのように実行されるので、順序が重要です。 – loganfsmyth

関連する問題