【发布时间】:2018-01-07 00:46:58
【问题描述】:
我有一个组件,我从其中调用一个操作以根据数据从 API 获取结果:
按下此组件时:
在 componentWillMount 上调用 fetchProducts() 函数。
下面这个函数被调用:
fetchProducts(){
this.props.fetchProductsHomeFromAPI({city:'ABCD'});
}
mapDispatchToProps 是这样的:
function matchDispatchToProps(dispatch){
return bindActionCreators({selectLocation: selectLocation, fetchProductsHomeFromAPI: fetchProductsHomeFromAPI}, dispatch);
}
动作如下:
var FETCHING_PRODUCTS="FETCHING_PRODUCTS";
var FETCHING_PRODUCTS_SUCCESS = "FETCHING_PRODUCTS_SUCCESS";
var FETCHING_PRODUCTS_FAILURE = "FETCHING_PRODUCTS_FAILURE";
var API = "https://api.abcd.in/get-home-products";
export function fetchProductsHomeFromAPI(data) {
return (dispatch) => {
dispatch(getProducts())
fetch(`${API}`, {
method: 'POST',
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({
city: data.city
})
})
.then(res =>res.json())
.then(json =>dispatch(getProductsSuccess(json.results)))
.catch(err => dispatch(getProductsFailure()))
}
}
function getProducts() {
return {
type : FETCHING_PRODUCTS,
}
}
function getProductsSuccess(data) {
return {
type : FETCHING_PRODUCTS_SUCCESS,
data
}
}
function getProductsFailure( ) {
return {
type : FETCHING_PRODUCTS_FAILURE,
}
}
组合减速器是:
import {combineReducers} from 'redux';
import LocationReducer from './reducer-location';
import ActiveLocationReducer from './reducer-active-location';
import productsHome from './reducer-products-home';
export default combineReducers({
location: LocationReducer,
activeLocation: ActiveLocationReducer,
productsHome : productsHome,
})
在 index.android.js 中存储是这样的:
import { persistStore, autoRehydrate } from 'redux-persist'
import { Provider } from 'react-redux';
import {createStore, compose } from 'redux';
import combineReducers from './src/Redux/reducers/combineReducers';
const store = compose(autoRehydrate())(createStore)(combineReducers)
persistStore(store, {storage: AsyncStorage}, () => {
console.log(store);
})
export default class MyApp extends Component {
render() {
return (
<Provider store = {store}>
<App />
</Provider>
);
}
}
我收到此错误是 操作必须是普通对象。使用自定义中间件进行异步操作。
请帮助我了解此错误。 我不能将数据传递给我的操作吗?
另一个问题是,我可以在这个动作中使用另一个动作的数据吗?
【问题讨论】:
-
不确定它是否相关,但您应该将此
<Text onPress={this.fetchProducts()}>Press</Text>更改为<Text onPress={this.fetchProducts}>Press</Text>您正在调用该函数而不是将该函数作为道具传递 -
请检查更新后的代码。
-
我可以正确调用该函数。我的问题是将数据传递给 API 调用
标签: reactjs react-native redux react-redux redux-thunk