使用 React onMouseEnter 和 onMouseLeave 为每个列表项显示不同的图像

Show different images for each list item with React onMouseEnter and onMouseLeave

我是 React 的新手,在写这篇文章之前,我到处寻找我的问题: 我有一个包含四个项目的列表,我想在悬停时为每个项目显示不同的图像。

const [isShown, setIsShown] = useState(false);
  return (
    <div className="App">
      <ul>
        <li>
          <a
            onMouseEnter={() => setIsShown(true)}
            onMouseLeave={() => setIsShown(false)}
            href="/"
          >
            Item1
          </a>
          {isShown && (
            <div style={{ width: `width: 300px` }}>
              <img
                className="image"
                src="https://images.pexels.com/photos/1145720/pexels-photo-1145720.jpeg?auto=compress&cs=tinysrgb&dpr=3&h=750&w=1260"
                alt=""
              />
            </div>
          )}
        </li>
         ...

我对每个 <li> 都使用了这个程序,但无论我悬停在哪个项目上,都会显示所有图像。

有人可以帮助我吗?谢谢

Here例子

更新

我尝试按照 John 的建议使用数组,但我做错了,因为图像显示在一起:

const projects = [
  { id: 1, title: "Item1" },
  { id: 2, title: "Item2" },
  { id: 3, title: "Item3" },
  { id: 4, title: "Item4" }
];

const images = [
  {image: "https://placekitten.com/800/600", id: 1},
  {image: "https://placekitten.com/800/600", id: 2},
  {image: "https://placekitten.com/800/600", id: 3},
  {image: "https://placekitten.com/800/600", id: 4},
];
function Portfolio(props) {
  const [isShown, setIsShown] = useState(false);

  return (
    <section>
      <div className="wrap">
        <div className="container">
          <ul className="wrap">
            {props.projects.map((project, image) => (
              <li key={project.id}>
                <a
                  onMouseEnter={() => setIsShown(true)}
                  onMouseLeave={() => setIsShown(false)}
                  href="/"
                >
                  {project.title}
                </a>
                {isShown && (
                  <img key={image.id} src={image} style={{position: `absoulte` }}/>
                )}
              </li>
            ))}
          </ul>
        </div>
      </div>
    </section>
  );

这是因为您使用同一个标志 isShown 来显示所有图像。您应该做的是将它从 boolean 更改为 int 并为其分配索引。

onMouseEnter={() => setIsShown(1)}
onMouseLeave={() => setIsShown(0)}

..

onMouseEnter={() => setIsShown(2)}
onMouseLeave={() => setIsShown(0)}

... etc

所以对于每张图片,你都会有这样的东西

isShown === 1 && (
  ...code
)

isShown === 2 && (
  ...code
)

这样一来,每张图片都将依赖于一个特定的值,从而使它们彼此独立。

一个小建议。由于您正在打印的代码是多余的,我建议您创建项目的 array 并将它们映射到渲染器上,而不是手动打印每个项目。如果您对此有更多疑问,请告诉我。


更新:

我认为有人误解了我的建议。我现在正在调整你的代码,也许现在它会更清晰。

function Portfolio(props) {
  const [isShown, setIsShown] = useState(false);
  const projects = [
    { id: 1, title: "Item1", image: "https://placekitten.com/800/600" },
    { id: 2, title: "Item2", image: "https://placekitten.com/800/600" },
    { id: 3, title: "Item3", image: "https://placekitten.com/800/600" },
    { id: 4, title: "Item4", image: "https://placekitten.com/800/600" }
  ];

  return (
    <section>
      <div className="wrap">
        <div className="container">
          <ul className="wrap">
            {projects.map((project, image) => (
              <li key={project.id}>
                <a
                  onMouseEnter={() => setIsShown(project.id)}
                  onMouseLeave={() => setIsShown(0)}
                  href="/"
                >
                  {project.title}
                </a>
                {isShown === project.id && (
                  <img src={project.image} style={{position: `absoulte` }}/>
                )}
              </li>
            ))}
          </ul>
        </div>
      </div>
    </section>
  );
}

如果您有任何问题,请告诉我。