javascript - React-Redux 为什么我的代码没有从状态中删除项目?
问题描述
我一直在研究一个购物车,一旦我点击一个产品,它就会删除它,但它没有。我已经使用 UUID 分配给我正在添加的产品,然后我将它传递给减速器,然后我将它作为 id 保存到状态中,然后在 removeProduct 情况下我正在过滤状态以删除那个确切的产品确切的 ID,但它不会删除它。它只是保持这样。我该如何解决?
以下是与此问题相关的文件:index.js:
import React, { Component } from 'react';
import {connect} from 'react-redux'
import {store} from './store'
import {Button, Nav, Navbar, NavbarBrand, NavItem, NavLink} from 'react-bootstrap'
import {LinkContainer} from 'react-router-bootstrap'
import 'bootstrap/dist/css/bootstrap.min.css'
import {MdShoppingBasket, MdAddShoppingCart} from 'react-icons/md'
import './index.css'
import uuid from 'uuid/v4'
class index extends Component {
render() {
const {productsInCart} = this.props;
const productsList = [
{
name: 'Cool Hat',
price: 50,
image: 'https://images.pexels.com/photos/4429555/pexels-photo-4429555.jpeg?auto=compress&cs=tinysrgb&h=750&w=1260'
},
{
name: 'Dull Hat',
price: 5,
image: 'https://images.pexels.com/photos/4429555/pexels-photo-4429555.jpeg?auto=compress&cs=tinysrgb&h=750&w=1260'
},]
const addProduct=(product)=>
{
store.dispatch({type: 'addToCart', name: product.name, price: product.price, image: product.image, id: uuid()})
}
return (
<div>
<Navbar className ='navbar' variant='light'>
<NavbarBrand>Home</NavbarBrand>
<Nav className='ml-auto'>
<NavItem>
<NavLink href='/cart'>
<span className='cartIndicator'><MdShoppingBasket size={25}></MdShoppingBasket>
<span>{productsInCart.length}</span></span>
</NavLink>
</NavItem>
</Nav>
</Navbar>
{productsList.map((product, id)=>
<div className='productsList' key={id}>
<div className='productShow'>
<h3 className='productName'>{product.name}</h3>
<img className='productImage'src={product.image}></img>
<p className='productPrice'><strong>$ {product.price}.00</strong></p>
<Button className='addProductButton' variant='success' onClick={()=>addProduct(product, id)}> <MdAddShoppingCart size={20}></MdAddShoppingCart> <strong>Add to cart </strong> </Button>
</div>
</div>)}
</div>
);
}
}
const mapStateToProps=(state={productsInCart: [{}]})=>
{
return{
productsInCart: state.productsInCart
}
}
export default connect(mapStateToProps)(index);
减速器.js:
import React from 'react'
import $ from 'jquery'
import uuid from 'uuid/v4'
const reducer = (state={productsInCart:[{}]}, action)=>
{
let nextId = 0;
switch(action.type)
{
case 'addToCart':
return{
...state,
productsInCart: [...state.productsInCart, {name: action.name, price: action.price, image: action.image, id: action.id }]
}
case 'clearCart':
return{
...state,
productsInCart: []
}
case 'removeProduct':
return{
...state,
productsInCart:[...state.productsInCart.filter(product=>product!==action.id)]}
default:
return state
}
}
export default reducer;
购物车.js:
import React, { Component } from 'react';
import {Button, Nav, Navbar, NavbarBrand, NavItem, NavLink} from 'react-bootstrap'
import {MdHome} from 'react-icons/md'
import {connect} from 'react-redux'
import {store} from './store'
class cart extends Component {
render() {
const {productsInCart} = this.props;
const clearCart=()=>
{
store.dispatch({type: 'clearCart'})
}
const removeProduct=(id)=>
{
store.dispatch({type:'removeProduct'})
}
return (
<div>
<Navbar variant='dark' bg='success'>
<NavbarBrand>Your cart</NavbarBrand>
<Nav className='ml-auto'>
<NavItem>
<NavLink href='/home'>
<MdHome size={25}></MdHome>
</NavLink>
</NavItem>
</Nav>
</Navbar>
{productsInCart.map((product, index)=>
<div className='productsList'>
<div className='productShow'>
<h3 className='productName'>{product.name}</h3>
<img className='productImage'src={product.image}></img>
<p className='productPrice'><strong>$ {product.price}.00</strong></p>
<Button variant='danger'><strong onClick={()=>removeProduct(index)}>Remove product</strong></Button>
</div>
</div>)}
<Button onClick={()=>clearCart()}>Clear Cart</Button>
</div>
);
}
}
const mapStateToProps=(state={productsInCart: [{}]})=>
{
return{
productsInCart: state.productsInCart
}
}
export default connect(mapStateToProps)(cart);
解决方案
所以我找到了解决方案,基本上我不得不稍微更改一下 ID。我已经在 index.js 中为我的产品手动添加了一个 ID,然后每当我按下添加到购物车按钮时,我都会将此 ID 分配给产品,如下所示:
const addProduct=(product)=>{store.dispatch({type: 'addToCart', name: product.name, price: product.price, image: product.image, id: product.id})}
然后我稍微更改了减速器。这就是我的 removeProduct 案例的样子:
case 'removeProduct': let updatedCart = [...state.productsInCart] const index = state.productsInCart.findIndex(product=>product.id===action.id) console.log(index) if(index>=0 || index>=-1) { updatedCart.splice(index,1) } return{ ...state, productsInCart: updatedCart }
基本上这里发生的事情是我首先初始化了我的购物车的一个新实例,这是当前购物车的一个完整副本,在删除所选元素后将保存新的值,然后我创建了一个变量找到我要删除的项目状态的索引,一旦找到,我确保我通过使用上面的 if 语句找到它,一旦它返回 true(意味着元素已找到并准备好已删除)我调用 updatedCart 持有人的拼接函数并告诉它删除元素,然后在删除元素后,我只需将 updatedCart 添加到状态并将其显示给用户。
推荐阅读
- php - csv 文件中的第一项返回不可读的字符
- vue.js - 如何深度链接到 GitHub Pages 上的 Vue.js 项目?
- wordpress - Wordpress - 如果将正确的参数添加到我的简码中,我该如何调试?
- powershell - 如何使用 PowerShell 脚本在 Windows 任务计划程序中配置“如果任务已在运行,则以下规则适用”?
- r - 在 R 中对数据列进行分组
- python - Docker 找不到 anaconda-client
- php - php phar nginx 没有指定输入文件
- php - 将数据从一个表复制到另一个表并检查相等的数据
- email - 违反策略时如何使用自定义策略 Mule 3 发送电子邮件?
- asp.net - ASP NET - 底层连接已关闭:无法为 SSL/TLS 安全通道建立信任关系