У меня есть следующее:
class StyledInput extends React.Component{
styles = (color, theme) => ({
underline: {
borderBottom: `2px solid ${color}`,
'&:after': {
borderBottom: `2px solid ${color}`,
}
}
})
div = props => (
<TextField
placeholder="temp input"
InputProps={{
classes:{
root: props.classes.underline
},
style:{
height: '1.5rem',
fontSize:'1rem',
marginTop: '-1rem',
}
}}
>
<div>
{props.children}
</div>
</TextField>
)
Styled = withStyles(this.styles('white'))(this.div)
render(){
return(
<div>
<this.Styled>{this.props.children}</this.Styled>
</div>
);
}
}
export default StyledInput;
Итак, что он делает, он успешно берет текстовое поле пользовательского интерфейса материала и меняет нижнюю полосу на белую, а не на синюю, когда пользователь щелкает поле,Большой!
... однако ...
Что я действительно хотел бы сделать, это что-то вроде
<this.Styled color={someDefinedColor}>{this.props.children}</this.Styled>
, где Styled
будет выглядеть так:
Styled = (color) => withStyles(this.styles(color))(this.div)
, чтобы я мог динамически передавать цвета в атрибут Styled
.Ясно, что это псевдокод - я играл с ним, но не могу заставить его провалиться.Как общее утверждение, material-ui - это немного обидно для динамического изменения цвета, поэтому мне было интересно, знает ли кто-нибудь, как заставить это работать.
Спасибо!
РЕШЕНИЕ ... хотя и не великое.
Я не уверен, как использовать псевдоэлементы с makeStyles
и функциональными компонентами, но это решение, похоже, работает для моих целей.Добавив его сюда для потомков, если кто-то еще может найти это полезным:
class StyledInputInner extends React.Component{
styles = (color, theme) => ({
underline: {
'&:before': {
borderBottom: `2px solid ${color}`,
},
'&:after': {
borderBottom: `2px solid ${color}`,
},
'&:hover:not($disabled):before': {
backgroundColor: `2px solid ${color}`
},
'&$focused:after': {
borderBottom: `2px solid ${color}`
},
}
})
textField = props => (
<TextField
placeholder="temp input"
InputProps={{
classes:{
root: props.classes.underline
},
style:{
height: '1.5rem',
fontSize:'1rem',
marginTop: '-1rem',
}
}}
onClick={()=>this.props.onClick()}
onChange={(evt)=>{this.props.onChange(evt)}}
>
<div>
{props.children}
</div>
</TextField>
)
StyledTextField = withStyles(this.styles(this.props.color))(this.textField)
render(){
return(
<div>
<this.StyledTextField>{this.props.children}</this.StyledTextField>
</div>
);
}
}
class StyledInput extends Component {
render(){
return(
<MainContext.Consumer>
{stateData => {
return(
<StyledInputInner
color={stateData.state.InputColor}
onChange={(evt)=>this.props.onChange(evt)}
onClick={this.props.onClick}
>
{this.props.children}
</StyledInputInner>
)
}}
</MainContext.Consumer>
)
}
}
export default StyledInput;