You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React JS点击Product-Preview div实现product.description显隐的方案咨询

实现方案

你只需要在ProductList组件中添加状态记录当前展开的商品ID,绑定点击事件后给描述文本加显隐判断逻辑即可,无需修改父组件Products的代码。

单开模式(同一时间仅展开一个卡片)

修改后的ProductList完整代码如下:

import { useState } from "react";

const ProductList = (props) => {
    const products = props.products;
    // 存储当前展开描述的商品ID,为null时所有卡片描述都收起
    const [expandedProductId, setExpandedProductId] = useState(null);

    const toggleDescription = (productId) => {
        // 如果点击的是当前已展开的卡片则收起,否则展开点击的卡片
        setExpandedProductId(prev => prev === productId ? null : productId);
    }

    return ( 
        <div className="ProductList" >
            {products.map((product) => (
                <div 
                    className="Product-Preview" 
                    key={product.id}
                    onClick={() => toggleDescription(product.id)}
                >
                    <div className="backdrop" style={{backgroundImage: `url(${product.image})`}}></div>
                    <h2>{ product.title }</h2>
                    {/* 仅当前卡片ID匹配展开ID时显示描述 */}
                    {expandedProductId === product.id && <p>{ product.description }</p>}
                    <div>{ product.price }</div><br />
                </div>
                
            ))}
        </div>
    );
}

export default ProductList;

多开模式(支持同时展开多个卡片)

如果需要支持同时展开多个卡片的需求,可以调整状态逻辑为存储已展开ID的数组,代码示例如下:

import { useState } from "react";

const ProductList = (props) => {
    const products = props.products;
    // 存储所有已展开的商品ID数组
    const [expandedIds, setExpandedIds] = useState([]);

    const toggleDescription = (productId) => {
        setExpandedIds(prev => 
            prev.includes(productId) 
                ? prev.filter(id => id !== productId) 
                : [...prev, productId]
        )
    }

    return ( 
        <div className="ProductList" >
            {products.map((product) => (
                <div 
                    className="Product-Preview" 
                    key={product.id}
                    onClick={() => toggleDescription(product.id)}
                >
                    <div className="backdrop" style={{backgroundImage: `url(${product.image})`}}></div>
                    <h2>{ product.title }</h2>
                    {expandedIds.includes(product.id) && <p>{ product.description }</p>}
                    <div>{ product.price }</div><br />
                </div>
                
            ))}
        </div>
    );
}

export default ProductList;

如果你需要给显隐加过渡动画,可以把条件渲染改成动态绑定className或者style的display/opacity属性,配合CSS过渡实现即可。

内容的提问来源于stack exchange,提问作者EmFor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 15:57:03