我有一个接受一些参数并呈现 SVG 的函数。我想根据传递给函数的名称动态导入该 svg。它看起来像这样:
import React from 'react';
export default async ({name, size = 16, color = '#000'}) => {
const Icon = await import(/* webpackMode: "eager" */ `./icons/${name}.svg`);
return <Icon width={size} height={size} fill={color} />;
};
根据 动态导入的 webpack 文档 和神奇的评论“eager”:
“不生成额外的块。所有模块都包含在当前块中,并且没有发出额外的网络请求。承诺仍然返回但已经解决。与静态导入相比,模块直到调用导入才会执行() 制作。”
这就是我的图标解决的问题:
> Module
default: "static/media/antenna.11b95602.svg"
__esModule: true
Symbol(Symbol.toStringTag): "Module"
试图按照我的函数尝试呈现它的方式给我这个错误:
Objects are not valid as a React child (found: [object Promise]). If you meant to render a collection of children, use an array instead.
我不明白如何使用这个导入的模块将其呈现为组件,或者甚至可以这样吗?
原文由 Majoren 发布,翻译遵循 CC BY-SA 4.0 许可协议
您可以在导入 SVG 文件时使用
ref
和ReactComponent
命名导出。请注意,它必须是ref
才能正常工作。以下示例使用需要版本
v16.8
及更高版本的 React 挂钩。示例动态 SVG 导入挂钩:
打字稿中的示例动态 SVG 导入挂钩:
对于那些正在获取
undefined
forReactComponent
的人来说,当动态导入 SVG 时,这是由于 Webpack 插件添加了ReactComponent
以某种方式导入的不会触发动态导入。基于此 解决方案,我们可以通过在您的动态 SVG 导入上强制执行相同的加载程序来临时解决它。
唯一的区别是
ReactComponent
现在是default
输出。另请注意,使用带有可变部分的动态导入时存在限制。 This SO answer 详细解释了这个问题。
要解决此问题,您可以使动态导入路径更加明确。
例如,而不是
你可以把它改成