React - 在地图函数中生成不同的图标

yab*_*ugh 3 reactjs react-icons

我有一个侧边栏组件,其列表项是在地图函数内部生成的(从 api 获取的电影类型)。我希望每种电影类型旁边都有一个不同的图标,但无法找到一种方法来为地图功能的每次运行创建不同的图标。

我的想法是第一:按照我希望显示的顺序制作一个我想要显示的图标的数组。

 const icons = [
    "AiOutlineHome ",
    "FaUserNinja",
    "GiSwordman",
    "GiBabyFace",
    "FaLaughBeam",
    "GiPistolGun",
    "GiPineTree",
    "GiDramaMasks",
    "GiFamilyHouse",
    "GiElfEar",
    "GiScrollUnfurled",
    "GiScreaming",
    "GiMusicalNotes",
    "GiMagnifyingGlass",
    "FaRegKissBeam",
    "GiMaterialsScience",
    "GiHalfDead",
    "GiGreatWarTank",
    "GiCowboyBoot",
  ];
Run Code Online (Sandbox Code Playgroud)

然后在我的地图函数中为每个列表项生成不同的图标

{movieGenres.map((genre) => {
            return (
              <li key={genre.id} className="nav-text">
                <button
                  className="genre-btn"
                  onClick={() => genreSelectionHandler(genre.id)}
                >
                  *<GENERATE ICON HERE />*
                  <span className="nav-item-title">{genre.name}</span>
                </button>
              </li>
            );
          })}
Run Code Online (Sandbox Code Playgroud)

是否可以务实地创建这样的组件?这样,如果我想要不同的图标,我可以避免单独创建每个列表项。

tri*_*ixn 8

您只需获取您的流派索引即可获取图标。索引是函数回调的第二个参数map()

{movieGenres.map((genre, idx) => (
    <li key={genre.id} className="nav-text">
        <button
            className="genre-btn"
            onClick={() => genreSelectionHandler(genre.id)}
        >
            <Icon icon={icons[idx]} />
            <span className="nav-item-title">{genre.name}</span>
        </button>
    </li>
))}
Run Code Online (Sandbox Code Playgroud)

Icon组件将根据您使用的图标类型来呈现图标。

编辑

当您想要使用时,react-icons您需要导入实际的图标组件,而不仅仅是使用字符串:

import {AiOutlineHome} from "react-icons/ai";
import {FaUserNinja} from "react-icons/fa";
// ....

const icons = [
    AiOutlineHome,
    FaUserNinja,
    // ...
];
Run Code Online (Sandbox Code Playgroud)

并渲染它们:

{movieGenres.map((genre, idx) => {
    // must be a capitalized name in order for react to treat it as a component
    const Icon = icons[idx];

    return (
        <li key={genre.id} className="nav-text">
            <button
                className="genre-btn"
                onClick={() => genreSelectionHandler(genre.id)}
            >
                <Icon />
                <span className="nav-item-title">{genre.name}</span>
            </button>
        </li>
    )
})}
Run Code Online (Sandbox Code Playgroud)