reactjs - 如何使用它的snake_case名称动态加载图标(React,material-ui)

标签 reactjs icons material-design material-ui

通常我会通过直接导入来使用material-ui图标 per the material-ui instructions .

但是我有一个文本标记,它是实际的图标名称(如calendar_view_day),并且需要从中动态获取和渲染图标组件。

我怎样才能做到:

render() {
  return (
    <Icon name="calendar_view_day" color="primary" />
  )
}

而不是:

render() {
  return (
    <CalendarViewDay color="primary" />  // Imported by name
  )
}

最佳答案

后期编辑

编辑 2:在使用以下内容之前,请先查看 @Roozbeh 在 2023 年中期关于使用字体 Material 图标的最新答案。

<小时/>

编辑 1:此答案适用于 MUI v4,MUI v5 答案如下(但未经我测试)

正确答案

结果 material-ui 包含一个图标组件,允许您执行此操作...并且它会自行转换名称,因此接受 Snake、Pascal 和其他变体。 请注意,正如评论中指出的那样,这将大大增加 bundle 的大小。如果您的 bundle 大小受到限制,则必须采取不同的方法从某处提供图标 SVG!

import Icon from '@material-ui/core/Icon'

...

render() {
  return (
    <Icon>{props.iconName}</Icon>
  )
}

之前的答案(有效但过度杀伤力)

创建函数:

...然后使用material-ui Icon组件。

代码如下:

import Icon from '@material-ui/core/Icon'

function upperFirst(string) {
  return string.slice(0, 1).toUpperCase() + string.slice(1, string.length)
}

function fixIconNames(string) {
  const name = string.split('_').map(upperFirst).join('')
  if (name === '3dRotation') {
    return 'ThreeDRotation'
  } else if (name === '4k') {
    return 'FourK'
  } else if (name === '360') {
    return 'ThreeSixty'
  }
  return name
}

...

render() {
  const iconName = fixIconNames(props.iconName)
  return (
    <Icon>{props.iconName}</Icon>
  )
}

关于reactjs - 如何使用它的snake_case名称动态加载图标(React,material-ui),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56369444/

相关文章:

c++ - fatal error CVT1100 : duplicate resource. 类型 :ICON, 名称 :1 (C++, Visual Studio C++ 2010)

icons - 我在哪里可以获得 Material 图标的代码?

reactjs - 直接在material-ui的主题配置中支持渐变

html - 将音频对象添加到我的 react 状态数组

reactjs - 如何使用自定义 jss 插入点在 material-ui 中配置 makeStyles Hook ?

reactjs - 使用fabricjs中的所有对象调整/缩放整个 Canvas ,而不会损失质量

java - 将 android.support.v7.widget.CardView 导入 Eclipse 时遇到问题

javascript - React - 模态上的不变违规

c++ - 如何在QT中的QToolButton下方设置文本而不是在图标下方

javascript - Font Awesome 图标 innerHTML