Есть пара вещей, которые вы, вероятно, захотите исправить.
Во-первых, ваш action.js
немного избыточен.Вы просто должны иметь возможность:
export const removeProduct = productId => ({
type: types.REMOVE_PRODUCT,
productId
})
Далее, в вашем редукторе вы захотите убедиться, что вы распространили свое состояние и затем отфильтровали через указанный массив.Я предполагаю, что ваше начальное состояние для редуктора выглядит примерно так:
const INITIAL_STATE = {
products: [] <--- An array of products in the cart
}
Если это правильно, то case
в вашем редукторе должно выглядеть примерно так:
case REMOVE_FROM_OBJECT_ARRAY:
return {
...state,
products: state.products.filter(product => product.id !== action.productId),
};
Послечто, когда вам нужно передать действие removeProduct
компоненту <Cart/>
, оно должно быть:
onDeleteFromCart={this.props.removeProduct}
Поскольку вы назначаете это действие реквизиту.
Наконец, выВам нужно будет передать идентификатор продукта в метод onClick
вашей кнопки, где вы запускаете действие:
onClick={onDeleteFromCart(product.id)}
Надеюсь, это направит вас в правильном направлении.
Редактировать
Попробуйте преобразовать в класс:
class CartContainer extends React.Component {
constructor(props) {
super(props);
}
// You may not need the constructor
}
handleRemoveProduct = (e, id) => {
e.preventDefault()
this.props.removeProduct(id)
}
render() {
return(
<Cart
products={products}
total={total}
onCheckoutClicked={()=>checkout(products)}
onDeleteFromCart={()=>removeProduct(products.map(product =>
product.id))}
/>
)
}
CartContainer.propTypes = {
products: PropTypes.arrayOf(PropTypes.shape({
id:PropTypes.number.isRequired,
titulo: PropTypes.string.isRequired,
price: PropTypes.number.isRequired,
quantity: PropTypes.number.isRequired
})).isRequired,
total:PropTypes.string,
checkout:PropTypes.func.isRequired,
removeProduct:PropTypes.func.isRequired
}
const mapStateToProps = (state) => ({
products: getCartProducts(state),
total: getTotal(state)
})
export default connect(
mapStateToProps,
{ checkout, removeProduct }
)(CartContainer)
Затем передайте эту функцию в ваш <Cart/>
компонент с помощью:
onDeleteFromCart={this.handleRemoveProduct}
Тогда в вашей кнопке:
onClick={(e) => onDeleteFromCart(e, id)}
Надеюсь, что это работает для вас.