Redux 无法读取未定义的属性“有效负载”

Dor*_*ley 0 javascript reactjs redux

我正在使用 Redux 和 React 从 API 加载数据。尽管成功提取数据并将其应用于状态,但它抛出了一个错误:

未捕获的类型错误:无法读取未定义的属性“有效负载”。

这发生在FETCH_PRODUCT_LISTINGS_PENDING控制台中的操作类型之后。

反应组件:

import React from 'react';
import { connect } from 'react-redux';
import store from '../../../store';

import * as ProductListingActions from '../actions/ProductListingActions';

@connect((store) => {
    return {
        productListing: store.productListing.products
    }
})

export default class ProductListingContainer extends React.Component {
    constructor(data) {
        super();
        this.props = data;
        this.props.dispatch(ProductListingActions.fetchProductListings());
    }
    render() {
        return <div></div>;
    }
}
Run Code Online (Sandbox Code Playgroud)

减速器:

import CookieHandler from '../../../modules/CookieHandler';
const cookieHandler = new CookieHandler;

export default function reducer(
    state = {
        products: [],
        fetching: false,
        fetched: false,
        error: null
    }, action) {

    switch(action.type) {
        case "FETCH_PRODUCT_LISTINGS_PENDING":
            return {
                ...state,
                fetching: true,
            }
            break;
        case "FETCH_PRODUCT_LISTINGS_REJECTED":
            return {
                ...state,
                fetching: false,
                error: action.payload
            }
            break;
        case "FETCH_PRODUCT_LISTINGS_FULFILLED":
            return {
                ...state,
                fetching: false,
                fetched: true,
                products: action.payload.data.default
            }
            break;
    }

    return state;
}
Run Code Online (Sandbox Code Playgroud)

行动:

import Config from '../../../Config.js';
import store from '../../../store.js';
import axios from 'axios';

export function fetchProductListings() {
    store.dispatch({
        type: "FETCH_PRODUCT_LISTINGS",
        payload: axios.get(Config.getConfigAPIUrl() + '/cartel/products')
    })

}
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激

azi*_*ium 5

您正在调度调度调用,而不是调度对象。

this.props.dispatch(ProductListingActions.fetchProductListings());

function fetchProductListings() {
  store.dispatch({
    type: "FETCH_PRODUCT_LISTINGS",
    payload: axios.get(Config.getConfigAPIUrl() + '/cartel/products')
  })
}
Run Code Online (Sandbox Code Playgroud)

如果你内联这个:

this.props.dispatch(
  store.dispatch({
    type: "FETCH_PRODUCT_LISTINGS",
    payload: axios.get(Config.getConfigAPIUrl() + '/cartel/products')
  })
)
Run Code Online (Sandbox Code Playgroud)

你的动作创建者不应该调用 dispatch,它应该只返回一个动作:

export function fetchProductListings() {
  return {
    type: "FETCH_PRODUCT_LISTINGS",
    payload: axios.get(Config.getConfigAPIUrl() + '/cartel/products')
  }
}
Run Code Online (Sandbox Code Playgroud)

但请记住,它axios.get是异步的,因此payload将是承诺。您可能需要考虑添加redux-thunk来处理承诺的履行。