2017-06-13 8 views
0

いくつかのデータを含むプロジェクトを作成するアプリをいくつか書いています。フィールドの1はmembersです。これはプロジェクトメンバー(配列内のオブジェクト)の配列です。プロジェクトの更新機能がありますが、プロジェクトのメンバーデータを更新する際に問題があります。私のサーバー側では、私はいつも古いデータを受け取ります。リアクション状態のオブジェクトを更新してデータベースに送信する

メソッドの魔法使いはメンバ配列の状態を更新します。それは、そのデータ

updateMember(data){ 

     let objectIndex = this.state.members.filter((member,index) => { 
      if(data.id === member.id) return index; 
      return -1; 
     }) 

     if(objectIndex !== -1){ 

      let stateCopy = Object.assign({},this.state); 
      stateCopy.members[objectIndex] = data; 

      this.setState({ 
       members: stateCopy.members 
      })   

     } 

    } 

その後、私はデータがボタンをクリックするだけで提出やって REST APIに問い合わせを行う、いくつかのアクションに状態データを送信しています(更新すべきメンバー)に必要なオブジェクトを検索し、更新します。 サーバーにデータを送信する前に、私が送信したデータについて確かめるために console.log()を実行しました。私は enter image description here を持っていますが、 request.bodyの中にあるサーバーでは、メンバー配列から古いオブジェクトだけを受け取ります。なぜそれが起こるのか分かりません。たぶん私は何か間違っています...あなたの助けとアドバイスを探しています。

+0

今うまく動作しますが、それはupdateMember関数自体であるか、別の –

+0

'setState'は非同期です。 'setState'を呼び出すことはできず、少なくとも一つのイベントループティックを待たずにすぐに状態から読み込むことはできません。 –

答えて

0

setStateが非同期であり、それを呼び出すと即時にthis.state値が更新されないことが考えられます。

setStateを呼び出した直後にデータをサブミットするかどうかを確認し、そうであれば、次の引数としてsetStateに渡すことができるコールバック関数でこれを行うようにしてください。

+0

状態を設定しています(メンバ配列内の一部のメンバを更新しています)。その後、フォームを送信するボタンをクリッキングしています(paren'tsメソッドを呼び出すローカル関数は、オブジェクトに 'this.state'フィールドを渡します)。親のメソッドはこのデータを受け取り、アクションディスパッチを実行します。サーバ)。このアクションは、サーバー上で送信されるいくつかのペイロードを受け取る必要があるので、子の引数データから受け取ったものをこのアクションに渡します。 – vladja

+0

私が 'console.log(this.state.members)'を実行していれば親の関数)私はコンソールで同じオブジェクトを参照してください。画像の[オブジェクトオブジェクト]にはデータが変更されたオブジェクトが含まれています...なぜサーバー上で間違ったデータが表示されているのかわかりません – vladja

+0

コンソールログを作成するときにオブジェクトの内容が表示されません呼び出しの瞬間。オブジェクトを展開してコンテンツを表示する瞬間に、そのオブジェクトのコンテンツが表示されます。私の助言に従ってみて、setState関数のコールバック引数の中にサブミットコールを入れてみてください。 – Amid

0

問題はupdateMemberにありました。変更し

updateMember(data){ 

     let objectIndex = this.state.members.filter((member,index) => { 
      if(data.id === member.id) return index; 
      return -1; 
     }) 

     if(objectIndex !== -1){  

      let stateCopy = Object.assign({},this.state); 

      stateCopy.members.splice(objectIndex,1, data); 

      this.setState({ 
       members: stateCopy.members 
      }) 

     } 

    } 

そして、すべてはあなたがAPI呼び出しを持っています

関連する問題