从stackoverflow的this answer中,我得到了一个关于如何将svg导入为 ReactComponent 并更改其颜色/宽度等的解决方案。
但是对于动态导入是否可以做同样的事情呢?我的功能组件:
import * as React from 'react';
import SvgIconComponent from './SvgIcon.Interface';
import {ReactComponent} from '*.svg';
const SvgIcon: React.FC<SvgIconComponent> =({width, color, name}) =>
{
import(`../../assets/icons/${name}.svg`).then((Icon) => {
return <Icon fill={color} width={width}/>
});
};
export default SvgIcon;
在当前实现中,我得到错误:
TS2749: 'ReactComponent' refers to a value, but is being used as a type here. // .then((Icon as ReactComponent)
TS2604: JSX element type 'Icon' does not have any construct or call signatures. // .then(Icon)
5条答案
按热度按时间2ic8powd1#
我建议你使用
process.env.PUBLIC_URL
来渲染你的svg。把你所有的svg文件放在public
文件夹里,比如说public/svgFiles
。然后可以将其用作
<img src={process.env.PUBLIC_URL + "/svgFiles/" + file_name} alt="project" />
由于公共文件夹中的所有内容都包含在最终的
build
中,所以所有的svg文件以及您使用的路径都将得到处理,由于所有内容都将从公共文件夹引用,因此构建后路径不会更改。方法二
通过以下方式将SVG作为react组件导入:
现在您可以传递SVGComponent中可用的所有 prop ,例如
pokxtpni2#
我认为使用React组件来制作颜色和宽度的动态图标是一种更好的方法。
我添加示例代码:
如果你想制作图标库
如果你有太多的SVG图标,我没有任何解决方案,我的手现在。如果我有任何好主意,我会再次张贴在这里。
zbq4xfa03#
从我所看到的你的问题是,你导入整个文件,并试图把它呈现为一个组件,你需要附加键/组件标识符/常量名称到require.例如,如果你使用export defualt YourSVGComponent,你可以通过以下操作动态访问它:
yeotifhr4#
这里有许多错误。
∮ ∮ ∮ ∮ ∮一个月一个月
您在链接答案中看到的
ReactComponent
实际上是Create React应用程序加载.svg
文件时的一个属性。这是一个超级整洁的功能,我今天才第一次了解它!在该示例代码中
他们所做的是从
'./logo.svg'
导入中获取ReactComponent
属性,并将其重命名为Logo
。您的
import {ReactComponent} from '*.svg';
没有多大意义。将
ReactComponent
用作类型时,会出现"type as value"错误,因为它不是类型。您尝试使用.then((Icon as ReactComponent)
执行的类型Assert应该是.then((Icon as React.ComponentType<SomePropsType>)
。一米十一秒
让我们花点时间看看从
import
语句中实际得到了什么。您应该看到一个具有三个属性的对象:一米十二氮一x、一米十三氮一x和一米十四氮一x。
从svg文件导入的
default
(也是Url
属性)是图像的data-url,可以在img
src
属性中使用。ReactComponent
是我们要找的属性!这就是Create React App将svg转换为React组件的地方。(注意:名称"SvgLogo"取决于文件的名称)。一米二十分
SvgIcon
函数没有返回任何内容。您拥有的return
语句是then
回调的返回。处理异步的
import
有点棘手,因为你在第一次渲染时没有值,在这种情况下,我们可以返回null
(或者你可能想返回一个大小的占位符)。这里我使用
element
状态来存储返回的元素,它以null
开始,在加载后被替换为<Icon/>
。我在一个依赖于你的 prop 的
useEffect
中调用import
。一旦导入解析,我们就从res.ReactComponent
中得到Icon
。Icon
的推断类型是any
,这对您来说可能很好。如果您想要一个准确的类型,可以使用凌乱的as React.ComponentType<JSX.IntrinsicElements['svg']>;
,它表示"这是一个React组件,它接受<svg>
元素的所有属性"。enyaitl35#