如何解决 React Redux 有效负载未传递给状态对象
2020-09-10
529
嘿,我正在经营一家网上商店,我正在使用 MERN 堆栈。因此,在这家商店中,我有 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.all
和
axios.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