2015-12-13 37 views
4

我最近在我的項目中使用了迴流,這裏有一個問題令我困惑不已。
作爲迴應模式,我在我的React組件中調用動作,並在迴應存儲中獲取正在傾聽動作的遠程數據。我的組件聽取商店中數據的變化。例如獲取項目列表。到目前爲止,沒關係。
但有時,我想要一個通知,告訴我該操作已成功執行。
例如,我有一個UserStore,一個UserActions和一個監聽UserStore的LoginComponent。當用戶輸入用戶名和密碼並單擊提交按鈕時,LoginComponent調用UserActions.login(),並且我在UserStore中發送登錄請求。登錄成功後,UserStore從響應中獲取用戶信息。
在這個時候,我想給LoginComponent一個提示,比如'Login Success'。我有兩種方法可以做到,但我認爲兩者都不夠好。執行迴流動作後觸發通知/回調

  1. 在UserStore的數據中給出一個標誌,然後觸發更改。當UserStore觸發數據更改事件時,LoginComponent獲取此標誌,然後提示。因爲UserStore不僅會在登錄成功時觸發數據更改,還會在其他一些情況下(如從Cookie或sessionStorage獲取用戶信息)觸發數據更改,所以LoginComponent必須爲此登錄成功標誌添加一個if-else,如果它是登錄成功,然後提示。
    我不認爲這是一個很好的模式,因爲該標誌只是爲了提示而不是像用戶的信息那樣的真實數據。如果我也想在用戶更改密碼後提示,我將需要另一個標誌字段。
  2. 將承諾(或回調函數)傳遞給UserAction調用,並在登錄成功後解析此承諾,然後LoginComponent可以提示promise.then。這似乎比第一個好,但是這不是一個反模式,因爲通過行動傳遞給商店的承諾可能會打破迴流的單向

我想問的是:什麼是常見的/適當的方式來解決這個問題?

我不是來自英文的地區,也不擅長英文表達。這是我在stackoverflow.com的第一個問題。我不清楚我是否清楚地描述了我的問題。所以,如果你對這個問題有一些建議,請告訴我,我會改進它來幫助那些關心這個問題的人。非常感謝!

+0

我認爲有兩個與你的態度沒有問題。它不會打破流動的單向概念,因爲當視圖改變時它會觸發商店收聽的動作。商店使它變化,然後用觸發器更新視圖。我和你有同樣的困境,儘管不是異步調用。你可以閱讀我的博客文章http://www.dimagimburg.com/reflux-sweeper-react-reflux-and-immutablejs-explained-by-example/ –

+0

@DimaGimburg謝謝!也許我太擔心這件事。 –

回答

1

您可以在觸發器中包含一個參數。

export default class AppCtrl extends AppCtrlRender { 
 
    constructor() { 
 
    super(); 
 
    this.state = getState(); 
 
    } 
 

 
    componentDidMount =() => { this.unsubscribe = BasicStore.listen(this.storeDidChange); } 
 
    componentWillUnmount =() => { this.unsubscribe(); } 
 
    storeDidChange = (id) => { 
 
    switch (id) { 
 
     case 'data1': this.setState({Data1: BasicStore.getData1()}); break; 
 
     case 'data2': this.setState({Data2: BasicStore.getData2()}); break; 
 
     case 'data3': this.setState({Data3: BasicStore.getData3()}); break; 
 
     default: this.setState(getState()); 
 
    } 
 
    } 
 
}

import Reflux from 'reflux'; 
 

 
import Actions from '../actions/sa.Actions'; 
 
import AddonStore from './Addon.Store'; 
 
import MixinStoreObject from './Mixin.Store'; 
 

 
function _GotData(data) { this.data1 = data; BasicStore.trigger('data1'); } 
 

 
let BasicStoreObject = { 
 
    init() { this.listenTo(AddonStore, this.onAddonTrigger); }, 
 
    data1: {}, 
 
    listenables: Actions, 
 
    mixins: [MixinStoreObject], 
 
    onGotData1: _GotData, 
 
    onAddonTrigger() { BasicStore.trigger('data2'); }, 
 
    getData1() { return this.data1; }, 
 
    getData2() { return AddonStore.data2; }, 
 
    getData3() { return this.data3; } 
 
} 
 
const BasicStore = Reflux.createStore(BasicStoreObject); 
 
export default BasicStore;

+0

我對'BasicStore.getData1()'有點困惑。我在想,商店是由組件監聽的,所有數據都應該通過'trigger'傳輸(僅)。那麼是否有點'反模式',使用像'BasicStore.getData1()'這樣的函數直接從商店獲取數據? –

+0

在一個複雜的應用程序中,有許多數據元素將自己限制在由觸發器返回的數據上並不實際。而在一個簡單的應用程序,它可能會工作。迴流提供了使用最適合您需求的方法的靈活性。 –