JSX! == HTML
JSX - это расширенный набор JavaScript, что означает, что вы не можете рассматривать JSX как строку, как с необработанным HTML.
Если вы используете значки Material UI, вам нужно импортировать их реализацию как любой другой компонент и использовать ссылку в ваших данных.
import { AccessAlarm, ThreeDRotation } from '@material-ui/icons';
export const nav = [
{ id: 1, label: "test", link: "/test", NavIcon: AccessAlarm },
{ id: 2, label: "test2", link: "/test2", NavIcon: ThreeDRotation }
];
ListItemIcon и React Element
ListItemIcon
children
prop ожидает один React Element .
Содержимое компонента, обычно Icon
, SvgIcon
или @material-ui/icons
SVG icon element.
Элемент является визуализированным компонентом React, например, простым объектом, возвращаемым React.createElement
. Хотя мы не хотим предварительно визуализировать их вне цикла рендеринга React, так как это испортит жизненный цикл компонентов Icon.
Чтобы достичь этого, оставляйте только тип компонента вместо строки.
{
id: 3,
label: "test2",
link: "/test2",
NavIcon: NotificationsIcon // also notice the capital "NavIcon" key.
}
Затем визуализируйте значок, используя его тип. Пример примерно такой:
{data.map(({ id, label, link, NavIcon }) => (
<ListItem key={id}>
<ListItemText primary={label} />
<ListItemIcon>
<NavIcon />
</ListItemIcon>
</ListItem>
))}
Если вы действительно не можете изменить формат базы данных, можно санировать имена значков и загружать их с помощью имя позже, используя UI материала Icon
компонент .
children: имя лигатуры шрифта значка.
Если вы можете сохранить только "NotificationsIcon"
часть строки и удалите любой тег, например, специальные символы, из значения значков в базе данных, тогда это будет только:
import Icon from '@material-ui/core/Icon';
// somewhere
const data = [
{ id: 1, label: "test", link: "/test", icon: "AccessAlarm" },
{ id: 2, label: "test2", link: "/test2", icon: "ThreeDRotation" }
]
// then when rendering
{data.map(({ id, label, link, icon }) => (
<ListItem key={id}>
<ListItemText primary={label} />
<ListItemIcon>
<Icon>{icon}</Icon>
</ListItemIcon>
</ListItem>
))}
Но вы чаще всего сохраняете имя, которое пользовательский интерфейс Material использует для идентифицируйте свои значки.
Обратите внимание, что строка не содержит своих собственных кавычек как часть своего значения, поэтому .replace(/"/g, "")
вообще ничего не делает и возвращает ту же строку, если у нее не было других "
внутри, как в кавычках.
console.log("<SettingsInputComponentIcon />".replace(/"/g, ""))
// => "<SettingsInputComponentIcon />"