【问题标题】:React-Native: Pass data to redux action to fetch API resultReact-Native:将数据传递给 redux 操作以获取 API 结果
【发布时间】: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>
    );
  }
}

我收到此错误是 操作必须是普通对象。使用自定义中间件进行异步操作。

请帮助我了解此错误。 我不能将数据传递给我的操作吗?

另一个问题是,我可以在这个动作中使用另一个动作的数据吗?

【问题讨论】:

  • 不确定它是否相关,但您应该将此 &lt;Text onPress={this.fetchProducts()}&gt;Press&lt;/Text&gt; 更改为 &lt;Text onPress={this.fetchProducts}&gt;Press&lt;/Text&gt; 您正在调用该函数而不是将该函数作为道具传递
  • 请检查更新后的代码。
  • 我可以正确调用该函数。我的问题是将数据传递给 API 调用

标签: reactjs react-native redux react-redux redux-thunk


【解决方案1】:

这里我们能做的是

import * as loginAction from '../../actions/login';

fetchProducts(){
var city = 'ABCD';
this.props.fetchProductsHomeFromAPI(city);
}
const mapDispatchToProps = dispatch => ({
fetchProductsHomeFromAPI: (city) =>  dispatch(loginAction.sendToken(city),
});

这是我定义动作的动作文件(动作/登录)

import { createAction } from 'redux-actions';
function checkdispatch(data) {
return createAction(constant.OPEN_USER_DRAWER)(data);
}

**value will be there in the sendToken function **
export function sendToken(city) {
console.log(city)
**here will call you API**
  dispatch(checkdispatch(true));
}

希望这将帮助您为您的行动带来价值

【讨论】:

  • 谢谢阿舒托什。如果你能提供一个例子,这将非常有帮助。由于我是 react-native 和 redux 的新手,所以有点难以理解。
  • 好的,如果不紧急,会在几个小时内为您提供服务
  • 非常感谢。它很紧急,但是,你的努力是值得的。
  • github.com/avtarvikas/dookApp/blob/develop/src/containers/… 使用底部的代码,您可以了解我们如何调用某些操作
  • 你能告诉我,那个依赖'redux-actions'是什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多