Skip to content

Instantly share code, notes, and snippets.

@chris-brown
Last active July 24, 2018 21:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chris-brown/144b2921ec69a58f54534a161fdf2894 to your computer and use it in GitHub Desktop.
Save chris-brown/144b2921ec69a58f54534a161fdf2894 to your computer and use it in GitHub Desktop.
Overrides React Styled Component HOC - https://www.styled-components.com/docs/advanced#theming
import styled from 'styled-components';
const MyComponent = styled.div`
background: red;
color: white;
`;
MyComponent.displayName = 'MyComponent';
const ThemeMyComponent = styled(MyComponent).attrs({
overrides: props => props.theme[this.constructor.displayName].css
})`
${overrides}
`;
/*
theme passed to theme provider
*/
const theme = {
MyComponent: {
css:`
background: black;
colour: white;
`; // this could be require('MyComponent.css');
}
}
@chris-brown
Copy link
Author

alternatively just create a HOC similar to withTheme https://github.com/styled-components/styled-components/blob/master/src/hoc/withTheme.js eg.

export const withComponentTheme(MyComponent);

@chris-brown
Copy link
Author

Or something more reusable

const ThemedComponent = component => styled(component).attrs({
  overrides: props => props.theme[this.constructor.displayName].css
})`
  ${overrides}
`;

<ThemedComponent component={MyComponent} />

or

const ThemedComponent = ({children})=> styled(component).attrs({
  overrides: props => props.theme[this.constructor.displayName].css
})`
  ${overrides}
`;

<ThemedComponent>
  <MyComponent myprop="Hello" />
</ThemedComponent>

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment