如何在 React 中动态导入组件?
How to dynamically import a component in React?
我正在尝试使用动态渲染优化我的一个组件,但我遇到了一些问题,所以这是我目前的情况:
我有一个 Alert
组件,它会呈现一条警告消息以及一个图标。
我有一个 Icons
模块,它是一个图标库
我目前正在渲染图标如下(这不是实际代码,只是为了给出想法):
import * as icons from '../icons';
import DefaultIcon from '../icons';
function Alert(iconName='defaultIcon', message) {
function getIcon(iconName) {
if (iconName === 'defaultIcon') {
return DefaultIcon()
}
return icons[iconName]
}
return (
<div>
<span>{getIcon(iconName)}</span>
<span>{message}</span>
</div>
)
}
所以,假设 Alert
在大多数情况下被调用时没有 iconName
,那么组件根本不需要导入所有图标。
我想避免在 Alert
组件中默认包含所有图标,但只有在指定 iconName
时才这样做
甚至可以这样做吗?
我认为这种方式不可能。
也许为导入图标库的图标创建一个组件。在 Alert 组件中,您可以将 Icon 组件作为子组件实现:
<Alert message="Alert!">
<Icon iconName="defaultIcon" />
</Alert>
您应该使用类型或名称等动态导入图标,如下所示。
import React from 'react';
export default function Icon({ type, ...props }) {
const Icon = require(`./icons/${type}`).default;
return <Icon {...props} />
}
import Icon from './Icon';
<Icon type="addIcon" />
好的,看起来我成功了,我就是这样做的:
import DefaultIcon from '../icons';
function Alert(message, iconName="") {
const [icon, useIcon] = useState();
//componentDidMount
const useEffect(() => {
//if an icon name is specified, import the icons
if (iconName) {
import("./icons").then(icons => setIcon(icons[iconName]))
} else {
setIcon(DefaultIcon)
}
}
,[])
return (
<span>{icon}</span>
<span>{message}</span>
)
}
我正在尝试使用动态渲染优化我的一个组件,但我遇到了一些问题,所以这是我目前的情况:
我有一个 Alert
组件,它会呈现一条警告消息以及一个图标。
我有一个 Icons
模块,它是一个图标库
我目前正在渲染图标如下(这不是实际代码,只是为了给出想法):
import * as icons from '../icons';
import DefaultIcon from '../icons';
function Alert(iconName='defaultIcon', message) {
function getIcon(iconName) {
if (iconName === 'defaultIcon') {
return DefaultIcon()
}
return icons[iconName]
}
return (
<div>
<span>{getIcon(iconName)}</span>
<span>{message}</span>
</div>
)
}
所以,假设 Alert
在大多数情况下被调用时没有 iconName
,那么组件根本不需要导入所有图标。
我想避免在 Alert
组件中默认包含所有图标,但只有在指定 iconName
时才这样做
甚至可以这样做吗?
我认为这种方式不可能。
也许为导入图标库的图标创建一个组件。在 Alert 组件中,您可以将 Icon 组件作为子组件实现:
<Alert message="Alert!">
<Icon iconName="defaultIcon" />
</Alert>
您应该使用类型或名称等动态导入图标,如下所示。
import React from 'react';
export default function Icon({ type, ...props }) {
const Icon = require(`./icons/${type}`).default;
return <Icon {...props} />
}
import Icon from './Icon';
<Icon type="addIcon" />
好的,看起来我成功了,我就是这样做的:
import DefaultIcon from '../icons';
function Alert(message, iconName="") {
const [icon, useIcon] = useState();
//componentDidMount
const useEffect(() => {
//if an icon name is specified, import the icons
if (iconName) {
import("./icons").then(icons => setIcon(icons[iconName]))
} else {
setIcon(DefaultIcon)
}
}
,[])
return (
<span>{icon}</span>
<span>{message}</span>
)
}