你好,你是否使用对象常量从一个字符串数组中渲染一个react元素来获取它的值?举个例子,我有一个字符串数组,我想使用一个函数来Map它,如果匹配的字符串返回react元素,这个函数返回一个带有预定义值的对象常量。下面是我尝试过的,但是没有显示图标
import { useCallback, useEffect, useMemo } from "react";
import PersonIcon from "@mui/icons-material/Person"
import ShoppingCartIcon from '@mui/icons-material/ShoppingCart'
import SecurityIcon from '@mui/icons-material/Security'
import LocalActivityIcon from '@mui/icons-material/LocalActivity'
export default function App() {
const iconNames = useMemo(()=>['PersonIcon','ShoppingCartIcon', 'SecurityIcon', 'LocalActivityIcon'],[]);
const getIcons = (icon) =>{
const icons = {
PersonIcon: <PersonIcon />,
ShoppingCartIcon: <ShoppingCartIcon />,
SecurityIcon: <SecurityIcon />,
LocalActivityIcon: <LocalActivityIcon />
}
return icons[icon];
}
const displayIcons = useCallback((arr) => {
return <ul>{arr.map((icon) => { return getIcons[icon] })}</ul>
},[])
useEffect(()=>{
displayIcons(iconNames)
})
return (
<div className="App">
<h1>Icons</h1>
{displayIcons}
</div>
);
}
2条答案
按热度按时间yeotifhr1#
假设图标是导入的并且是静态的,也许
icons
对象可以在组件外部定义,这样即使没有useMemo
或useCallback
,当组件重新呈现时也不会重新创建它。访问对象中的图标可能不需要
getIcons
,因为在输出JSX中,icons[name]
可以用花括号{}
括起来以呈现图标。示例(现场演示:stackblitz):
然而,根据用例的不同,也许还可以考虑使用其他方法来显示图标列表,而不是从对象访问它。
下面的例子显示了一个图标列表,如果需要的话,还可以传递MUI属性来设置它的样式(可能对其他库不起作用)。
示例(现场演示:stackblitz):
另一种可行的方法也可以工作(使用MUI)并接受图标的 prop ,方法是将图标定义为
map
中的组件:示例(现场演示:stackblitz):
omhiaaxx2#
1.当这是一个函数时,您将displayIcons作为变量调用。
您的代码可以简化为