«диспетчеризация» не определена - mapDispatchToProps не проходит через маршрутизатор - PullRequest
1 голос
/ 20 сентября 2019

Я получаю dispatch не определена ошибка из кода "shopfront".
Я полагаю, что это потому, что я не передаю свойства внизследующий уровень, но я не уверен, правильно ли это или нет.
Я хочу иметь возможность правильно передать функцию диспетчеризации в код product.actions.

Я пытался максимально сузить проблему, удалив ненужный код.
У меня есть пользовательский редуктор, который работает правильно, но я не знаю, почему этот редуктор продукта не

// products.reducer

const initialState = {
    products: null,
    error: null
  };

  const ProductReducer = (state = initialState, action) => {
    let newState = null;
    switch(action.type){
      case "GET_ALL_PRODUCTS": newState = {
                              ...state,
                              products: action.products
                            };
                            return newState;
      case "GET_ALL_PRODUCTS_FAIL": newState = {
                                  ...state,
                                  error: action.error
                                };
                                return newState;
      default: return state;
    }
  };

  export default ProductReducer;
// index

import React from "react";
import ReactDOM from "react-dom";
import "bootstrap/dist/css/bootstrap.min.css";
import { register } from "./serviceWorker";

import { createStore, combineReducers, applyMiddleware, compose } from "redux";
import { Provider } from "react-redux";
import thunk from "redux-thunk";

import UserReducer from "./store/reducers/users.reducers";
import ProductReducer from "./store/reducers/products.reducer";
import "./index.css";
import App from "./App";
import { BrowserRouter } from "react-router-dom";

const appReducer = combineReducers({
    usersRed: UserReducer,
    productsRed: ProductReducer
});

const logger = (store) => {
    return next => {
        return action => {
            console.log("Middleware dispatching ");
            console.log(action);
            const result = next(action);
            console.log("Middleware next state ");
            console.log(store.getState());
            return result;
        };
    };
};
const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose;
const appStore = createStore(appReducer, composeEnhancers(applyMiddleware(logger, thunk)));

const app = (
    <BrowserRouter>
        <Provider store={appStore}>
            <App />
        </Provider>
    </BrowserRouter>
);

ReactDOM.render(app, document.getElementById("root"));
register();
// shopfront

import React, { Component } from "react";
import { Container, Row, Col, InputGroup, InputGroupAddon, Button } from "reactstrap";
import { withRouter } from "react-router-dom";
import { connect } from "react-redux";
import { Alert } from "reactstrap";

import * as actionMethods from "../../store/actions/index.actions";
import Product from "../../components/Product/Product";

class Shopfront extends Component {

    state = {
        onAlert: false,
        internalError: null
    };

    componentDidMount() {
        this.props.loadAllProducts(5);
        console.log("component_did_mount_run")
    }

    render() {

        let ProductsList = <h1>No Products Yet!</h1>;
        if (this.props.products !== null) {
            ProductsList = this.props.products.map(Product => {
                return <Product
                    key={Product.id}
                    title={Product.name}
                    excerpt={Product.description}
                    medialink={Product.permalink}
                    ProductId={Product.id}
                />;
            });
        }

        return (
            <Container>
                {ProductsList}
            </Container>
        );
    }
};

const mapStateToProps = (state) => {
    return {
        products: state.productsRed.products,
        error: state.productsRed.error
    };
};

const mapDispatchToProps = (dispatch) => {
    return {
        loadAllProducts: (perpage) => { dispatch(actionMethods.loadAllProducts(perpage)) }
    };
};

export default withRouter(connect(mapStateToProps, mapDispatchToProps)(Shopfront));
// index.actions

export {
    loadAllProducts
} from "./product.actions";
// product.actions

import wcapi from "../../axios-wp";

export const loadAllProducts = (perpage) => {
    wcapi.get("products", {
        per_page: perpage,
    })
        .then((response) => {
            // Successful request
            let productsRes = response.data;
            dispatch({ type: "GET_ALL_PRODUCTS", products: productsRes });
        })
        .catch((err) => {
            // Invalid request, for 4xx and 5xx statuses
            dispatch({ type: "GET_ALL_PRODUCTS_FAIL", error: err });
        })
}

Спасибо за помощь!

Ответы [ 2 ]

2 голосов
/ 20 сентября 2019

это потому, что вы не возвращаете отправку из действия loadAllProducts

/ product.actions

import wcapi from "../../axios-wp";

export const loadAllProducts = (perpage) => (dispatch) => { //make this change
    wcapi.get("products", {
        per_page: perpage,
    })
        .then((response) => {
            // Successful request
            let productsRes = response.data;
            dispatch({ type: "GET_ALL_PRODUCTS", products: productsRes });
        })
        .catch((err) => {
            // Invalid request, for 4xx and 5xx statuses
            dispatch({ type: "GET_ALL_PRODUCTS_FAIL", error: err });
        })
}
0 голосов
/ 20 сентября 2019

Я когда-либо сталкивался с такой проблемой раньше.
Тогда я использовал return dispatch => {} вот так:

export const loadAllProducts = perpage => {
    return dispatch => {
        wcapi.get("products", {
            per_page: perpage,
        })
        .then((response) => {
            // Successful request
            let productsRes = response.data;
            dispatch({ type: "GET_ALL_PRODUCTS", products: productsRes });
        })
        .catch((err) => {
            // Invalid request, for 4xx and 5xx statuses
            dispatch({ type: "GET_ALL_PRODUCTS_FAIL", error: err });
        })
    }
}

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...