I want to use a theme in parts of my own components that are class based. I cannot get anything to work, all examples in the documentation is for functional components. Basically the theme is defined and I want to use it to style my own components so I can avoid repeating myself and change the code at the higher level and it change everywhere.
My App.js
import { ThemeProvider } from '@material-ui/styles';
import { createMuiTheme } from '@material-ui/core/styles';
const theme = createMuiTheme({
palette: {
primary: {
light: '#757ce8',
main: '#3f50b5',
dark: '#002884',
contrastText: '#fff',
},
},
overrides: {
MuiOutlinedInput: {
disabled: true,
input: {
color: 'red'
}
}
}
});
export default class App extends React.Component {
render() {
return (
<ThemeProvider theme={theme}>
<Nav />
</ThemeProvider>
);
}
}
My Problem file, Nav.js
import React from 'react';
import SearchBar from './SearchBar';
import { makeStyles } from '@material-ui/styles';
const styles = makeStyles(theme => ({
root: {
background: theme.background,
},
}));
class Nav extends React.Component {
render() {
const classes = styles();
return(
<div className={classes.root}>
<SearchBar />
</div>
)
}
}
export default Nav;
One way to dynamically change css properties with styled components is to insert a custom prop into your React component and access said property using the dollar sign and curly braces commonly used for template literals. Our current example is testing to see if our use pointer prop is true.
Styled Components allow you to style any custom component that you've created. First, the custom component must receive the prop className and pass it to the underlying DOM element. Once that is done, pass the custom component to the styled function and invoke it as a Tagged Template to receive a new Styled Component.
You cannot use makeStyles
with class components. makeStyles
returns a custom hook which can only be used in function components. For class components, you can leverage all of the same functionality using withStyles. withStyles
wraps your component and injects a classes
prop.
Below is a working example based on the code in your question:
import React from "react";
import { withStyles } from "@material-ui/core/styles";
class SearchBar extends React.Component {
render() {
return <div>My Search Bar</div>;
}
}
const styles = theme => ({
root: {
backgroundColor: theme.palette.primary.main,
color: theme.palette.primary.contrastText
}
});
class Nav extends React.Component {
render() {
return (
<div className={this.props.classes.root}>
<SearchBar />
</div>
);
}
}
export default withStyles(styles)(Nav);
Related answers:
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With