0

我在我的反应应用程序中使用 react-icons 包。从某种意义上说,它可以正常工作,您可以通过以下方式导入和使用字体真棒图标:

import { FaTag } from 'react-icons/fa';
...
<FaTag />

但是,我希望能够在更可重用的组件中生成这些图标。例如,支持我有一个菜单列表,每个项目都有一个图标。该列表作为数组发送,其中一项是标题,一项是链接地址,一项是图标名称。没有动态方法,你必须这样做......

const SidebarMenuItem:FC<propsObj> = ({title, link, icon}):ReactElement => {

  return (

    <li>
      <Link to={link}>
        <span>{title}</span>
        { (icon==="Tag") && <FaTag /> }
        { (icon==="QuestionCircle") && <FaQuestionCircle /> }
        { (icon==="UserAstrounaut") && <FaUserAstronaut /> }
        { (icon==="InfoCircle") && <FaInfoCircle /> }
        { (icon==="List") && <FaList /> }
        { (icon==="Cogs") && <FaCogs /> }
      
      </Link>

    </li>

  )
}

export default SidebarMenuItem;

我希望能够动态地做到这一点。我对包含我需要使用的每个图标的大型导入语句没有问题。在那之后我想做的是……

const SidebarMenuItem:FC<propsObj> = ({title, link, icon}):ReactElement => {

  const iconElement = React.createElement(icon, null);

  return (

    <li>
      <Link to={link}>
        <span>{title}</span>
        <div>{iconElement}</div>         
      </Link>
    </li>

  )
}

export default SidebarMenuItem;

这实际上会导致正确的组件被渲染。但是,没有图标出现,也没有 svg 图形。似乎在编译过程的某个地方,字体真棒包在运行创建组件之前渲染了图形?

有没有办法解决?

4

2 回答 2

0

您可以制作一系列组件,例如

import React from 'react'
import { FaTag, FaList } from 'react-icons/fa'

const components = {
    FaTag,
    FaList,
}

function SidebarMenuItem({title, link, icon}) {
    //given that icon contains 'Tag' or 'List'
    const Icon = components[`Fa${icon}`]
    return (
       <li>
         <Link to={link}>
           <span>{title}</span>
           <Icon />         
         </Link>
       </li>
    )
}
于 2021-07-26T07:21:14.660 回答
0

我猜你正在使用一个模块捆绑器,它智能地只包含你在代码中使用过的文件(比如 webpack)。有关这方面的更多信息,请参阅摇树。

如果你只是想绕过制作一个需要图标的组件,你可以简单地通过 props 注入它:

const SidebarMenuItem:FC<propsObj> = ({title, link, IconComponent}):ReactElement => {
  return (
    <li>
      <Link to={link}>
        <span>{title}</span>
        <IconComponent />        
      </Link>
    </li>

  )
}

export default SidebarMenuItem;

// use this like so:
import { FaTag } from 'react-icons/fa';
//... somewhere in render
<SidebarMenuItem title="the title" link="http://google.com" icon={FaTag} />

这并没有摆脱这些import语句,但由于像 vscode 这样的 IDE 会在您编码时自动插入导入(如果配置正确),我认为这没什么大不了的。它还使您的模块捆绑器实际上只包含您使用的图标。

于 2021-07-26T07:50:21.417 回答