2016-05-11 7 views
0

は私が持っている完了した後にのみ、何かをします。ReactJSは、アクションが

アクションが完了した後でのみ、どのようにsetStateを実行できますか(成功または失敗に関係なく)?ここで


は私のアクションです:

import qwest from 'qwest'; 

export default function SetJobChaserDate(actionContext, payload) { 
    return qwest.post('jobs/set/chaser-date', {id: payload.id, date: payload.date}, {responseType: 'json'}) 
     .then(function (response) { 

      actionContext.dispatch('RECEIVED_JOBS_DATA', {data: response.response, clear: false}) 

     }) 
} 

import { EventEmitter } from 'events'; 

class JobStore extends EventEmitter { 

    constructor() { 
     super(); 
     this.jobs = new Map(); 
     this.counts = {}; 
     this.loading = false; 
    } 

    handleJobsData(payload) { 
     if (payload.clear === true) { 
      this.jobs = new Map(); 
     } 
     payload.data.jobs.forEach((job) => { 
      this.jobs.set(job.id, job); 
     }); 
     if(payload.data.counts) { 
      this.counts = payload.data.counts; 
     } 
     this.loading = false; 
     this.emit('change'); 

    } 

    handleReceiving() { 
     this.loading = true; 
     this.emit('loading'); 
    } 

    handleCounts(payload) { 
     console.log(payload) 
    } 

    getCounts() { 
     return this.counts; 
    } 

    getJobs() { 
     return this.jobs; 
    } 

    dehydrate() { 
     return this.jobs; 
    } 

    rehydrate (state) { 

    } 

} 

JobStore.dispatchToken = null; 

JobStore.handlers = { 
    'RECEIVED_JOBS_DATA': 'handleJobsData', 
    'RECEIVED_COUNTS' : 'handleCounts', 
    'RECEIVING_JOB_DATA': 'handleReceiving' 
}; 

JobStore.storeName = 'JobStore'; 

export default JobStore; 

更新:

componentWillReceiveProps() { 
     this.context.getStore(JobStore).on('change',() => { 
      this.setState({ 
       updatingField: false 
      }); 
     }); 
    } 

    onKeyPress(id, e) { 
     if (e.key == 'Enter') { 
      this.saveField(id, e.target.value); 
     } 
    } 

    onBlur(id, e) { 
     this.saveField(id, e.target); 
    } 

    saveField(id, target) { 
     console.log(target) 
     this.setState({ 
      updatingField: true 
     }) 
     this.context.executeAction(SetJobChaserDate, {date: target.value, id: id}); 
     this.setState({ 
      editingChaser: false, 
      editingTrackingSent: false 
     }) 
    } 
+0

あなたが言っている this.setStateこと({ editingChaser:偽、 editingTrackingSent:偽、 updatingField:偽 }) がExecuteActionメソッドが発火するとすぐに設定されていますか? –

+0

コンポーネントがロードされ、アクションが完了した後に設定されます。 – imperium2335

答えて

0

あなたはupdating状態を使用している、そのよあなたのプロセスは非同期です。ディスパッチしているコードは確かに約束されており、処理が完了したらアクションをディスパッチします:'RECEIVED_JOBS_DATA'

したがって、updatingFieldは、店舗から来るコンポーネント小道具に移動する必要があります。また、アクションの開始と終了時に減速機で変更されます。

このようにして、コンポーネント内のthis.props.updatingFieldを使用できます。値はストアから取得され、外部リクエストの現在の状態に依存します。

このようにして、ローカル状態の代わりにグローバル状態を優先する1つのReact/Fluxのベストプラクティスに従います。

+0

私は "ShippingTable.js:37 Uncaught TypeError"を取得しています: '未定義のプロパティ'を読み取ることができません、また、=>何とかself = thisを使用しないように=>使用できませんか? – imperium2335

+0

私の行動を掲載しました。編集を参照してください。 – imperium2335

+0

これはアクションですが、メソッド内では 'executeAction'を使用します。そのコードは何ですか?あなたの関数は約束を返しますが、ディスパッチャーはこの約束を呼び出し元に転送していないようです。 – Pandaiolo