我如何使用带有动态导入的样式组件
How do i use styled components with dynamic imports
我正在尝试找到一种方法来动态导入继承了一些标准样式的 svg 图标。我还没有看到其他人写过这个...所以我想我走错了路。
我已经尝试在样式化的组件中创建一个 SVG 包装器,但这给了我一个 svg > svg > path 的嵌套
我不确定这是否正确。
我想避免使用内联样式以防以后出现特殊性问题。
SVG 图标代码 <-- 使用 Create React App 我将 svg 导出为默认的 React 组件
export { ReactComponent as default } from './logo.svg';
我的图标代码 <-- styled.svg 是我想与 DynamicIcon 合并的东西...有没有办法将 DynamicIcon 作为 TestStyle? <-- 在文档中 as 用于更改标签类型所以我认为这是不对的?
const TestStyle = styled.svg`
height: 1rem;
width: 1rem;
display: inline-block;
`
const Icon: React.FC<IconProps> = ({ name }: IconProps): React.ReactElement => {
const DynamicIcon = lazy((): Promise<any> => import(`../../assets/icons/${name}.tsx`));
return (
<Suspense fallback={<div>Loading ...</div>}>
<DynamicIcon />
</Suspense>
);
};
导入正在运行并正在显示,但我希望将组件作为样式组件,这将使我能够访问主题并使用道具动态更改 SVG 样式。
ℹ - 我的 TypeScript foo 很弱所以将在下面使用 vanilla JS
您可以简单地用 styled(DynamicIcon)
包装动态加载的组件。
参考:Extending Styles 文档
// Instead of
// const TestStyle = styled.svg`
// height: ${props => props.size};
// width: ${props => props.size};
// display: inline-block;
// `;
const Icon = ({ name, iconSize }) => {
const DynamicIcon = lazy(() => import(`./icons/${name}.jsx`));
// ... Wrap the dynamically loaded component in `styled()`.
const StyledIcon = styled(DynamicIcon)`
height: ${props => props.size}px;
width: ${props => props.size}px;
display: inline-block;
`;
return (
<Suspense fallback={<div>Loading ...</div>}>
<StyledIcon size={iconSize} />
</Suspense>
);
};
⚠
但请注意,上面使用 prop.size
的用法不是一个好主意,因为它会为每个 width/height.
创建多个 类
(我试图用 .attrs
来绕过它,但无法让它工作,但我发现它超出了这个问题的范围并留给你 )
这是徽标包裹在样式化组件中的样子
我正在尝试找到一种方法来动态导入继承了一些标准样式的 svg 图标。我还没有看到其他人写过这个...所以我想我走错了路。
我已经尝试在样式化的组件中创建一个 SVG 包装器,但这给了我一个 svg > svg > path 的嵌套 我不确定这是否正确。 我想避免使用内联样式以防以后出现特殊性问题。
SVG 图标代码 <-- 使用 Create React App 我将 svg 导出为默认的 React 组件
export { ReactComponent as default } from './logo.svg';
我的图标代码 <-- styled.svg 是我想与 DynamicIcon 合并的东西...有没有办法将 DynamicIcon 作为 TestStyle? <-- 在文档中 as 用于更改标签类型所以我认为这是不对的?
const TestStyle = styled.svg`
height: 1rem;
width: 1rem;
display: inline-block;
`
const Icon: React.FC<IconProps> = ({ name }: IconProps): React.ReactElement => {
const DynamicIcon = lazy((): Promise<any> => import(`../../assets/icons/${name}.tsx`));
return (
<Suspense fallback={<div>Loading ...</div>}>
<DynamicIcon />
</Suspense>
);
};
导入正在运行并正在显示,但我希望将组件作为样式组件,这将使我能够访问主题并使用道具动态更改 SVG 样式。
ℹ - 我的 TypeScript foo 很弱所以将在下面使用 vanilla JS
您可以简单地用 styled(DynamicIcon)
包装动态加载的组件。
参考:Extending Styles 文档
// Instead of
// const TestStyle = styled.svg`
// height: ${props => props.size};
// width: ${props => props.size};
// display: inline-block;
// `;
const Icon = ({ name, iconSize }) => {
const DynamicIcon = lazy(() => import(`./icons/${name}.jsx`));
// ... Wrap the dynamically loaded component in `styled()`.
const StyledIcon = styled(DynamicIcon)`
height: ${props => props.size}px;
width: ${props => props.size}px;
display: inline-block;
`;
return (
<Suspense fallback={<div>Loading ...</div>}>
<StyledIcon size={iconSize} />
</Suspense>
);
};
⚠
但请注意,上面使用 prop.size
的用法不是一个好主意,因为它会为每个 width/height.
创建多个 类
(我试图用 .attrs
来绕过它,但无法让它工作,但我发现它超出了这个问题的范围并留给你 )
这是徽标包裹在样式化组件中的样子