reactjs - 收到以下错误 - TypeError: cartItems.reduce is not a function
问题描述
我正在尝试使用 reduce 函数计算名为 cartItems 的数组中的项目数。但它每次都会抛出这个奇怪的错误。我的 redux 选择器代码 -
import { createSelector } from 'reselect';
const selectCart = state => state.cart;
export const selectCartItems = createSelector(
[selectCart],
cart => cart.cartItems
);
export const selectCartHidden = createSelector(
[selectCart],
cart => cart.hidden
);
export const selectCartItemsCount = createSelector(
[selectCartItems],
cartItems =>
cartItems.reduce(
(accumalatedQuantity, cartItem) =>
accumalatedQuantity + cartItem.quantity,
0
)
);
我使用选择器的组件如下。我不是在 mapStateToProps 函数中解构它,而是直接传递选择器。
import React from 'react';
import { connect } from "react-redux";
import { toggleCartHidden } from "../../Redux/cart/cart.actions";
import { selectCartItemsCount } from '../../Redux/cart/cart.selectors';
import { ReactComponent as ShoppingIcon } from '../../assets/shopping-bag.svg';
import './cart-icon.styles.css';
const CartIcon = ({ itemCount, toggleCartHidden }) => (
<div className='cart-icon' onClick={toggleCartHidden}>
<ShoppingIcon className='shopping-icon' />
<span className='item-count'>{itemCount}</span>
</div>
);
const mapStateToProps = state => ({
itemCount: selectCartItemsCount(state)
});
const mapDispatchToProps = dispatch => ({
toggleCartHidden: () => dispatch(toggleCartHidden())
});
export default connect(
mapStateToProps,
mapDispatchToProps)
(CartIcon);
这是推车减速器 -
import CartActionTypes from './cart.types';
import { addItemToCart } from './cart.utils';
const INITIAL_STATE = {
hidden: true,
cartItems: []
};
const cartReducer = (state = INITIAL_STATE, action) => {
switch (action.type) {
case CartActionTypes.TOGGLE_CART_HIDDEN:
return {
...state,
hidden: !state.hidden
};
case CartActionTypes.ADD_ITEM:
return {
...state,
cartItems: addItemToCart(state.cartItems, action.payload)
};
default:
return state;
}
};
export default cartReducer;
购物车实用功能 -
export const addItemToCart = (cartItems, cartItemToAdd) => {
const existingCartItem = cartItems.find(
cartItem => cartItem.id === cartItemToAdd.id
);
if (existingCartItem) {
return cartItems.map(cartItem =>
cartItem.id === cartItemToAdd.id
? { ...cartItem, quantity: cartItem.quantity + 1 }
: cartItem
)
}
return [...cartItems, { ...cartItemToAdd, quantity: 1 }];
};
解决方案
如果cardItems
为空或未定义,cardItems.reduce
将触发该错误。
使用cartItems || []
将是解决方案。
export const selectCartItemsCount = createSelector(
[selectCartItems],
cartItems =>
(cartItems || []).reduce(
(accumalatedQuantity, cartItem) =>
accumalatedQuantity + cartItem.quantity,
0
)
);
推荐阅读
- c - 字符串数组在函数中没有得到正确的值
- python - 当 sys.stdout 为 None 时是什么意思
- android - 在圆弧上画圆
- python - 如何将下载按钮的值获取到我的 django 视图中?
- python - 如何使用 lxml 和请求在锚点中获取元素文本?
- c++ - C ++:按公共基数对整数进行分组以节省内存
- enums - 如何找到枚举变体的参数数量?
- javascript - 如何在不模糊的情况下拉伸 WebGL 画布?“图像渲染”样式不起作用
- java - 无法连接到 SQL 数据库(Java、Android Studio)
- python - Pandas 按列计算值的频率