15

使用React, ReduxRedux-thunk我想通过服务器请求(API 调用)获得初始状态,但我似乎无法让它工作。

到目前为止我得到了什么:

var Redux = require('redux');
var carReducer = require('./reducers/cars');
var thunk = require('redux-thunk').default;

var initialState = require('./reducers/initialState');

var rootReducer = Redux.combineReducers({
    cars: carReducer
});

module.exports = Redux.applyMiddleware(thunk)(Redux.createStore)(rootReducer, initialState.loadInitial());

这是我最初的商店创建。我的InitialState样子是这样的:

var $ = require('jquery');

module.exports = {
    loadInitial: loadInitial
};

function loadInitial() {
    return {
        cars: [
            {}
        ]
    }
}

当我尝试将其loadInitial转换为$.get('api/...')时,Redux 告诉我我需要一个初始状态才能使其工作。

在我的减速器中,我有一个加载方法:

function updateReducer(state, action) {
    switch (action.type) {
        case 'load':
            return action.data;
        case 'update':
            return updateCars(action.data, state);
        default:
            return action.data || initialState.loadInitial().cars;
    }
};

但同样,如果我使用 - 作为默认值 - 异步调用,它似乎不起作用。

我真正想要的是用来自数据库的任何东西来初始化我的商店。这对于我的 HandsonTable 来说是必需的,因为我将属性传递给了表,并且正如我现在所拥有的那样,它只会为我呈现一行,因为我的初始状态只有一个对象。

奇怪的是,当我点击表格时,它实际上得到了我所有的行,因为数据已加载,但我猜为时已晚。

无论如何,我的问题是,如何通过对后端的 api 调用来初始化我的商店?

4

2 回答 2

5

你可以给它一个空白的初始状态(空对象或者只是一个加载消息),当你的 API 调用返回时,你可以更新状态,结果你的组件将用它的新数据重绘。您可以做的另一件事是在调用返回您的数据之前不初始化您的组件。

编辑包括示例

在组件的一种生命周期方法中(甚至可能在 getInitialState 中):

getInitialState: function() {
  var oThis = this;

  $.get({
    url: 'api...',
    success: function (...) {
      oThis.setState({...data returned by server});
    }
  });

  return {};
}

或者,沿着这些思路:

$.get({
  url: 'api...',
  success: function (...) {
    var oStore;

    // oStore = response from server

    ReactDOM.render(
      <ReactRedux.Provider store={oStore}>
        <MyComponent/> 
      </ReactRedux.Provider>
      , document.getElementById()
    );
  }
});
于 2016-05-25T11:43:28.563 回答
4

对于 redux 初始状态,您不能传递异步值,因此您需要传递一些静态空对象(就像您在示例中所使用的那样)并调用一个操作以从服务器获取初始状态并替换您的状态。为了简化所有这些过程,您可以使用redux 异步初始状态中间件

于 2016-06-21T13:22:22.173 回答