为什么我无法在 React 中访问对象数组中的键值

Why can't I access the key values in my array of objects in React

提问人:shimmyshimmyya7347 提问时间:8/25/2023 更新时间:8/25/2023 访问量:47

问:

我正在尝试创建一个应用程序,您可以在其中浏览食谱列表并单击食谱以将其添加到您的收藏夹列表中。目前,我的应用程序正在创建一张新卡,但该卡没有它应该包含的信息,即名称或文本。不幸的是,你们甚至都看不到图片,这是我将解决的另一个问题,但您可以在我尝试传递到收藏夹列表的每张卡片上看到其他信息。

顶级应用

import Favorites from "./Favorites";
import { Menu } from "./Menu";
import { Cards } from "./Cards";

import { useState } from "react";

import "./App.css";

function App() {
  const [favorite, setFavorite] = useState([]);
  const [array, setArray] = useState([
    {
      text: "Check 123",
      name: "Lahmacun",
      image: "./src/lahmacun.jpeg",
      id: self.crypto.randomUUID(),
      liked: false,
    },
    {
      text: "Check 456",
      name: "Chicken",
      image: "./src/chicken.webp",
      id: self.crypto.randomUUID(),
      liked: false,
    },
    {
      text: "Check 789",
      name: "Veggies",
      image: "./src/vegan.jpeg",
      id: self.crypto.randomUUID(),
      liked: false,
    },
    {
      text: "Check 012",
      name: "Pho",
      image: "./src/pho.jpeg",
      id: self.crypto.randomUUID(),
      liked: false,
    },
  ]);

  const handleLike = (card) => {
    setFavorite((prev) => [...prev, card]);
  };

  return (
    <div id="app">
      <h1>Recipes To Try</h1>
      <form className="m-2" action="">
        <div className="row">
          <div className="col-3 ">
            <label className="form-label pt-2" id="searchBar">
              Find A Recipe
            </label>
          </div>
          <div className="col-md-7 col-5">
            <input
              type="text"
              className="form-control"
              id="searchBar"
              placeholder="Search"
            />
          </div>
          <div className="col-sm-1 col-2">
            <button type="submit" className="btn btn-primary" id="searchBtn">
              Search
            </button>
          </div>
        </div>
      </form>
      <Favorites favorite={favorite} />
      <Menu array={array} handleLike={handleLike} />
    </div>
  );
}

export default App;

收藏夹组件

import { Cards } from "./Cards";

export default function Favorites({ favorite }) {
  return (
    <div id="favorites">
      <h1>Favorites</h1>
      {favorite.map((i) => (
        <div className="col col-md mb-3 mb-sm-0" key={i.id}>
          <div className="card">
            <img src={i.image} alt="" className="card-img-top " />
            <div className="card-body">
              <h5 className="card-title">{i.name}</h5>
              <p className="card-text">{i.text}</p>
              <a
                onClick={() => handleLike()}
                href="#"
                className="btn btn-primary"
              >
                Add to Favorites
              </a>
            </div>
          </div>
        </div>
      ))}
    </div>
  );
}

菜单组件

import { Cards } from "./Cards";

export function Menu({ array, handleLike }) {
  return (
    <div id="menu">
      <div className="row">
        <div className="col">
          <h3 className="">Ready for Testing</h3>
        </div>
      </div>
      <div className="row">
        <Cards array={array} handleLike={handleLike} />
      </div>
    </div>
  );
}

卡组件

export function Cards({ array, handleLike }) {
  return (
    <>
      {array.map((i) => (
        <div className="col col-md mb-3 mb-sm-0" key={i.id}>
          <div className="card">
            <img src={i.image} alt="" className="card-img-top " />
            <div className="card-body">
              <h5 className="card-title">{i.name}</h5>
              <p className="card-text">{i.text}</p>
              <a onClick={handleLike} href="#" className="btn btn-primary">
                Add to Favorites
              </a>
            </div>
          </div>
        </div>
      ))}
    </>
  );
}

感谢您的帮助!

我本以为添加的卡片包含姓名、文本、ID 和图像,但我只得到了一张带有按钮的卡片。

ReactJS 数组对象 onclick react-props

评论

0赞 Aleksandar 8/25/2023
根据下面的答案,您还有另一个内部组件,您可以在其中传递一个函数,但该函数()需要一个参数,因此您必须再次将其修改为 .除此之外,如果您的问题超出了此错误;在 React CodeSandBox 中创建一个最小的生殖代码。onClickCardshandleLikecardonClick={() => handleLike(i)}

答:

0赞 Niraj Kumar Chaurasiya 8/25/2023 #1

我查看了您的代码;看起来您正在调用一个函数来将某个食谱添加为收藏夹。 一切看起来都正确,但 Favorites.jsx 组件中存在一个愚蠢的错误。

您的功能是:

 const handleLike = (card) => {
    setFavorite((prev) => [...prev, card]);
  };

看看你的功能;您正在传递一个参数,即“card”。但是,在 Favorites.jsx 组件中,您只传递了该函数。

import { Cards } from "./Cards";

export default function Favorites({ favorite }) {
  return (
    <div id="favorites">
      <h1>Favorites</h1>
      {favorite.map((i) => (
        <div className="col col-md mb-3 mb-sm-0" key={i.id}>
          <div className="card">
            <img src={i.image} alt="" className="card-img-top " />
            <div className="card-body">
              <h5 className="card-title">{i.name}</h5>
              <p className="card-text">{i.text}</p>
              <a
                onClick={() => handleLike() // Nothing passed as an argument here.
                }
                href="#"
                className="btn btn-primary"
              >
                Add to Favorites
              </a>
            </div>
          </div>
        </div>
      ))}
    </div>
  );
}

现在,我想你明白这个问题了。 在 Favorite.jsx 组件的 onClick 函数中

只需传递参数,即 .i

修订后的代码:

{favorite.map((i) => (
  <div className="col col-md mb-3 mb-sm-0" key={i.id}>
    <div className="card">
      {/* ... */}
      <h5 className="card-title">{i.name}</h5>
      <p className="card-text">{i.text}</p>
      <a onClick={() => handleLike(i)} href="#" className="btn btn-primary">
        Add to Favorites
      </a>
    </div>
  </div>
))}

我希望这会有所帮助。它可能会在某个时候发生,所以不要担心。

评论

0赞 shimmyshimmyya7347 8/25/2023
嘿,感谢您的回复!我想你可能有传递参数的想法,但是当我将 i 传递给句柄时,我得到了相同的结果......还有其他想法吗?
0赞 Niraj Kumar Chaurasiya 8/25/2023
你能向我提供这个项目的 GitHub URL 吗?