异步初始状态 React-Redux Redux-Thunk
Async initial state React-Redux Redux-Thunk
使用 React
、Redux
、Redux-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 所必需的,因为我将属性传递给了 table 并且正如我现在所拥有的那样,它只会呈现一行,因为我的初始状态只有一个对象。
关于此的奇怪部分是,当我单击 table 时,它实际上让我获得了所有行,因为数据已加载,但我猜为时已晚。
无论如何,我的问题是,如何通过 api 调用我的后端来初始化我的商店?
你可以给它一个空白的初始状态(空对象或者可能只是一个加载消息),当你的 API 调用返回时,你可以更新状态,你的组件将用它的新数据重新绘制结果。您可以做的另一件事是在使用您的数据调用 returns 之前不初始化您的组件。
编辑以包含示例
在组件的生命周期方法之一中(甚至可能在 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()
);
}
});
对于 redux 初始状态你不能传递异步值,所以你需要传递一些静态空对象(就像你在你的例子中那样)并调用一个动作从服务器获取初始状态并替换你的状态。为了简化所有这些过程,您可以使用 redux async initial state 中间件
使用 React
、Redux
、Redux-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 所必需的,因为我将属性传递给了 table 并且正如我现在所拥有的那样,它只会呈现一行,因为我的初始状态只有一个对象。
关于此的奇怪部分是,当我单击 table 时,它实际上让我获得了所有行,因为数据已加载,但我猜为时已晚。
无论如何,我的问题是,如何通过 api 调用我的后端来初始化我的商店?
你可以给它一个空白的初始状态(空对象或者可能只是一个加载消息),当你的 API 调用返回时,你可以更新状态,你的组件将用它的新数据重新绘制结果。您可以做的另一件事是在使用您的数据调用 returns 之前不初始化您的组件。
编辑以包含示例
在组件的生命周期方法之一中(甚至可能在 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()
);
}
});
对于 redux 初始状态你不能传递异步值,所以你需要传递一些静态空对象(就像你在你的例子中那样)并调用一个动作从服务器获取初始状态并替换你的状态。为了简化所有这些过程,您可以使用 redux async initial state 中间件