我有一个使用样式化组件创建的导航栏组件。我想创建一些可以改变背景颜色和/或文本颜色的道具。
例如:<Navbar dark>
应该具有以下CSS:
background: #454545;
color: #fafafa;
<Navbar light>
应该相反:
background: #fafafa;
color: #454545;
但是,如果未使用任何道具,那么我想使用默认的背景和文本颜色-例如(出于演示目的),像这样:
background: #eee;
color: #333;
现在,我的问题是如何在样式化组件中进行设置。
我可以执行以下操作:
background: ${props => props.dark ? #454545 : '#eee'}
background: ${props => props.dark ? #fafafa : '#eee'}
background: #eee;
还有类似的颜色。
但这是多余的,不是很优雅。我想要某种if / else语句:
background: ${ props => {
if (props.dark) { #454545 }
elseif (props.light) { #fafafa }
else { #eee }
}
但是我不知道如何在样式化组件中设置类似的内容。
有什么建议吗?
谢谢。
答案 0 :(得分:1)
使传入的prop
的名称保持相同。然后,您可以使用switch/case
语句。例如,传递color
道具并将其用作type
与case
匹配。
工作示例:
例如:
<Button color="primary">Example</Button>
组件/按钮
import styled from "styled-components";
const handleColorType = color => {
switch (color) {
case "primary":
return "#03a9f3";
case "danger":
return "#f56342";
default:
return "#fff";
}
};
const Button = styled.button`
display: block;
cursor: pointer;
border: 0;
margin: 5px 0;
background: #000;
font-size: 20px;
color: ${({ color }) => handleColorType(color)};
&:focus {
outline: 0;
}
`;
export default Button;
如果您有多个属性(例如color
和background
对),则使用与上述相同的概念,更改handleColorType
以返回一个string
属性并调用handleColorType
函数而没有样式属性。
例如:
<MultiButton color="primary">Example</Button>
组件/ MultiButton
import styled from "styled-components";
const handleColorType = color => {
switch (color) {
case "primary":
return "color: #03a9f3; background: #000;";
case "danger":
return "color: #fff; background: #f56342;";
default:
return "color: #000; background: #eee;";
}
};
const MultiButton = styled.button`
display: block;
margin: 5px 0;
cursor: pointer;
border: 0;
font-size: 20px;
${({ color }) => handleColorType(color)};
&:focus {
outline: 0;
}
`;
export default MultiButton;
答案 1 :(得分:1)
(我想)更优雅(现代)的东西将是破坏道具并使用switch语句的组合,例如:
const Button = styled.button`
${({primary, secondary}) => {
switch(true) {
case primary:
return `background-color : green`
case secondary:
return `background-color : red`
}
}
}
`
答案 2 :(得分:1)
样式化的组件还接受一个函数,您可以在其中读取道具。此外,如果您选择通过主题道具,则还可以为主题定义对象。
const themes = {
dark: css `
background: ${colors.dark};
color: ${colors.light};
`,
light: css`
background: ${colors.light};
color: ${colors.dark};
`
}
export const Navbar = styled.nav(({theme})=>`
width: 100%;
background: ${colors.light};
color: ${colors.dark};
... // rest of the css
${theme?themes[theme]:''}
`)
<Navbar theme="dark" />
答案 3 :(得分:0)
这是我最终使用的解决方案:
export const Navbar = styled.nav`
width: 100%;
... // rest of the regular CSS code
${props => {
if (props.dark) {
return `
background: ${colors.dark};
color: ${colors.light};
`
} else if (props.light) {
return `
background: ${colors.light};
color: ${colors.dark};
`
} else {
return `
background: ${colors.light};
color: ${colors.dark};
`
}
}}
`
答案 4 :(得分:0)
您还可以执行以下操作:
const colorType= {
dark: '#454545',
light: '#0a0a0a',
normal: '#dedede'
};
export const Navbar= styled.nav`
background: ${({color}) => colorType[color] || `${color}`};
`;
您在这里:
<Navbar color="primary" />
<Navbar color="#FFFFFF" />