亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ReactJS Hooks 中的關鍵參數問題,在單獨使用(加/減)時更新所有產品項

ReactJS Hooks 中的關鍵參數問題,在單獨使用(加/減)時更新所有產品項

鳳凰求蠱 2022-11-11 16:05:40
在 ReactJS 中將 key 參數應用于以下代碼時,我有點困惑,我知道我們需要使用 key 參數來唯一標識每個 DOM 元素,當我嘗試在按鈕中使用 key={index} 時出現錯誤(遇到兩個孩子用同一個鑰匙)。這里我也有點疑惑,因為更新setQuantity所有產品中的所有項目(如下圖所示),不知道如何使用唯一的關鍵項目來僅更新每個產品數量。任何幫助表示贊賞。更新 1:代碼現在更新為 key={productName},但在添加/減去單個產品時,所有產品的加/減值仍在更新function Home({ props }) {  //quantitiyselected, to set the no. of items purchased  const [quantitiyselected, setQuantity] = useState(0);  // below function to add, subtract quantity  let selectquantity = (e) => {    if (e.currentTarget.name == "add") {      let i = quantitiyselected + 1;      setQuantity(i);    } else if (e.currentTarget.name == "subtract" && quantitiyselected > 0) {      let z = quantitiyselected - 1;      setQuantity(z);    } else;  };  return (    <div className="products">      {props.map((eachproduct, index) => {        let productName = eachproduct.product_name;        let producNumber = eachproduct.producNumber;        let price = eachproduct.price;        let desc = eachproduct.productDescription;        let photo = eachproduct.image_URL;        let stockQuantity = eachproduct.stockQuantity;        return (          <div className="products" key={productName }>            <ul>              <li>                <img className="products-image" src={photo} />              </li>              <li>{productName} </li>              <li>                Item No:{producNumber}(InStock:{stockQuantity})              </li>              <li>price:{price}£ </li>              <li>{desc}</li>              <li>                <ButtonGroup aria-label="quantityofproduct">                  <Button                                        variant="secondary"                    name="subtract"                    value="subtract"                    onClick={selectquantity}                  >                    -                  </Button>                  <Button variant="secondary">                    {quantitiyselected}                  </Button>                  <Button
查看完整描述

1 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

您正在應用于key={index}渲染中的多個元素(<div><ul>each <Button />),但它只需要在數組中呈現的頂級元素上進行,在您的情況下是<div className="products">.

順便說一句,數組索引通常不是鍵的好候選 - 它應該對正在呈現的每個項目都是唯一的。在您的示例中,我認為producNumber這是最好的選擇,因為我假設它是每個產品的唯一標識符。

  • key={index}從你擁有的所有東西中刪除

  • 添加key={producNumber}到內部<div className="products">

是一個很好的資源來了解更多關于 React 的keyprop。


每個產品的數量相同的原因是您的州只有一個數字:

React.useState(0);

您正在嘗試跟蹤每個產品的數量,因此您需要每個產品的數量。您可以做到這一點的一種方法是使用一個對象 ( {}),該對象 ( ) 具有您的屬性producNum和數量的屬性作為它們的值。例如:

const products = [

  { name: "thing", num: 152 },

  { name: "other-thing", num: 254 },

];


const initialQuantities = products.reduce(

  (quantities, product) => ({ ...quantities, [product.num]: 0 }),

  {}

);


console.log(initialQuantities);

這將使用初始數量為 0 的每個產品創建對象。


然后當您增加或減少數量時,您會將您單擊的產品的產品編號傳遞給函數,然后您可以設置該產品的新數量,而使用Spread語法(. ..):


const initialQuantities = products.reduce(

  (quantities, product) => ({ ...quantities, [product.producNumber]: 0 }),

  {}

);


const [quantities, setQuantities] = React.useState(initialQuantities);


const increase = (productNum) => {

  setQuantities({

    ...quantities,

    [productNum]: quantities[productNum] + 1,

  });

};


const decrease = (productNum) => {

  setQuantities({

    ...quantities,

    [productNum]: Math.max(0, quantities[productNum] - 1),

  });

};

然后你onClick會變成:


onClick={() => increase(producNumber)}


onClick={() => decrease(producNumber)}

在這里可以看到一個簡單的實現:https ://codesandbox.io/s/icy-dust-nbetq?file=/src/App.js:175-655


查看完整回答
反對 回復 2022-11-11
  • 1 回答
  • 0 關注
  • 97 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號