【发布时间】:2020-08-03 22:43:49
【问题描述】:
我有一个接受一些参数并呈现 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 documentation for dynamic imports和神奇的评论“eager”:
"不生成额外的块。所有模块都包含在当前 块并且不发出额外的网络请求。承诺还在 返回但已经解决。与静态导入相比, 在调用 import() 之前,模块不会执行。"
这就是我的图标被解析为:
> 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.
我不明白如何使用这个导入的 Module 将其渲染为组件,或者甚至可以这样吗?
【问题讨论】:
-
如果您静态导入,您的 svg 是否正确显示?
-
是的!如果我做一个普通的
import MyIcon from './icons/myicon.svg',我可以像<MyIcon />一样渲染它。 -
您可能不得不将解析后的 SVG 存储在一个状态中。
-
@dev_junwen 正确,但将其存储在 state 中仍然无法让我将其呈现为内联 svg。
-
或者另一种相当“动态”的方式是您可以定义名称到 SVG 组件的映射,然后使用括号符号语法
iconMap[name]检索正确的 SVG。我还没有测试它,但我认为这可以工作。在这种情况下,您需要导入所有 SVG 并将其分配给地图。
标签: javascript reactjs webpack webpack-4