reactjs - 像这样的样式组件是一种不好的做法吗?
问题描述
我想知道这种带有styled-components
、nextjs
和typescript
的方法是否react
存在任何重大缺陷或性能问题。我想创建一个默认没有样式的组件,并且可以为组件内的每个 HTML 元素提供 CSS 样式。我还需要确保提供的 CSS 样式可以与样式化的 HTML 元素将从组件接收的道具一起使用。我将展示一些代码:
Repo 可以在:Github 链接中找到
导航.tsx
import { ReactElement, memo, useMemo, useCallback } from "react";
import Link from "next/link";
import * as S from "./navigation.styles";
import { Style } from "../../types";
export type NavigationLinks = { [key: string]: string };
type Props = {
styles?: {
navigation: Style;
link: Style;
};
links: NavigationLinks;
currentRoute: string;
};
function Navigation({
styles = { navigation: null, link: null },
links,
currentRoute,
}: Props): ReactElement {
const generateNavigationLinks = useCallback(
function(links: NavigationLinks) {
return Object.keys(links).map((linkName) => {
const href = links[linkName];
const isCurrent = href === currentRoute;
return (
<Link key={linkName} href={href}>
<S.Link styles={styles.link} active={isCurrent}>
{linkName}
</S.Link>
</Link>
);
});
},
[currentRoute, styles.link]
);
const navLinks = useMemo(() => {
return generateNavigationLinks(links);
}, [generateNavigationLinks, links]);
return <S.Navigation styles={styles.navigation}>{navLinks}</S.Navigation>;
}
export default memo(Navigation);
导航样式.ts
import styled from "styled-components";
import { Style, ExportProps } from "../../types";
type Props = { styles: Style };
type Activatable = { active: boolean };
export const Navigation = styled.nav<Props>`
${(props): Style => props.styles}
`;
export type LinkProps = ExportProps<Props & Activatable>;
export const Link = styled.a<Props & Activatable>`
${(props): Style => props.styles}
`;
索引.tsx
import { ReactElement, memo } from "react";
import * as S from "../styles/index.styles";
import Navigation, {
NavigationLinks,
} from "../components/Navigation/navigation";
const navigationLinks: NavigationLinks = {
Home: "/",
Blog: "/blog",
About: "/about",
};
const navigationStyles = {
navigation: S.Navigation,
link: S.Link,
};
type Props = { currentRoute: string };
function Home({ currentRoute }: Props): ReactElement {
return (
<>
<Navigation
links={navigationLinks}
styles={navigationStyles}
currentRoute={currentRoute}
/>
</>
);
}
export default memo(Home);
索引样式.ts
import { css } from "styled-components";
import { LinkProps } from "../components/Navigation/navigation.styles";
export const Navigation = css`
background-color: green;
`;
export const Link = css<LinkProps>`
color: ${(props): string => (props.active ? "red" : "black")};
`;
我知道这可能是一个大问题,但我只是想知道这种方法是否有任何大问题或被认为是一种“反实践”。非常感谢你的帮助!
解决方案
样式化组件中使用的任何类都不能在整个应用程序的上下文中重用,这不是 DRY 并且违背了 CSS 的目的。样式组件与内联样式一样好,没有关注点分离和良好的旧意大利面条代码
推荐阅读
- gcc - 在 Linux 上交叉编译 gcc 10.1.0 for avr 失败
- gradle - gradle maven 发布插件:无法通过“发布”上传 zip
- django - CreateView 错误 NOT NULL 约束失败:members_experience.CustomUser_id
- flutter - Flutter 中类似 Laravel 的路由模式
- r - 从句子转换器创建对象时 GPU 内存泄漏
- java - 快速提问,为什么我的指数有上限?
- loopback - 如何将服务注入 Loopback JS 中的其他服务?
- c# - Entity Framework 3.1 一对多插入数据
- java - Sparkcontext 在侦听器内停止
- python - 使用单个刮板获取多个产品的数据