样式化的组件条件无法正常工作
Styled Component Conditionnals not working properly
我希望根据传递给组件的 selected
道具来设计组件样式。
然而,根据 Whosebug 和 Medium 上的其他答案,条件样式不会覆盖基本样式。
我尝试了两种解决方案,并将其包含在下面的代码中。
Parent.js
<RoleSelectionCard icon='ux' text='User Experience' selected={true} />
Component.js
import React from "react"
import styled, { css } from "styled-components"
[...]
const Container = styled.div`
height: 180px;
width: 180px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 8px;
------- First Variant
box-shadow: 0 0 10px rgba(74, 134, 232, 0.4); // this one is rendered
${props =>
props.selected &&
css`
box-shadow: 0 0 10px rgba(200, 134, 232, 1);
`};
------- Second Variant
box-shadow: ${props => {
if (props.selected === true) {
return " 0 0 10px rgba(74, 134, 232, 1)"
}
return " 0 0 10px rgba(74, 134, 232, 0.4)" // this one is rendered
}};
&:hover {
box-shadow: 0 0 10px rgba(74, 134, 232, 0.8);
transition: 0.3s;
}
`
const Icon = styled.img`
[...]
`
const Text = styled.span`
[...]
`
class RoleSelectionCard extends React.Component {
render() {
console.log(this.props.selected) // outputs true
const { text, icon } = this.props
const iconToRender = [...]
return (
<div style={{ padding: 50 }}>
<Container>
<Icon src={iconToRender} />
<Text>{text}</Text>
</Container>
</div>
)
}
}
export default RoleSelectionCard
有没有我没有看到的愚蠢错误?
提前致谢!
我看到您正试图在 <Container>
组件样式中使用 属性。要做到这一点,您应该将 selected
属性 传递给前面提到的 <Container>
组件。
检查下面编辑的代码片段:
import React from "react"
import styled, { css } from "styled-components"
[...]
const Container = styled.div`
height: 180px;
width: 180px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 8px;
------- First Variant
box-shadow: 0 0 10px rgba(74, 134, 232, 0.4); // this one is rendered
${props =>
props.selected &&
css`
box-shadow: 0 0 10px rgba(200, 134, 232, 1);
`};
&:hover {
box-shadow: 0 0 10px rgba(74, 134, 232, 0.8);
transition: 0.3s;
}
`
const Icon = styled.img`
[...]
`
const Text = styled.span`
[...]
`
class RoleSelectionCard extends React.Component {
render() {
console.log(this.props.selected) // outputs true
const { text, icon, selected } = this.props
const iconToRender = [...]
return (
<div style={{ padding: 50 }}>
<Container selected={selected}>
<Icon src={iconToRender} />
<Text>{text}</Text>
</Container>
</div>
)
}
}
export default RoleSelectionCard
我希望根据传递给组件的 selected
道具来设计组件样式。
然而,根据 Whosebug 和 Medium 上的其他答案,条件样式不会覆盖基本样式。
我尝试了两种解决方案,并将其包含在下面的代码中。
Parent.js
<RoleSelectionCard icon='ux' text='User Experience' selected={true} />
Component.js
import React from "react"
import styled, { css } from "styled-components"
[...]
const Container = styled.div`
height: 180px;
width: 180px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 8px;
------- First Variant
box-shadow: 0 0 10px rgba(74, 134, 232, 0.4); // this one is rendered
${props =>
props.selected &&
css`
box-shadow: 0 0 10px rgba(200, 134, 232, 1);
`};
------- Second Variant
box-shadow: ${props => {
if (props.selected === true) {
return " 0 0 10px rgba(74, 134, 232, 1)"
}
return " 0 0 10px rgba(74, 134, 232, 0.4)" // this one is rendered
}};
&:hover {
box-shadow: 0 0 10px rgba(74, 134, 232, 0.8);
transition: 0.3s;
}
`
const Icon = styled.img`
[...]
`
const Text = styled.span`
[...]
`
class RoleSelectionCard extends React.Component {
render() {
console.log(this.props.selected) // outputs true
const { text, icon } = this.props
const iconToRender = [...]
return (
<div style={{ padding: 50 }}>
<Container>
<Icon src={iconToRender} />
<Text>{text}</Text>
</Container>
</div>
)
}
}
export default RoleSelectionCard
有没有我没有看到的愚蠢错误?
提前致谢!
我看到您正试图在 <Container>
组件样式中使用 属性。要做到这一点,您应该将 selected
属性 传递给前面提到的 <Container>
组件。
检查下面编辑的代码片段:
import React from "react"
import styled, { css } from "styled-components"
[...]
const Container = styled.div`
height: 180px;
width: 180px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
border-radius: 8px;
------- First Variant
box-shadow: 0 0 10px rgba(74, 134, 232, 0.4); // this one is rendered
${props =>
props.selected &&
css`
box-shadow: 0 0 10px rgba(200, 134, 232, 1);
`};
&:hover {
box-shadow: 0 0 10px rgba(74, 134, 232, 0.8);
transition: 0.3s;
}
`
const Icon = styled.img`
[...]
`
const Text = styled.span`
[...]
`
class RoleSelectionCard extends React.Component {
render() {
console.log(this.props.selected) // outputs true
const { text, icon, selected } = this.props
const iconToRender = [...]
return (
<div style={{ padding: 50 }}>
<Container selected={selected}>
<Icon src={iconToRender} />
<Text>{text}</Text>
</Container>
</div>
)
}
}
export default RoleSelectionCard