2017-03-09 85 views
0

是否存在將redux狀態綁定到對象的既定方法?將redux狀態綁定到對象

我想要做這樣的事情:

MyApi.setStore(myReduxStore, 'stateVar') 

我已經打了通過各種的get/set操作和存儲的聽衆,但它是一個爛攤子。

MyApi.getState =() => store.dispatch(getAction()) 
MyApi.setState = (state) => store.dispatch(setAction(state)) 
let currentState 
store.subscribe(() => { 
    let previousState = currentState 
    currentState = store.getState().stateVar 
    if(previousState !== currentState) { 
    MyApi.stateListener(currentState) 
    } 
}) 
+0

你想達到什麼目的? Redux狀態已經是對象... – Andrey

+0

我的API做一些異步的東西。我希望它能將它的狀態暴露給redux,所以它可以在各種反應組件中找到。 – Simon

+0

知道每個reducer都返回新狀態,您可以創建將從您的API返回狀態的reducer。 – Andrey

回答

0

做API調用終極版的方法是使用一箇中間件像redux-thunkredux-saga。這樣,您可以將api調用與redux分開,並在結果準備就緒時發送操作。從終極版 - 傳奇自述API調用的

例子:

import { call, put, takeEvery, takeLatest } from 'redux-saga/effects' 
import Api from '...' 

// worker Saga: will be fired on USER_FETCH_REQUESTED actions 
function* fetchUser(action) { 
    try { 
     const user = yield call(Api.fetchUser, action.payload.userId); 
     yield put({type: "USER_FETCH_SUCCEEDED", user: user}); 
    } catch (e) { 
     yield put({type: "USER_FETCH_FAILED", message: e.message}); 
    } 
} 

/* 
    Starts fetchUser on each dispatched `USER_FETCH_REQUESTED` action. 
    Allows concurrent fetches of user. 
*/ 
function* mySaga() { 
    yield takeEvery("USER_FETCH_REQUESTED", fetchUser); 
} 

/* 
    Alternatively you may use takeLatest. 

    Does not allow concurrent fetches of user. If "USER_FETCH_REQUESTED" gets 
    dispatched while a fetch is already pending, that pending fetch is cancelled 
    and only the latest one will be run. 
*/ 
function* mySaga() { 
    yield takeLatest("USER_FETCH_REQUESTED", fetchUser); 
} 

export default mySaga; 

那麼你的減速將只設置負載狀態真正的「USER_FETCH_REQUESTED」,更新的「USER_FETCH_SUCCEEDED」狀態和設置一些錯誤狀態「USER_FETCH_FAILED」。

+0

謝謝。我使用了redux-thunk來處理各種涉及將至少一個動作映射到每個api方法的各種事情。如果api被配置爲知道狀態,那麼可能會減少一些。 – Simon

+0

我還沒有使用過thunk,但至少有了傳奇故事,你最終得到了很多樣板代碼。我一直在思考寫一個輔助函數會的只是做: 'createApiHandler( 「USER_FETCH_REQUESTED」,Api.fetchUser, 「USER_FETCH_SUCCEEDED」, 「USER_FETCH_FAILED」)' – OlliM