还原并反应不需要的效果

2024-01-12

大家好????

  1. 我正在尝试使用 redux 来制作购物车功能。

2.问题描述:

问题是,一旦我想从我的购物篮中删除不是最后一个的产品。

Redux 确实从商店中删除了所需的产品,但在前端我仍然可以看到该产品,并且 React 会从列表中删除最后一个产品(我不想删除的产品)。

我必须转到另一个页面而不重新加载并返回购物篮才能看到重置的反应

如果我从列表中删除最后一个产品,则删除会按预期进行。

我制作了一个由谷歌驱动器提供的视频链接:

https://drive.google.com/file/d/1miZA4B1Ay5OZZBGPj1bCcQHsGv21oVW_/view https://drive.google.com/file/d/1miZA4B1Ay5OZZBGPj1bCcQHsGv21oVW_/view

这是我想要或预期具有的 redux 效果(这是从购物车列表中删除最新产品的操作:

如果我的购物车中有多个产品,并且我只想删除一个产品而不是最后一个产品(不必要的效果):

ADD_TO_CART_ACTIONdispatch

store.dispatch({
   type: ADD_PRODUCT_TO_CART_ACTION,
   payload: {
        data: {
          productID: data.product.id,
          attributeID: RadioState,
          price: data.price,
          quantity: 1
   }
 }
})

这是我的购物车减速器:

export function CartReducer(state = [], action){
    const cart = [...state]
    switch (action.type){
        case 'ADD_PRODUCT_TO_CART_ACTION':
            return [...state, {...action.payload.data}];

        case 'UPDATE_QUANTITY_FROM_CART_ACTION':
            return cart.map(product => {
                if (product.attributeID === action.payload.attributeID){
                    product.quantity++
                    return {...product}
                } else {
                    return product
                }
            })

        case 'REMOVE_QUANTITY_FROM_CART_ACTION':
            return cart.map(product => {
                if (product.attributeID === action.payload.attributeID){
                    product.quantity--
                    return {...product}
                } else {
                    return product
                }
            })

        case 'TRASH_PRODUCT_FROM_CART_ACTION':
            return cart.filter(product => product.attributeID !== action.payload)
        default:
            return state;
    }
}

这是首先从 redux 连接的购物车组件:

export function Cart (props)
{
    const [productCount, setProductCount] = useState(0)

    useEffect(() => {
        setProductCount(props.count)
    }, [])

    if (props.cart.length === 0){
        return <div className="home"><p className={'text-center text-green-500'}>Add product to cart.</p></div>
    }

    return (
        <React.Fragment className="home">
            <Grid container spacing={3}>
                {props.cart.map((item, index) => {
                    return (
                        <Grid item xs={6}>
                            <ProductCartDetails productCount={productCount} key={index} attributes={item}/>
                        </Grid>
                    )
                })}
            </Grid>
        </React.Fragment>
    )
}

export const CartStore = connect(
    (state) => ({
        cart: cartSelectors(state),
        count: cartCount(state)
    })
)(Cart)

这是ProductCartDetails(产品的卡片,这里的操作是调度的)

export default function ProductCartDetails (props){
    const [productCount, setProductCount] = useState(0)
    const [product, setProduct] = useState([])
    const [requestReady, setRequestReady] = useState(false)

    useEffect(() => {
        axios.get(`product/${props.attributes.productID}`)
            .then(({data}) => {
                setProduct(data)
                setRequestReady(! requestReady)
            })
            .catch((err) => {
                console.log(err)
            })
    }, [props.productCount])

    useEffect(() => {
        setProductCount(props.productCount)
    }, [props.productCount])

    const useStyles = makeStyles((theme) => ({
        root: {
            display: 'flex',
            width: "100%",
            marginTop: 4,
            backgroundColor: "#faf7f7",
            boxSizing: 'border-box',
        },
        details: {
            display: 'flex',
            flexDirection: 'column',
        },
        content: {
            flex: '1',
        },
        cover: {
            width: 151,
            height: '100%'
        },
    }));

    const onClickAddMoreQuantity = () => {
        let cart = [...store.getState()]
        let updatedQuantity = false;
        cart.map(product => {
            if (product.attributeID === props.attributes.attributeID){
                store.dispatch(
                    {
                        type: UPDATE_QUANTITY_FROM_CART_ACTION,
                        payload: {
                            attributeID: props.attributes.attributeID
                        }
                    }
                )
                updatedQuantity = true
            }
        })


        if (updatedQuantity === false){
            swal({
                icon: 'error',
                title: 'Cart',
                text: 'Product quantity cannot be bigger than the product stock.',
            })
        }
    }

    const onClickRemoveQuantityFromCart = () => {
        let cart = [...store.getState()]
        let updatedQuantity = false;
        cart.map(product => {
            if (product.attributeID === props.attributes.attributeID){
                store.dispatch(
                    {
                        type: REMOVE_QUANTITY_FROM_CART_ACTION,
                        payload: {
                            attributeID: props.attributes.attributeID
                        }
                    }
                )
                updatedQuantity = true
            }
        })


        if (updatedQuantity === false){
            swal({
                icon: 'error',
                title: 'Cart',
                text: 'Product quantity has not been removed.',
            })
        }
    }

    const onClickTrashProductFromCart = () => {
        let cart = [...store.getState()]
        let updatedQuantity = false;
        cart.map(product => {
            if (product.attributeID === props.attributes.attributeID){
                store.dispatch(
                    {
                        type: TRASH_PRODUCT_FROM_CART_ACTION,
                        payload: props.attributes.attributeID
                    }
                )
                updatedQuantity = true
            }
        })

        if (updatedQuantity === false){
            swal({
                icon: 'error',
                title: 'Cart',
                text: 'Product has not been removed.',
            })
        }
    }

    const classes = useStyles();

    if (productCount !== 0){
        return (
            <>
                <Card className={classes.root}>
                    <Link to={requestReady ? `/details/${product.slug}` : null}>
                        <img
                            className={classes.cover}
                            src={requestReady ? axios.defaults.baseURL+product.image[0].url+"?h=600" : null}
                            alt="image cover product cart"
                        />
                    </Link>
                    <div className={classes.details}>
                        <CardContent className={classes.content}>
                            <Typography className="text-center text-gray-700" component="h6" variant="h6">
                                {requestReady ? product.name : null}
                            </Typography>
                            <p className="text-center text-gray-600">
                                Details Of Product
                            </p>
                            <div>
                                <Typography variant="subtitle1" color="textSecondary">
                                    Category: {requestReady ? product.category.label : null}
                                </Typography>
                                <Typography variant="subtitle1" color="textSecondary">
                                    <ProductCartAttributeDetails attributes={props.attributes} />
                                </Typography>
                            </div>
                        </CardContent>
                        <CardActions>
                            <button id={requestReady ? product.id : null} onClick={onClickAddMoreQuantity}>
                                <Add height={10} />Add quantity
                            </button>
                            <button>
                                <Delete height={10} onClick={onClickTrashProductFromCart} />Trash
                            </button>
                            <button onClick={onClickRemoveQuantityFromCart}>
                                <Remove height={10} />Remove quantity
                            </button>
                        </CardActions>
                    </div>
                </Card>
            </>
        )
    } else {
        return (
            <>
                <Card className={classes.root}>
                    <Link to={requestReady ? `/details/${product.slug}` : null}>
                        <img
                            className={classes.cover}
                            src={requestReady ? axios.defaults.baseURL+product.image[0].url+"?h=600" : null}
                            alt="image cover product cart"
                        />
                    </Link>
                    <div className={classes.details}>
                        <CardContent className={classes.content}>
                            <Typography className="text-center text-gray-700" component="h6" variant="h6">
                                {requestReady ? product.name : null}
                            </Typography>
                            <p className="text-center text-gray-600">
                                Details Of Product
                            </p>
                            <div>
                                <Typography variant="subtitle1" color="textSecondary">
                                    Category: {requestReady ? product.category.label : null}
                                </Typography>
                                <Typography variant="subtitle1" color="textSecondary">
                                    <ProductCartAttributeDetails attributes={props.attributes} />
                                </Typography>
                            </div>
                        </CardContent>
                        <CardActions>
                            <button id={requestReady ? product.id : null} onClick={onClickAddMoreQuantity}>
                                <Add height={10} />Add quantity
                            </button>
                            <button>
                                <Delete height={10} onClick={onClickTrashProductFromCart} />Trash
                            </button>
                            <button onClick={onClickRemoveQuantityFromCart}>
                                <Remove height={10} />Remove quantity
                            </button>
                        </CardActions>
                    </div>
                </Card>
            </>
        )
    }
}

And the ProductCartAttributeDetails如果需要的话

export default function ProductCartAttributeDetails({attributes}){

    const [attribute, setAttribute] = useState([])
    const [requestReady, setRequestReady] = useState(false)
    useEffect(() => {
        axios.get(`attributes/${attributes.attributeID}`)
            .then(({data}) => {
                setAttribute(data)
                setRequestReady(! requestReady)
            })
            .catch((err) => {
                console.log(err)
            })
    }, [])

    return (
        <>
            <Typography variant="subtitle1" color="textSecondary">
                <p><span className="capitalize">{requestReady ? attribute.attribute : null}</span> : {requestReady ? attribute.value : null}</p>
            </Typography>
            <Typography variant="subtitle1" color="textSecondary">
                <p>Quantity: {requestReady ? attributes.quantity : null}</p>

            </Typography>
            <Typography variant="subtitle1" color="textSecondary">
                <p>Total Price: {requestReady ? attribute.price * attributes.quantity : null}</p>
            </Typography>
        </>
    )
}

通过用你自己的索引更改react js的默认索引解决了问题,对我来说,我使用从我的商店收到的索引来确保它们是唯一的

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

还原并反应不需要的效果 的相关文章

  • 在淘汰赛应用程序中使用 setInterval 进行轮询实现?

    我正在尝试使用 setInterval 实现简单的轮询机制 我有一个视图模型如下 define knockout jquery function ko function ViewModel var self this setInterval
  • 单击上一页的按钮路由到该页面后如何刷新页面

    我有 2 个页面 一个主页和一个页面 2 当我单击主页上的按钮时 它会路由到 page2 现在 单击主页上的按钮后 当我到达第 2 页时 它应该刷新 因为我的项目中存在一些缓存问题 我在ngoninit上添加了window location
  • 具有两组子组件的 React 组件

    我正在创建一个组件 需要接收两组子组件并放置在组件的两个不同部分中 let CreditCardForm icons fields gt div div div div icons div div div fields div let Cr
  • React JS - 单击时更改颜色并将默认颜色放在所有其他颜色上

    我有 x 个渲染数文章预览依赖于 API 调用的组件 div div Object keys images map index i gt return div div
  • JavaScript 中的正则表达式用于验证十进制数字

    我想要 JavaScript 中的正则表达式来验证十进制数字 它最多只允许两位小数 例如 它应该允许10 89但不是10 899 它还应该只允许一个句点 例如 它应该允许10 89但不是10 8 9 尝试使用以下表达式 d d 0 2 如果
  • 如何聚焦反应路由器链接

    我有一个用于搜索的输入框 并且希望能够按向下键将焦点从输入移动到列表的第一个s 看来我这里的东西不起作用 因为不是实际的 DOM 节点 我能够使用它来工作 a 代替 though let Link require react router
  • 使用 jquery 通配符检查 cookie 名称

    我有一个生成动态 cookie 的表单 例如 webform 62 1234356 62 1234356 可以是任意数字 我需要使用一些通配符检查来检查名称以 webform 开头的 cookie 是否存在 下面不起作用 if cookie
  • Backbone 中的加载栏

    我想显示加载消息 图标 直到列表中的所有项目都已呈现 这是我的示例中的 jsfiddle http jsfiddle net 9R9zU 58 http jsfiddle net 9R9zU 58 我尝试在 Feed 部分添加一个带有加载栏
  • 获取 JSON 中的 HTML 以在 React 组件中呈现为 HTML

    试图找出如何让链接实际呈现为链接 现在 在我从 Json 文件中读取这行文本后 React 将超链接渲染为文字文本 而不将其渲染为链接 一些数据 json about John has a blog you can read a href
  • 如何创建自定义元素扩展类的新实例

    我正在尝试以下示例谷歌开发者网站 https developers google com web fundamentals getting started primers customelements extendhtml我收到错误 Typ
  • Javascript 正则表达式来匹配正则表达式

    我正在研究一个特殊的正则表达式来匹配 javascript 正则表达式 现在我有这个正则表达式工作 i g m 例如 foo match i g m gt foo foo undefined foo i match i g m gt foo
  • 如果多个键是相同的 JS,则对对象中的值求和

    例如我有 5 个对象 row aa col 1 value 1 row bb col 2 value 1 row bb col 3 value 1 row aa col 1 value 1 row aa col 2 value 1 我想对值
  • jQuery 在 Chrome 下发现错误元素

    我使用 jQuery 迭代 HTML 表 并动态填充每行的行号 通过在文本框中填充行号 function updateRowNums myTable find tr each function index this find input i
  • 有没有好的 JQuery twitter 小部件可以循环推文?

    我想知道是否有任何 JQuery 小部件提供了循环加载推文的功能 例如在官方小部件中http twitter com about resources widgets widget profile http twitter com about
  • 当条件评估为 true 时获取元素(扩展 ElementArrayFinder)

    我们有一个菜单 表示为ul gt li列表 简化 ul class dropdown menu li class ng scope a href class ng binding Menu Item 1 a li li li ul
  • React + Semantic-UI:在 UI MODAL 中使用表单

    在没有 React 的普通旧 Semantic UI 中 我已经能够毫无问题地将表单放入 Modal 中 使用 Semantic UI React 版本 我能够在模态中显示表单 但它并没有按照我期望的方式工作 例如 模态框显示后 模态框内的
  • 限制 jQuery id 字符串吗?

    简而言之 我的问题是字符串在 jQuery 中作为可搜索 id 或可搜索内容有什么限制 更新 我得到了 ID 部分 但不是为什么我什至无法使用该字符串搜索 html 内容 对于任何愿意告诉我一个正则表达式来将模式从 MM dd yy HH
  • 一个接一个地淡入div

    大家好 我很擅长 HTML 和 CSS 但才刚刚开始接触 jQuery 的皮毛 我希望让 3 个 div 在页面加载时逐渐淡入 到目前为止我有这个 我听说使用 css 将显示设置为 none 对于任何使用非 JavaScript 浏览器的人
  • 如何按字母顺序排序并先小写排序

    如何获得以下排序的结果Food to Eat然后是 食物123 显然 第二个较低的 o 应该将 要吃的食物 带到排序后的第一个项目中 我很惊讶这个问题不容易通过谷歌找到答案 这个壮举没有包含在 javascript 标准中也让我感到惊讶 F
  • 使用 nginx 在云上部署 django 和 React

    我有一个 digitalocean 服务器 并且已经使用 Gunicorn 和 nginx 部署了 Django 后端服务器 如何在同一台服务器上部署 React 应用程序 您可以构建 React 应用程序并使用 Nginx 提供其静态文件

随机推荐

  • Coldfusion jQuery getJSON:获取 WDDX 而不是 JSON

    我正在使用 Brian Rinaldi 的 Coldfusion 函数将 dotnet Webservice 数据集转换为查询结构 然后 每个查询都会以 JSON 形式返回到客户端页面 以便在 jQuery 函数中使用 查询是有效的查询对象
  • 如何确定 DynamoDB 项目是否确实被删除?

    DynamoDB 提供了用于删除项目的 API 在返回的DeleteItemOutcome and DeleteItemResult没有字段或方法来确定是否找到该密钥以及该项目是否确实被删除 查明该项目是否确实存在并已删除的唯一方法是请求该
  • 我可以在 python 中调用 Lambda 表达式中的函数吗

    我有一个包含 if else 条件和 for 循环的函数 我想在 lambda 表达式中编写这个函数 我尝试了多种方法来创建这个 lambda 函数 但我还是做不到 这是我的功能和另一个规则 negation no not never sp
  • BroadcastReceiver 未接收广播

    我正在尝试使用以下扩展代码来广播 toast 消息Activity 但广播没有被其他人接收到Activity 则不显示 toast 有人可以解决我的错误吗 主要活动是发送广播 java import android app Activity
  • Vue:在组件中使用自定义库(pdf.js)

    如何在 Vue 组件中使用供应商库 特别是我想使用 PDF js 我只想为这个特定组件加载它 因为它们是相当大的文件 我正在构建一个需要加载 pdf 的编辑器 所以我将 pdf js 和 pdf worker js 放在 src asset
  • 使用 python 运行 crontab

    Python crontab 脚本似乎不起作用 当我手动运行它时 python home ec2 user code1 py 它工作正常 但当放入 crontab 的 cron txt 文件时 却不起作用 我的 crontab 文件是 ho
  • 控制声音的速度 xcode

    我想知道是否可以减慢 xcode 中的声音 我的意思是我将在 xcode 中的支持文件中添加一些 mp3 文件 并且我将创建能够加快或减慢速度的应用程序 例如使用滑块 有可能吗 如果是 有人可以帮我出点主意吗 谢谢 AVAudioPlaye
  • Firebase - 在互联网离线时上传图像

    Firebase 有很好的选择 即使您处于离线状态 也可以使用其数据库并将数据发送到数据库 然后当连接再次建立时 它会自动将数据发送到数据库 是否也可以使用 Firebase 存储来做到这一点 例如即使互联网关闭也发送图像 然后当互联网再次
  • 如何在我自己的函数中使用给定包的内部函数

    我想使用给定 R 包 例如 httr 的内部函数编写一个函数 而不必将这些方法引用为httr method of httr package in the body我的功能 我不想使用 我尝试改变我的函数的环境 例如 enviroment m
  • 如何下载 Android 版谷歌源代码

    如您所知 有数百个项目的清单https android googlesource com https android googlesource com 我想将它们全部下载到 Windows 机器中 根据谷歌的文件 To install in
  • 更新到 dotnet 6 后 dotnet run 不起作用

    我昨天从 Net 5 更新到 Net 6 现在我的项目无法启动dotnet run 然后我得到错误 Building warn Microsoft AspNetCore Server Kestrel Core KestrelServer 5
  • C++ fstream 从选定点擦除文件内容

    我需要删除文件内容从选定的点 C fstream 我应该使用哪个函数 我已经写了objects 我需要删除这些objects在文件的中间 C 没有在给定点截断文件的标准机制 您要么必须重新创建该文件 使用以下命令打开ios trunc并写入
  • 正则表达式至少匹配一个字符或一个空格

    我正在使用以下正则表达式来找出检测至少一个字符 b a zA Z0 9 1 现在我还需要探测空间 我怎样才能做到这一点 您可以使用以下方法检测正则表达式中的空格 s 该标记将捕获字符串中的任何空格 在您的正则表达式中 您可以包含此标记 s括
  • 会话/实体管理器已关闭

    我有这个 Hibernate dao 在我的本地机器上测试时它运行良好 但对于某些交易它会抛出IllegalStateException 我相信这是因为多个用户同时点击它 我可能是错的 更新支付道 Repository public cla
  • 修改PIN中的申请指令

    我正在使用英特尔 PIN 来修改我的应用程序中的指令 我使用此链接中的 Safecopy 示例作为参考 https software intel com sites landingpage pintool docs 81205 Pin ht
  • Prolog列表有未实例化的尾部,需要去掉它

    我正在开发 Prolog 程序 它产生正确的输出 一个列表 但该列表末尾有一个未实例化的变量 我做错了事 并且不知道如何摆脱它 这是代码 plaatsingen plaatsingen Prod Hoev Rest Order Plaats
  • 使用 awk sed 解析更新 puppet 文件

    我有一个包含多行代码的木偶文件 其中有一个部分如下所示 defaultrepo myrepo defaultbranch mybranch gitmod pullstuff othergitcode gitcommit gt b54123b
  • 为什么 C++20 中 unique_ptr 不是 equal_comparable_with nullptr_t ?

    使用 C 20concept我注意到std unique ptr似乎无法满足std equality comparable with
  • 转置 data.table

    数据计算结束后有效转换 data table 的好方法是什么 nrow 500e3 ncol 2000 m lt matrix rnorm nrow ncol nrow nrow colnames m lt c foo seq ncol 1
  • 还原并反应不需要的效果

    大家好 我正在尝试使用 redux 来制作购物车功能 2 问题描述 问题是 一旦我想从我的购物篮中删除不是最后一个的产品 Redux 确实从商店中删除了所需的产品 但在前端我仍然可以看到该产品 并且 React 会从列表中删除最后一个产品