styled-components

2022-11-28 hit count image

this blog is about how to use styled-component library for react-native styling.

create react-native project

this blog introduce how to use styled-component with RN project which is applied TypeScript. if you want to know how to apply TypeScript to RN, see previous blog.

install styled-components library

install styled-components library and other necessary libraries for integrating TypeScript.

npm install --save styled-components
npm install --save-dev babel-plugin-styled-components @types/styled-components-react-native
  • styled-components: this is styled-components library.
  • @types/styled-components-react-native: this is stypled-components types for TypeScript.
  • babel-plugin-styled-components: this is not required but make class name easily understand. copy and paste below code to babel.config.js.
module.exports = {
  ...
  plugins: ['babel-plugin-styled-components'],
};

To make TypeScript recognizes styled-components types, open the tsconfig.json file and modify it like the following.

{
  ...
  "compilerOptions": {
    ...
    "types": ["@types/styled-components-react-native"]
  },
}

ERESOLVE unable to resolve dependency tree

When you install styled-components, sometimes you get the error message like the following.

npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree

At this time, create the .npmrc file in the React Native project folder and modify it like the following.

legacy-peer-deps=true

And then, try again to install styled-components. You can see styled-components installed well.

how to use

styled-components has theme function for maintaining site level styles. let’s see theme feature and basic usages.

basic usages in Class Component

  • basic styling
// src/App.tsx
...
import styled from 'styled-components/native';
...
const Container = styled.View`
  flex: 1;
  justify-content: center;
  align-items: center;
  background-color: #f5fcff;
`;
const MainText = styled.Text`
  font-size: 20px;
  text-align: center;
  margin: 10px;
  color: red;
`;
...
interface Props {}
interface State {}
export default class App extends React.Component<Props, State> {
  render() {
    return (
      <Container>
        <MainText>Hello world</MainText>
      </Container>
    );
  }
}
  • dynamic styling using props
// src/App.tsx
...
import styled from 'styled-components/native';
...

interface IContainerProps {
  background: string;
}

const Container = styled.View`
  flex: 1;
  justify-content: center;
  align-items: center;
  background-color: ${(props:IContainerProps) => props.background ? props.background : 'white'};
`;
const MainText = styled.Text`
  font-size: 20px;
  text-align: center;
  margin: 10px;
  color: red;
`;
...
interface Props {}
interface State {}
export default class App extends React.Component<Props, State> {
  render() {
    return (
      <Container background="red">
        <MainText>Hello world</MainText>
      </Container>
    );
  }
}

Theme usage in Class Component

there are details about how to use TypeScript for theme in official site.

if you see official site and reference site, you can catch we should use relative path for using styled-components.

so, we don’t use official site way. we use “dynamic styling using props” way.

  • src/@types/index.d.ts file
// src/@types/index.d.ts
interface ITheme {
  color: {
    white: string;
    black: string;
  };
  fonts: {
    normal: string;
  };
}
  • src/Theme.tsx file
// src/Theme.tsx
export default {
  color: {
    white: '#FFFFFF',
    black: '#000000',
  },
  fonts: {
    normal: '14px',
  },
};
  • src/App.tsx file
...
// src/App.tsx
import { ThemeProvider } from 'styled-components';
import styled from 'styled-components/native';
import Theme from './Theme';
...

interface IContainerPorps {
  theme?: ITheme;
}

const Container = styled.View`
  flex: 1;
  justify-content: center;
  align-items: center;
  background-color: ${(props:IContainerProps) => props.theme && props.theme.color.black};
`;
const MainText = styled.Text`
  font-size: 20px;
  text-align: center;
  margin: 10px;
  color: red;
`;
...
interface Props {}
interface State {}
export default class App extends React.Component<Props, State> {
  render() {
    return (
      <ThemeProvider theme={Theme}>
        <Container>
          <MainText>Hello world</MainText>
        </Container>
      </ThemeProvider>
    );
  }
}

Basic usage in Function Components

import React from 'react';
import styled from 'styled-components/native';

const Container = styled.View`
  flex: 1;
  justify-content: center;
  align-items: center;
  background-color: #f5fcff;
`;
const MainText = styled.Text`
  font-size: 20px;
  text-align: center;
  margin: 10px;
  color: red;
`;

interface Props {}
const App = ({}: Props) => {
  return (
    <Container>
      <MainText>Hello world</MainText>
    </Container>
  );
};

export default App;

Theme Usage in Function Components

import React from 'react';
import styled from 'styled-components/native';
import {ThemeProvider} from 'styled-components';
import Theme from './Theme';

interface StyledProps {
  theme: ITheme;
}
const Container = styled.View`
  flex: 1;
  justify-content: center;
  align-items: center;
  background-color: ${(props: StyledProps) =>
    props.theme && props.theme.color.black};
`;
const MainText = styled.Text`
  font-size: 20px;
  text-align: center;
  margin: 10px;
  color: red;
`;

interface Props {}
const App = ({}: Props) => {
  return (
    <ThemeProvider theme={Theme}>
      <Container>
        <MainText>Hello world</MainText>
      </Container>
    </ThemeProvider>
  );
};

export default App;

reference

Was my blog helpful? Please leave a comment at the bottom. it will be a great help to me!

App promotion

You can use the applications that are created by this blog writer Deku.
Deku created the applications with Flutter.

If you have interested, please try to download them for free.

Posts