reactjs 通过单击按钮在数组中添加元素

3ks5zfa0  于 2023-01-30  发布在  React
关注(0)|答案(2)|浏览(185)

我有一些基于json文件呈现的产品卡片,通过点击“Add to Cart”按钮,元素应该被添加到数组сartList中,但这并没有发生。我也尝试将函数转发到组件本身,但效果不太好。
Shop.jsx:

import React, { useState } from 'react';
import './Instruments.css';
import Cart from '../components/Cart'
import Product from '../components/Product'
import cart from '../img/cart.png';
import data from "../data/data.json";

unction Shop() {
    const [value, setValue] = useState('');
    const [currentData, setCurrentData] = useState(data);
    const [cartList, setCartList] = useState([]);

    return (
            <div className='shop'>
                <div className='container'>
                        <div className='shop__main-products'>
                            {
                                currentData.filter((el) => {
                                    return value.toLowerCase() === '' ? el : el.title.toLowerCase().includes(value.toLowerCase())
                                }).map((el, index) => {
                                    return (
                                        <Product img={el.img} title={el.title} price={el.price} key={el.id} onClick={() => setCartList([...cartList, el])}/>
                                    )
                                })
                            }
                        </div>
                    </div>
                    <Cart active={modalActive} setActive={modalSetActive}/>
                </div>
            </div>
    );
}

export default Shop;

Product.jsx:

import React, { useState } from 'react';
import './Product.css';

function Product({img, title, price, id, type}) {
    return (
                <div className='product' key={id} type={type}>
                    <div className='buy__top'>
                        <div className='product__top-image-background'>
                            <img className='product__top-image' src={img}></img>
                        </div>
                        <h3 className='product__top-title'>{title}</h3>
                    </div>
                    <div className='product__buy'>
                        <h3 className='product__buy-price'>{price} грн</h3>
                        <button className='product__buy-button'>В корзину</button>
                    </div>
                </div>
            )
}

export default Product;
tnkciper

tnkciper1#

问题似乎出在如何将onClick函数传递给Product组件。onClick属性应传递给“Add to Cart”按钮,而不是Product组件本身。您应更改以下行:

<Product img={el.img} title={el.title} price={el.price} key={el.id} addToCart={() => setCartList([...cartList, el])}/>

在Product组件中,您应该将onClick属性添加到“Add to Cart”按钮:

<button className='product__buy-button' onClick={addToCart}>В корзину</button>

这样,当单击按钮时,它将调用addToCart函数并将元素添加到cartList数组中。

u5rb5r59

u5rb5r592#

您没有将onClick函数添加到Product组件的props中,而是将其沿管道传递下去,它将工作。

function Product({img, title, price, id, type, onClick}) {
return (
            <div className='product' key={id} type={type}>
                <div className='buy__top'>
                    <div className='product__top-image-background'>
                        <img className='product__top-image' src={img}></img>
                    </div>
                    <h3 className='product__top-title'>{title}</h3>
                </div>
                <div className='product__buy'>
                    <h3 className='product__buy-price'>{price} грн</h3>
                    <button className='product__buy-button' onClick={onClick}>В корзину</button>
                </div>
            </div>
        )
}

相关问题