2016-07-20 13 views
0

私はかなり新しい反応を示し、今日は奇妙な問題に遭遇しました。私は、この特定の機能はADDTO/removeFromTransactionSubmissionと呼ばれる親受け継が関数を呼び出すhandleCheckBoxClick呼び出される関数()Reactjs:チェックボックスの状態が更新され、コールバック関数が終了したときに復帰します。

handleCheckboxClick : function (e) { 
    this.setState({isChecked : e.target.checked}, 
     function() { 
      if (this.state.isChecked) { 
       this.props.addToTransactionSubmissions(
        this.props.submissionGuid, 
        this.props.paymentInfo 
       ); 
      } else { 
       this.props.removeFromTransactionSubmissions(
        this.props.submissionGuid 
       ); 
      } 
     } 
    ); 
} 

を持っています。次のように両方のためのコードは次のとおりです。

addToTransactionSubmissions : function (guid, paymentInfo) { 
    if (Object.keys(this.state.transactionSubmissions).length === 0) { 
     this.setState({submissionType : paymentInfo.status_description.toLowerCase()}, 
      function() { 
       console.log('it set the state though'); 
       console.log(this.state.transactionSubmissions); 
       this.toggleButtons(this.state.submissionType); 
      } 
     ); 
    } 
    var newTansactionSubmissions = update(this.state.transactionSubmissions, 
     { 
      $merge : {[guid] : paymentInfo} 
     }); 
    this.setState({transactionSubmissions : newTansactionSubmissions}, 
     function() { 
      console.log('state is now', this.state.transactionSubmissions); 
     } 
    ); 
}, 
removeFromTransactionSubmissions : function (guid) { 
    if (Object.keys(this.state.transactionSubmissions).length === 0) { 
     this.setState({submissionType : undefined}, 
      function() { 
       this.toggleButtons(this.state.submissionType); 
      } 
     ); 
    } 
    var newTransactionSubmission = update(this.state.transactionSubmissions, 
     { 
      [guid] : {$apply: function (x) {return undefined}} 
     }); 
    this.setState({transactionSubmissions : newTransactionSubmission}, 
     function() { 
      console.log('here in remove Transaction'); 
     }); 
} 

私はに実行し、問題がADDTO/removeFromTransactionSubmissionsが呼び出されたときに、チェックボックスは述べて変化しないということである、ADDTO/removeFromTransactionSubmissionsが呼び出される前の状態が変化しているにもかかわらず。 Firebugを使用してさらにデバッグすると、1)関数がすべて正しく呼び出されていること、2)addTo/removeFromTransactionSubmissionsに状態を設定しないと、すべてが問題なく実行されていること、3)handleCheckboxClickが完全に終了した後、

ReactjsがDOMを更新しようとしているときに何らかの理由で状態が失われていると思われます。しかし、なぜこれが当てはまるのか分からず、さらにデバッグする方法がわかりません。また、チェックボックスは子コンポーネントにあり、transactionSubmissionsステートは親にあり、チェックボックスをクリックすると、transactionSubmissionsが変更されます(Child Actionは親ステートを変更します)。これが問題について間違ったやり方であれば教えてください。

基本的には、ボックスをクリック/クリック解除するたびに、対応するオブジェクトをオブジェクトのIDマップとの間で削除します。間違って何かしていますか?

ありがとうございました!

答えて

0

私は別のaproachを使うべきだと思います。

handleCheckboxClick : function (e) { 
    this.setState({isChecked : e.target.checked}) 
} 

また、あなたはそれがいくつかのエラーをスローすることができ、sequencially SETSTATEを呼び出すべきではありません

componentWillUpdate() 
{ 
      if (this.state.isChecked) 
      { 
       this.props.addToTransactionSubmissions(
       this.props.submissionGuid, 
       this.props.paymentInfo); 
      } else { 
      this.props.removeFromTransactionSubmissions(this.props.submissionGuid); 
      } 
} 

の方法componentWillUpdate(https://facebook.github.io/react/docs/component-specs.html#updating-componentwillupdate)またはcomponentDidUpdate(https://facebook.github.io/react/docs/component-specs.html#updating-componentdidupdate)を追加し、状態変化後が発生しなければならない変更を処理コンポーネントの更新中にそのコンポーネントを変更しようとしています。

あなたのコードがsetStateを呼び出すたびに、reactがすべてのdomを調べ、変更内容を確認して変更を再度レンダリングし、処理を保存します。 Ref:https://facebook.github.io/react/docs/component-api.html#setstate

+0

お返事ありがとうございます。私はそれを試してみよう。なぜ私はsetStateを順番に呼び出さないでください。 2つのsetStatesは状態の2つの異なるものを変更しているので、私の理解からは、互いに上書きしないでください。さらに詳しい説明として、this.state [state_variable] =すべての場合の値を使用するのは間違っていますか?私はtransactionSubmissionsを変更すると、実際には再レンダリングを望んでいません。 –

+0

こんにちは@ChangYangJiao。あなたがsetStateを呼び出すときに私が理解している限り、docはすべてのDOMを実行し、chanedしレンダリングした要素をチェックします。したがって、setStateを2回連続して呼び出すと、同じメソッドが同じチェックを行う同じメソッドを通過しますが、2回目に渡されると、呼び出した最初のsetStateによってDOMが更新されることがあります。コンポーネントの更新中にDOMが変更されたエラーをスローします。 –

+0

このstate.variable = stateの値は、反応原則によれば正しいとは限りません。これは反応文書からのものです。決して、this.stateを直接変更しないでください。後でsetState()を呼び出すと、あなたが行った突然変異が置き換えられる可能性があります。それが不変であるかのようにthis.stateを扱う。 setState()はこれをただちに変更しません。保留中の状態遷移を作成します。このメソッドを呼び出した後this.stateにアクセスすると、潜在的に既存の値が返される可能性があります。 setStateへの呼び出しの同期動作が保証されておらず、パフォーマンスの向上のために呼び出しをバッチ処理することがあります。 –

関連する問題