2017-03-28 28 views
5

と私は非同期が反応選択(Select.Async)を実装してみてください。問題は、redux-sagaでフェッチを行いたいということです。したがって、ユーザーが何かを入力した場合は、fetch-actionがトリガーされます。 Sagaはレコードを取り出してストアに保存します。これまでのところ動作します。 残念ながら、loadOptionsは約束を返さなければならないか、コールバックを呼び出す必要があります。新たに取得したオプションを変更するプロパティで伝播しますので、私は非同期コールを取得するために行うサガと一緒Select.Asyncを使用する方法を参照してくださいません。助言がありますか?使用して、非同期反応選択Reduxの-佐賀

<Select.Async 
    multi={false} 
    value={this.props.value} 
    onChange={this.onChange} 
    loadOptions={(searchTerm) => this.props.options.load(searchTerm)} 
    /> 

私はクラス変数にコールバックを割り当て、componentWillReceivePropsで解決するハックがありました。その方法は醜いので、私はより良い解決策を探して正しく動作しませんでした。

おかげ

答えて

8

redux-sagaは非同期react-selectのオプションを受け取るような副作用を処理するためのものです。だから、非同期のものをredux-sagaに残すべきです。私はreact-selectを使用したことがありませんが、ただのドキュメントを見て、私はそれをこのように解決するだろう:

あなたのコンポーネントは非常に単純な取得します。ただあなたのredux店からvalueoptionsを取得してください。 optionsRequestedOPTIONS_REQUESTEDアクションのアクションの作成者である:

const ConnectedSelect = ({ value, options, optionsRequested }) => (
    <Select 
    value={value} 
    options={options} 
    onInputChange={optionsRequested} 
    /> 
) 

export default connect(store => ({ 
    value: selectors.getValue(store), 
    options: selectors.getOptions(store), 
}), { 
    optionsRequested: actions.optionsRequested, 
})(ConnectedSelect) 

onInputChangeによってtriggedさOPTIONS_REQUESTEDアクションの佐賀定義時計、サーバからのsearchTermでデータをロードし、Reduxのストアを更新するOPTIONS_RECEIVEDアクションをディスパッチします。言い換えれば

function* watchLoadOptions(searchTerm) { 
    const options = yield call(api.getOptions, searchTerm) 
    yield put(optionsReceived(options)) 
} 

は:可能な限り純粋なコンポーネントを作成し、私はこの答えはあなたのために有用であった期待しredux-saga

内のすべての副作用/非同期呼び出しを処理します。

+0

あなたの答えをありがとう!はい、あなたが説明したのとまったく同じ問題を解決したいと思います。ポイントは、私が "optionsRequested"を呼び出さなければならない、react-selectの "onChange"(loadOptions)は、返される約束を期待していることです。それはあなたがそこにフェッチを呼び出すと期待しているからです。私が知っている限りでは、サガを持つコンポーネントで約束を解決する方法はありませんか? https://github.com/JedWatson/react-select#usageと 'onChange'は約束を返す必要はありません: – MethodenMann

+0

こんにちは、私はここのドキュメントを見ました。それは単なるイベントハンドラです。私の例では、私はその後、Reduxので派遣され、最終的にサービス要求を行う 'saga'によって処理されます' optionsRequested'アクションクリエーターを呼び出すために、 'onChange'を使用しています。 – Alex

+0

ねえ。ああ、すみません、私は今混乱しています。私は自分のサガでsearchTermとしてselectの値を使用したくない。 React-selectでは、入力して検索することができます。この検索で​​私は選択するユーザーのための私の反応を選択するための新しいオプションをフェッチしたい。これは、何千ものレコードが存在する可能性があり、最初はそれらをすべてロードしたくないからです。これはloadOptionsで実現でき、そこには約束が必要です。 – MethodenMann

関連する問題