【问题标题】:How to add an object to an array on the first click and update one of its values with every click made afterwards如何在第一次单击时将对象添加到数组中,并在之后的每次单击时更新其值
【发布时间】:2020-03-03 12:47:27
【问题描述】:

我正在开发一个 React 购物车,我正在尝试根据我在解释我的问题后展示的数组来完成以下操作:

1) 我正在尝试检查客户端请求的大小是否可用。

2) 如果它不可用,我想运行一个函数:

2A) 将所选对象添加到数组中。

2B) 在随后的每次点击中,我都想更新库存,以确保它提醒客户该商品不再有库存,并且我想将一个我想称为“数量”的新元素增加一个.

3) 这是我当前的尺寸数组:

[ 0: size: 3 stock: 140
_id: "5d903adb01cdab06932b5566"

1: size: 3.5 stock: 130
_id: "5d903adb01cdab06932b5565"

2: size: 4 stock: 10
_id: "5d903adb01cdab06932b5564"

3: {_id: "5d903adb01cdab06932b5563",  size: 4.5,  stock: 30}

4: size: 5 stock: 53
_id: "5d903adb01cdab06932b5562" ]

4) 这些是我正在运行的函数:

onClick={() => this.alertBox(prod, arr, item)}

alertBox = (product, products, count) => {
        console.log(count)
        let newStock;
        let clickedSize;
        let selectedProduct;

        if (product.stock === 0) { 
            alert('The item is currently out of stock')
        } else {
            newStock = product.stock -= 1;  
            clickedSize = product.size;
            selectedProduct = product._id;
            let newProducts;
            let quantity = 0;

            products.map((item) => {
                return item._id === product._id ? 
                    newProducts = [...this.state.chosenSize , {...item, ...newStock }]
                    : product
            });
            const tester = [];
            const result = [];
            const newSize = [];
            let quantities = [];
            let items;
            let newIt;

            newProducts.forEach(function(el) {
                if (tester.indexOf(el._id) === -1) {
                    tester.push(el._id)
                    result.push(el)
                    items = {...el}
                }
            });

            let newArray = result.map((item, i) => Object.assign({}, item, item.stock -= 1));

            this.setState(prevState => ({
                chosenSize: newArray
            }))

        }
    }

onClick={() => this.onUpdateItem(idx, arr, prod)}

onUpdateItem = (i, product, prod) => { 
       let newProd = product.stock;
           this.setState({
            chosenSize: product.map(el => (el._id === prod._id ? Object.assign({}, el, el.stock -= 1) : el))
     }); 

    };

7) 我希望对象在每次点击后更新为类似的内容。

3:{_id:“5d903adb01cdab06932b5563”,尺寸:4.5,库存:30,数量: 1 }

3:{_id:“5d903adb01cdab06932b5563”,尺寸:4.5,库存:29,数量: 2 }

3:{_id:“5d903adb01cdab06932b5563”,尺寸:4.5,库存:28,数量: 3 }

这是该项目的代码沙箱,尽管出于某种原因它不再呈现我的组件。代码在 ProductPage 文件 codesandbox.io/s/mystifying-roentgen-7mp0t 中。

编辑

抱歉,代码沙箱现在可以工作了,您只需单击其中一项,它就会带您进入产品页面 http://codesandbox.io/s/mystifying-roentgen-7mp0t

【问题讨论】:

  • 您可以撤消并检查是什么使您的代码运行并与新版本进行比较吗?
  • 等一下,对不起,撤消是什么意思?您的意思是删除其中一项功能吗?
  • “不再渲染我的组件” - 恢复到渲染的时间并检查发生了什么变化。如果您能告诉我们您添加了哪些更改,我们将很容易调试。
  • 哦,明白了,沙盒
  • 老板现在可以使用了!您只需单击其中一项,它就会将您带到具有尺寸的项目!

标签: javascript arrays reactjs react-native react-redux


【解决方案1】:

您应该使用import { Link } from "react-router-dom"; 使LinkProduct.js 中工作。我只是对代码沙箱进行了更改

【讨论】:

  • 谢谢老大,现在好像可以了,我几分钟前就做了,但之前可能没用。你知道如何使代码工作吗?我还没能解决这个问题,已经一个星期了:(
  • 你想达到什么目的?
  • 基本上我想创建一个只有选定大小的对象数组,例如:3: {_id: "5d903adb01cdab06932b5563", size: 4.5, stock: 30, quantity: 1 } to 3: { _id: "5d903adb01cdab06932b5563", size: 4.5, stock: 29, quantity: 2 } 所以在第一次单击时,我希望将对象添加到数组中,在第二次单击时,我希望库存减少一个所以从 30 到 29。
  • 我不明白您要更改代码的哪一部分以及您要操作代码的哪一部分。
  • 基本上我想做两件事:1)我想根据客户点击的大小创建一个唯一对象的数组 2)数组中的对象只会对象股票添加到新的对象数组。 3) 用户每点击一次尺寸,库存基本上应该减少一。 4) 如果用户点击一个尺寸,它会将其库存减一并将对象添加到数组中。
猜你喜欢
  • 2012-11-03
  • 2013-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-22
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
相关资源
最近更新 更多