2017-05-24 4 views
2

ここでは本当に混乱します。私はそれがコンソールエラーを返したときに私の登録フォームのエラーがサーバー側で、今いくつかの変更を必要とルータ4を反応させ、ために更新:This.setstateはコールバック内でアンマウントします

setState(...): Can only update a mounted or mounting component. This usually means you called setState() on an unmounted component. This is a no-op. Please check the code for the RegisterForm component.

本当に混乱しています私はAccounts.createUser機能のthis.setState({ errors: {createUserError: "Test error" }});外を実行する場合、私はドンは」 consoldeエラーを受け取りません。

handleSubmit(event) { 
    event.preventDefault(); 

    this.setState({errors: {} }, function() { 
     var data = { 
     email: this.state.email, 
     password: this.state.password 
     }; 

     Accounts.createUser(data, (error) => { // This arrow function preserves this 
     if(error) { 
      this.setState({ errors: {createUserError: error.reason }}); 
     } 
     }); 
    }); 
    } 
+0

コンポーネントがアンマウントされた理由をもっと詳しく説明する必要があります。 @GProstが彼のコメントで述べたように、このタイプの状態はコンポーネントの外にある可能性が最も高いので、ログイン結果から離れる前にログイン結果が明確になるまで待つべきだと思われます。 – MasterAM

+0

私は問題を追跡することができました。これは、Public/Authenticatedルートコンポーネントとリンクされ、コンポーネントがアンマウントされました。 – bp123

答えて

1

2番目のsetStateが呼び出される前にコンポーネントがマウント解除されていると、これが起こっている可能性があります。おそらくAccounts.createUser()は、ルータのナビゲーションやコンポーネントをアンマウントする何かを引き起こします。

+0

どうすれば再びマウントできますか? – bp123

+0

これは、自分でコンポーネントを削除したことを意味します。一般的に、最善の解決策は、状態をコンポーネントから外すことです。したがって、マウントされているかどうかを確認する必要はありません。 – Sulthan

+0

アンマウントされたコンポーネントは、htmlページに表示されないコンポーネントです。このコンポーネントをアンマウントするのが合理的な場合は、アンマウントした後で何かをやってみるべきではないでしょうか?アンマウントが合理的でない場合は、それを防ぐ必要があります。 – GProst

関連する問題