2017-02-12 17 views
0

私はcomponentDidMount関数で状態を更新したコンポーネントを持っています。状態はどこで更新する必要がありますか?

https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-did-mount-set-state.md

それは

componentDidMount(無ましたマウント・セット状態)でSETSTATEの

防止の使用

を言う:私は、このページに私を指摘リンターの警告を得ましたコンポーネントをマウントした後の状態を更新すると、2番目のrender()呼び出しがトリガーされ、プロパティ/レイアウトのスラッシングが発生する可能性があります。

代わりに状態を更新する必要がありますか?

これは私のcomponentDidMount機能である:

componentDidMount(){ 
    this.interval = setInterval(() => { 
     this.setState({ 
     frame: this.state.frame + 1 
     }); 
    }, this.props.interval); 
    } 

そして、これは私の関数でレンダリングしている:実際には、あなたは、setStateを使用していない

constructor(props, context){ 
    super(props, context); 

    this.state = {frame: 1}; 
} 
+2

コンストラクタはどうですか? –

答えて

2

私のコンストラクタをsetState、このルールを使用する非同期操作を定義しています私は同期操作setStateについて考えているので、最初のレンダリングがインターバルを開始する前になることが確実であれば、このルールをeslint configで無効にすることができます。

チェックアウトcomponentDidMountにSETSTATEを行うhttps://github.com/airbnb/javascript/issues/684#issuecomment-264094930

@ljharb から、このスレッドやコメントは、目に見えるレンダリングのフラッシュが発生します。

しかし、サーバーのレンダリングを行う場合、ブラウザー環境を必要とするものは、クライアント専用であるが、クライアントとサーバーの両方で実行されるため、componentDidMountに入れる必要があります。

+0

私は、非同期操作の意味を理解しています。リンターで警告が無効になっていても、ブラウザのコンソールで次のように表示されます。警告:setState(...):マウントされているコンポーネントまたはマウントされているコンポーネントのみを更新できます。これは、通常、アンマウントされたコンポーネントに対してsetState()を呼び出したことを意味します。これはノーオペレーションです。 –

+1

'componentWillUnmount()'でタイマーを削除しますか?私はあなたがその警告をどうやって得るのか分かりません。 – aaaaaa

+2

ああ..私はcomponentWillUnmountを間違って綴っていた。:(。これは間違いのない間違いのために、エラーを無視するのが正当だと思われ、他の警告が正しいとマークした。 –

関連する問題