Getting the following error - TypeError: cartItems.reduce is not a function
Getting the following error - 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
为 null 或未定义,cardItems.reduce
将触发该错误。
使用 cartItems || []
将是解决方案。
export const selectCartItemsCount = createSelector(
[selectCartItems],
cartItems =>
(cartItems || []).reduce(
(accumalatedQuantity, cartItem) =>
accumalatedQuantity + cartItem.quantity,
0
)
);
我正在尝试使用 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
为 null 或未定义,cardItems.reduce
将触发该错误。
使用 cartItems || []
将是解决方案。
export const selectCartItemsCount = createSelector(
[selectCartItems],
cartItems =>
(cartItems || []).reduce(
(accumalatedQuantity, cartItem) =>
accumalatedQuantity + cartItem.quantity,
0
)
);