在反应中使用样式组件时如何在子组件中获取父道具
How to get parent props in child component when using styled component in react
让我用一个例子来说明
//NavLink: react router component
const StyledNavLink = styled(NavLink)`
color: red;
background: blue;
`
function styledLink(label, to) {
return <StyledNavLink
to={to}
className={(props) => console.log(props)}
>
{label}
</StyledNavLink>
}
此处未打印任何内容...
如果我使用 NavLink
而不是 StyledNavLink
,我会在控制台中获取所有的道具值。
那么如何获取StyledNavLink
组件中的NavLink
属性呢?
我认为您没有将 props 从父级传递到您的样式化组件中。应该有点像这样-
const StyledNavLink = styled(NavLink)`
color: red;
background: blue;
`;
const Menu = (props) => {
const { label, to } = props;
return <StyledNavLink to={to}>{label}</StyledNavLink>;
};
问题
NavLink
组件的 className
属性与 styled-components
使用的 className
属性冲突。 styled(NavLink)
组件只会有一个字符串化的 className
属性,而 NavLink
组件可以采用字符串或函数 className
值。
解决方案
在不同的 prop 下传递 NavLink
className
prop 并处理样式化组件中的条件逻辑。
示例:
const StyledNavLink = styled(({ className, navLinkClassName, ...props }) => (
<NavLink
{...props}
className={(props) => {
let extraClass =
typeof navLinkClassName === "function"
? navLinkClassName(props)
: navLinkClassName;
return [className, extraClass].filter(Boolean).join(" ");
}}
/>
))`
color: red;
background: blue;
&.activeLink {
color: green;
background: lightgreen;
}
`;
用法:
function styledLink(label, to) {
return (
<StyledNavLink
to={to}
navLinkClassName={(props) => {
console.log("styledLink", props);
return props.isActive ? "activeLink" : null;
}}
>
{label}
</StyledNavLink>
);
}
...
{styledLink("home", "/")}
如果你想让 styledLink
实际上成为一个 React 组件:
function StyledLink({ label, to }) {
return (
<StyledNavLink
to={to}
navLinkClassName={(props) => {
console.log("StyledLink", props);
return props.isActive ? "activeLink" : null;
}}
>
{label}
</StyledNavLink>
);
}
...
<StyledLink to="/" label="home" />
让我用一个例子来说明
//NavLink: react router component
const StyledNavLink = styled(NavLink)`
color: red;
background: blue;
`
function styledLink(label, to) {
return <StyledNavLink
to={to}
className={(props) => console.log(props)}
>
{label}
</StyledNavLink>
}
此处未打印任何内容...
如果我使用 NavLink
而不是 StyledNavLink
,我会在控制台中获取所有的道具值。
那么如何获取StyledNavLink
组件中的NavLink
属性呢?
我认为您没有将 props 从父级传递到您的样式化组件中。应该有点像这样-
const StyledNavLink = styled(NavLink)`
color: red;
background: blue;
`;
const Menu = (props) => {
const { label, to } = props;
return <StyledNavLink to={to}>{label}</StyledNavLink>;
};
问题
NavLink
组件的 className
属性与 styled-components
使用的 className
属性冲突。 styled(NavLink)
组件只会有一个字符串化的 className
属性,而 NavLink
组件可以采用字符串或函数 className
值。
解决方案
在不同的 prop 下传递 NavLink
className
prop 并处理样式化组件中的条件逻辑。
示例:
const StyledNavLink = styled(({ className, navLinkClassName, ...props }) => (
<NavLink
{...props}
className={(props) => {
let extraClass =
typeof navLinkClassName === "function"
? navLinkClassName(props)
: navLinkClassName;
return [className, extraClass].filter(Boolean).join(" ");
}}
/>
))`
color: red;
background: blue;
&.activeLink {
color: green;
background: lightgreen;
}
`;
用法:
function styledLink(label, to) {
return (
<StyledNavLink
to={to}
navLinkClassName={(props) => {
console.log("styledLink", props);
return props.isActive ? "activeLink" : null;
}}
>
{label}
</StyledNavLink>
);
}
...
{styledLink("home", "/")}
如果你想让 styledLink
实际上成为一个 React 组件:
function StyledLink({ label, to }) {
return (
<StyledNavLink
to={to}
navLinkClassName={(props) => {
console.log("StyledLink", props);
return props.isActive ? "activeLink" : null;
}}
>
{label}
</StyledNavLink>
);
}
...
<StyledLink to="/" label="home" />