开发者问题收集

如何解决 React Redux 有效负载未传递给状态对象

2020-09-10
529

嘿,我正在经营一家网上商店,我正在使用 MERN 堆栈。因此,在这家商店中,我有 3 个服装类别:

  1. 男装
  2. 女装
  3. 童装

因此,现在我想处理用户的购物车,因此当用户单击 添加到购物车 按钮时,我会使用 axios.all 发送 3 个联合 axios 获取请求,以便我可以根据产品 ID 获取正确的项目数据。

因此,我确实成功地从服务器取回了正确的产品,当我控制台注销响应时,我得到了我想要的

现在的问题是数据没有传递到购物车,我甚至尝试删除添加逻辑,现在即使它们是重复的,我也在添加,因为我认为可能是 Reducer 中的逻辑导致了错误,所以我将其更改为只添加任何进来的东西,这样我就可以缩小范围,如果是我的逻辑出了问题,但数据仍然没有传递到购物车,请在这里得到一些帮助,我真的被困住了

下面的代码是我的 cartActions.js

const addToCart = (productId, qty) => async (dispatch) => {
  try {
    const femaleProduct_url = `http://127.0.0.1:5000/single-womens-clothes/${productId}`;
    const maleProduct_url = `http://127.0.0.1:5000/single-mens-clothes/${productId}`;
    const kidsProduct_url = `http://127.0.0.1:5000/single-kids-clothes/${productId}`;

    const femaleProduct_request = await axios.get(femaleProduct_url);
    const maleProudct_request = await axios.get(maleProduct_url);
    const kidsProduct_request = await axios.get(kidsProduct_url);
    let data = [];

    axios
      .all([femaleProduct_request, maleProudct_request, kidsProduct_request])
      .then(
        axios.spread((...responses) => {
          const f_product = responses[0];
          const m_product = responses[1];
          const k_product = responses[2];

          if (f_product.data.length > 0) {
            data = f_product.data;
          } else if (m_product.data.length > 0) {
            data = m_product.data;
          } else {
            data = k_product.data;
          }
        })
      )
      .then((response) => {
        console.log("DATA: ", data);
      })
      .catch((error) => {
        console.log(error);
      });

    dispatch({
      type: CART_ADD_ITEM,
      payload: data,
    });
  } catch (error) {}
};

export default addToCart;

下面的代码是 cartReducer.js

const cartReducer = (state = { cartItems: [] }, action) => {
  switch (action.type) {
    case CART_ADD_ITEM:
      const item = action.payload;

      return { cartItems: [...state.cartItems, item] };
    default:
      return state;
  }
};

export default cartReducer;
1个回答

您需要在 axios 结束所有请求后分派 CART_ADD_ITEM

.then((response) => {
  dispatch({
    type: CART_ADD_ITEM,
    payload: data,
  });
})

另请注意, axios.allaxios.spread 已弃用 ,转而使用 Promise.all

const femaleProduct_request = axios.get(femaleProduct_url);
const maleProudct_request = axios.get(maleProduct_url);
const kidsProduct_request = axios.get(kidsProduct_url);

Promise.all([femaleProduct_request, maleProudct_request, kidsProduct_request])
  .then((responses) => {
      const f_product = responses[0];
      const m_product = responses[1];
      const k_product = responses[2];

      // [...]

      return data
    })
  .then((data) => {
    dispatch({
      type: CART_ADD_ITEM,
      payload: data,
    });
  })
Gabriel Santos
2020-09-10