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

React新手求助:如何从Items组件获取quantity值至其他组件

React组件间状态传递解决方案

你遇到的问题本质是React组件间的状态共享问题,直接操作DOM获取值不符合React的数据流理念,正确的做法是状态提升——把需要共享的状态放到所有需要用到它的组件的共同父组件中,通过props传递状态和更新方法。

具体实现步骤:

1. 在共同父组件中维护全局的食品数量状态

假设你的Items组件被Menu这类父组件渲染,在父组件里统一管理所有食品的数量:

import { useState } from "react";
import Items from "./Items";

function Menu() {
  // 用对象存储每个食品的数量,键为食品名称,值为对应数量
  const [itemQuantities, setItemQuantities] = useState({});

  // 定义更新数量的回调函数,传递给子组件
  const handleQuantityChange = (itemName, newQuantity) => {
    setItemQuantities(prev => ({
      ...prev,
      [itemName]: newQuantity
    }));
  };

  // 这里可以直接使用itemQuantities做后续操作,比如计算总价、传给购物车组件等
  // 示例:<Cart quantities={itemQuantities} />

  return (
    <div className="Menu">
      {/* 渲染Items时传入当前数量和回调函数 */}
      <Items 
        name="Pizza" 
        img="/pizza.jpg" 
        dis="美味芝士披萨" 
        price={19.99}
        quantity={itemQuantities["Pizza"] || 0}
        onQuantityChange={handleQuantityChange}
      />
      <Items 
        name="Burger" 
        img="/burger.jpg" 
        dis="经典牛肉汉堡" 
        price={12.99}
        quantity={itemQuantities["Burger"] || 0}
        onQuantityChange={handleQuantityChange}
      />
    </div>
  );
}

export default Menu;

2. 修改Items组件,依赖父组件传递的状态和方法

移除组件内部的quantity状态,改用父组件传入的props,点击按钮时调用父组件的回调更新状态:

import "./items.css"

function Items(props){
    const { name, quantity, onQuantityChange } = props;

    const add = () => {
        const newQuantity = quantity + 1;
        onQuantityChange(name, newQuantity);
    }
    
    const subtract = () => {
        if( quantity > 0){
            const newQuantity = quantity - 1;
            onQuantityChange(name, newQuantity);
        }
    }

    return(
        <div className="Item-card">
            <img src={props.img} className="Item-image"/>
            <div className="Item-info">
                <h1 className="Item-name">{props.name}</h1>
                <p className="Item-description">
                    {props.dis}
                    <p className="Item-price"> Price: {props.price}$</p>
                </p>
                <div className="Item-quantity">
                    <button className="button" id="add" onClick={add}>+</button>
                    <p className="quantity">{quantity}</p>
                    <button className="button" id="subtract" onClick={subtract}>-</button>
                </div>
            </div>
        </div>
    );
}

export default Items

为什么不要用DOM操作?

React是单向数据流,组件UI由状态驱动,直接操作DOM会打破这种机制,容易导致状态与UI不一致;而且多个同class元素时,DOM选择器无法精准区分每个组件的状态,这就是你之前获取值返回undefined的核心原因。

另外你原代码里的let pizza = 0是局部变量,组件每次渲染都会重置这个值,完全起不到存储数量的作用,状态提升后就不需要这类无效的局部变量了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 02:14:52