基本上,您需要传递this.props.className
或props.className
或解构className
生成styled-components
并手动将其应用于您要设置样式的组件。否则,您不会将className
应用于任何东西,因此不会看到任何样式更改。
工作示例:
![编辑样式化组件](https://codesandbox.io/static/img/play-codesandbox.svg)
components/LinkComponent.js(这functional component
接受className
生成的styled()
并props
传递给下面创建的样式组件——您需要手动将它们应用到Link
组件)
import React from "react";
import PropTypes from "prop-types";
import { Link } from "react-router-dom";
const LinkComponent = ({ className, children, link }) => (
<Link className={className} to={link}>
{children}
</Link>
);
LinkComponent.propTypes = {
className: PropTypes.string.isRequired,
link: PropTypes.string.isRequired,
children: PropTypes.string.isRequired
};
export default LinkComponent;
components/StyledLink.js(导入functional component
以上内容并将其传递给styled()
——你也可以创建一个样式化的主题来更新styled()
元素)
import styled from "styled-components";
import LinkComponent from "./LinkComponent";
const StyledLink = styled(LinkComponent)`
color: ${props => (!props.primary && !props.danger ? "#03a9f3" : "#ffffff")};
background-color: ${props => {
if (props.primary) return "#03a9f3";
if (props.danger) return "#f56342";
return "transparent";
}};
font-weight: bold;
margin-right: 20px;
padding: 8px 16px;
transition: all 0.2s ease-in-out;
border-radius: 4px;
border: 2px solid
${props => {
if (props.primary) return "#03a9f3";
if (props.danger) return "#f56342";
return "#03a9f3";
}};
&:hover {
color: ${props => (!props.primary && !props.danger ? "#0f7ae5" : "#ffffff")};
background-color: ${props => {
if (props.primary) return "#0f7ae5";
if (props.danger) return "#be391c";
return "transparent";
}};
text-decoration: none;
border: 2px solid ${props => (props.danger ? "#be391c" : "#0f7ae5")}};
}
`;
export default StyledLink;
components/Header.js(导入StyledLink
上面创建的样式化组件并使用它——传递给该组件的任何其他道具将自动传递给function
,但是,在这种情况下,您需要解构prop
来使用它)
import React from "react";
import StyledLink from "./StyledLink";
export default () => (
<nav className="container">
<StyledLink primary link="/">Home</StyledLink>
<StyledLink danger link="/about">About</StyledLink>
<StyledLink link="/portfolio">Portfolio</StyledLink>
</nav>
);