如何使用钩子在 React 中显示所选项目的相应图像

How to display corresponding image from selected item in React using hooks

主要目标是能够从菜单中 select 一个口袋妖怪,一旦用户 select 编辑了一个口袋妖怪,下面的图像就会变为显示口袋妖怪的匹配图像。 (例如,默认情况下,Bulbasaur 是 selected 并且显示 Bulbasaur 的图像。一旦用户选择 Charmander,Bulbasaur 的图像就会变为 Charmander。)

两个主要组件是 StarterSelector 包含带有所有选项的下拉菜单和 StarterShower 包含图像。

目前,我的菜单工作正常,但我正在尝试弄清楚如何在菜单中向 selected 口袋妖怪显示相应的图像。

我试图添加一个 onChange 函数,一旦菜单中的项目被 selected 将处理逻辑,但我不知道如何使它们一起工作。

App.js

import React, { useState } from "react";
import logo from "./logo.svg";
import "./App.css";
import StarterSelector from "./StarterSelector";
import StarterShower from "./StarterShower";

function App() {
  const [starterList, setStarterList] = useState([
    { id: 1, name: "Bulbasaur" },
    { id: 2, name: "Charmander" },
    { id: 3, name: "Squirtle" },
  ]);

  const [imgList, setImgList] = useState([
    { id: 1, image: "/assets/img/bulbasaur.png" },
    { id: 2, image: "/assets/img/charmander.png" },
    { id: 3, image: "/assets/img/squirtle.png" },
  ]);

  return (
    <div className="App">
      <header className="App-header">
        <StarterSelector starterList={starterList} />
        <StarterShower imgList={imgList} />
      </header>
    </div>
  );
}

export default App;

StarterSelector.js

    import React, { useState } from "react";
    import StarterShower from "./StarterShower";
    
    export default function StarterSelector({ starterList }) {
      const onChangePokemon = (imgList) => {
        alert("Pokemon changed");
      };
    
      return (
        <div>
          Pick your favorite pokemon :
          <select onChange={onChangePokemon}>
            {starterList.map((starterList) => (
              <option key={starterList.id} value={starterList.name}>
                {starterList.name}
              </option>
            ))}
          </select>
        </div>
      );
    }

StarterShower.js

import React, { useState } from "react";

export default function StarterShower({ imgList }) {
  return (
    <section>
      {imgList.map((imgList) => {
        return <img src={imgList.image} alt={imgList.id}></img>;
      })}
    </section>
  );
}

这可行,您只需获取目标的值,在本例中为名称,但最好将 id 作为 <option> 值。因此,您获取该值并搜索列表中的项目,仅此而已:)

import React, { useState, useEffect } from "react";
import StarterShower from "./StarterShower";

export default function StarterSelector({ starterList }) {
  const [selectedPokemon, setSelectedPokemon] = useState();

  const onChangePokemon = (event) => {
    setSelectedPokemon(
      starterList.find((pokemon) => pokemon.name === event.target.value)
    );
  };

  useEffect(() => {
    console.log("New pokemon selected: ", selectedPokemon);
  }, [selectedPokemon]);

  return (
    <div>
      Pick your favorite pokemon:
      <select onChange={onChangePokemon}>
        {starterList.map((starterList) => (
          <option key={starterList.id} value={starterList.name}>
            {starterList.name}
          </option>
        ))}
      </select>
    </div>
  );
}