Criando Styled Components com React

Javascript

Muito se fala sobre componentes (components) ou componetizar sua aplicação, nesse post irei explicar uma forma de estilizar nossos componentes, assim, garantimos que independente do pedaço da nossa aplicação onde o componente for utilizado, seu estilo sempre será o mesmo.

Existem diversas maneiras para trabalharmos com estilização de componentes, sendo algumas delas: Styled Components, CSS Modules, CSS normal ou SASS, etc... Como já mencionado, o assunto do post será a abordagem referente ao Styled Components.

Conhecendo o Styled Components

Afinal, o que é Styled Components? Trata-se de uma biblioteca (lib) que nos permite escrever códigos CSS dentro do JavaScript, mas, você deve estar se perguntando, oque eu ganho com isso? Dessa maneira não precisamos mais ficar importando nossos arquivos .css em nossas páginas e se um dia precisarmos utilizar esse mesmo componente em outro projeto, uma das maneiras seria basicamente copiar o arquivo .js.

Com o Styled Components também ganhamos de brinde compatibilidade de browsers, ou seja, não precisamos mais informar nosso .browserlistrc para que o Babel faça a verificações em nosso CSS para que o mesmo seja compatível em navegadores mais antigos, o Styled faz isso automaticamente para nós.

Também ganhamos a regra de CSS Modules, o Styled cria um hash nas classes CSS, assim, cada componente conhece apenas o seu CSS, uma mudança em um componente será refletida somente nele.

Além de inúmeras outras vantagens.

Instalando o Styled Components

Como foi dito no tópico anterior, o Styled Components trata-se de uma biblioteca, sendo assim, para utilizá-la em nosso projeto React devemos instalá-la, podemos realizar essa instalação de duas maneiras: com Yarn ou Npm.

Instalando com o Yarn

Para realizar a instalação da biblioteca utlizando o Yarn como gerenciador de pacotes, podemos utilizar seu comando add:

yarn add styled-components

Dessa maneira a dependência será salva e declarada dentro de nosso package.json.

Instalando com o Npm

Alternativamente, podemos utilizar o Npm como gerenciador de pacotes, utilizando o comando install:

npm install styled-components --save

Ou, de forma abreviada:

npm i styled-components --save

Repare que passamos um argumento --save, isso indica para o npm assim como o yarn faz, salvar e declarar a nova dependência no package.json da aplicação.

Criando o primeiro component

Para criar o primeiro componente, vamos primeiramente criar nosso projeto, podemos fazer isso utilizando o create-react-app:

create-react-app react-styled-components

Assim que o processo terminar, iremos ter uma nova pasta chamada react-styled-components, nesse projeto iremos criar nossos exemplos de Styleds Components, em caso de dúvida você pode conferir o post Criando minha primeira app com React, nele eu explico como criar uma nova app ou projeto do zero com React.

Dentro do projeto que acabamos de criar, precisaremos de uma nova pasta chamada components, nela irá ficar todos os exemplos que iremos fazer, o primeiro será criar um simples botão, sendo assim, um novo arquivo chamado MeuBotao.js deve ser criado dentro da pasta components/MeuBotao.js.

O primeiro passo para começarmos a criar um novo componente é importar a biblioteca:

import styled from "styled-components";

Tá, legal, já temos o arquivo criado e a biblioteca importada, mas como criamos um novo componente?

Homer pensando na cadeira

Para criar o primeiro componente, podemos utilizar o styled que acabamos de criar seguido pelo nome da tag HTML que desejamos criar, por exemplo:

styled.[NOME_DA_TAG]

Ou seja, para o exemplo do nosso botão, devemos utilizar a tag button:

styled.button;

Mas, ainda está estranho, só isso é o suficiente?

Bob esponja no restaurente pensando

Se você pensou que está faltando algo, acertou. Basicamente sempre iremos chamar funções do styled que são responsáveis por nos devolver suas respectivas tags como componentes do React, ou seja, precisamos invocar a função .button(), além dela, existem também: .a(), .div(), .section(), etc...

Agora que já sabemos da necessidade de sua invocação, vamos invocá-la:

styled.button();

Se você tentar rodar sua aplicação com esse código irá se deparar com um erro (exception) de execução:

Erro ao invocar função normal do styled

Mas afinal, porque deu esse erro referente á Cannot read property '0' of undefined? Isso está acontecendo devido a forma que estamos invocando a função do styled, como assim Matheus? O styled utiliza uma nova forma introduzida no ES6 para executar funções, chamada de Tagged Template Literal, afinal, do que se trata esse tal de Tagged Template Literal?

Essa nova forma permite invocarmos funções utilizando duas crases (``), sim, é isso mesmo, podemos trocar os parênteses por elas, ficando da seguinte forma:

styled.button``;

Agora tenho certeza que seu código deve ter funcionado, como o assunto do post (talvez para um próximo) não se refere ao ES6, você pode ler um pouco sobre tal recurso aqui ou se preferir uma leitura mais á fundo leia aqui.

Tá, legal, nosso código está executando, o que mais precisamos fazer para criar nosso primeiro componente? Se estamos trabalhando com estilos, está faltando nosso CSS, pois é, onde iremos escrevê-lo? Dentro das crases.

styled.button`
    background: #0099FF;
    border: 2px solid #0099FF;
    border-radius: 3px;
    color: #FDFDFD;
    font-size: 1.2rem;
    margin: 1rem;
    padding: 1rem 1.5rem;
`;

E para termos acesso ao componente que foi criado pelo styled podemos guardá-lo em uma variável:

const MeuBotao = styled.button`
    background: #0099FF;
    border: 2px solid #0099FF;
    border-radius: 3px;
    color: #FDFDFD;
    font-size: 1.2rem;
    margin: 1rem;
    padding: 1rem 1.5rem;
`;

Sim, isso já é um componente do React, podemos simplesmente exportá-lo para ser importado dentro de nosso App.js:

export default MeuBotao;

O código completo de nosso primeiro componente fica da seguinte maneira:

import styled from "styled-components";

const MeuBotao = styled.button`
    background: #0099FF;
    border: 2px solid #0099FF;
    border-radius: 3px;
    color: #FDFDFD;
    font-size: 1.2rem;
    margin: 1rem;
    padding: 1rem 1.5rem;
`;

export default MeuBotao;

Vamos utilizá-lo?

Utilizando componentes do styled

Dentro de App.js, apague todo o conteúdo desnecessário para o exemplo, ficando da seguinte maneira:

import React, { Component } from 'react';

class App extends Component {
  render() {
    return (
      <div className="App">
      </div>
    );
  }
}

export default App;

Agora, vamos importar nosso botão:

import MeuBotao from "./components/Button";

Pronto, já podemos ser capazes de utilizá-lo em nosso render:

<div className="App">
    <MeuBotao>Meu Botão</MeuBotao>
</div>

Assim, temos o seguinte botão:

Meu primeiro componente com Styled Components

E o que mais podemos fazer com Styled Components?

Utilizando um componente existente

Imagine que você já tenha seu componente pronto e pretende apenas utilizar o styled para a estilização, nesse caso, invoque a função do styled de forma normal com os parenteses, porém, passando o componente como parâmetro:

import React, { Component } from "react";

class BotaoPronto extends Component {

    render() {
        return(
            <button onClick={ this.ola }>{ this.props.children }</button>
        );
    }

    ola() {
        alert("Ola");
    }

}

Um simples botão que ao ser cliclado exibe uma mensagem de olá, agora, vamos estilizá-lo com o styled:

import React, { Component } from "react";
import styled from "styled-components";

class BotaoPronto extends Component {

    render() {
        return(
            <button onClick={ this.ola }>{ this.props.children }</button>
        );
    }

    ola() {
        alert("Ola");
    }

}

const StyledBotaoPronto = styled(BotaoPronto)`
    background: #FF8080;
    border: 2px solid #FF8080;
    color: #FDFDFD;
    padding: 1rem 1.5rem;
`;

export default StyledBotaoPronto;

Beleza, agora nosso botão foi estilizado, portanto, já podemos importá-lo e utilizá-lo em nosso App.js:

// código anterior omitido
import BotaoPronto from "./components/BotaoPronto";

// código anterior omitido
<BotaoPronto>Botão Pronto</BotaoPronto>

Se votarmos na página e recarregá-la, teremos o seguinte layout:

Botão pronto sem estilo

Mas afinal, porque o botão ficou sem estilos? Isso aconteceu porque faltou passar a classe que o styled cria para ele, para isso, podemos utilizar as propriedades (props) do componente, pois é lá que ela se encontra (o styled adiciona ela como propriedade do componente):

class BotaoPronto extends Component {

    render() {
        return(
            <button className={ this.props.className } onClick={ this.ola }>{ this.props.children }</button>
        );
    }

    ola() {
        alert("Ola");
    }

}

Veja que adicionamos a propriedade className ao nosso botão, passando o className de sua props. Assim, voltando na página, vemos o botão estilizado:

Botão pronto com estilo

Extendendo componente

Um outro recurso muito interessante do Styled Components é a possiblidade de extender componentes, ou seja, podemos criar apenas um esqueleto e depois modificá-lo dando cores ao mesmo:

import React, { Component } from "react";
import styled from "styled-components";

class Botao extends Component {

    render() {
        return(
            <button className={ this.props.className }>{ this.props.children }</button>
        );
    }

}

const EsqueletoBotao = styled(Botao)`
    border: 1px solid transparent;
    border-radius: 2px;
    color: #FDFDFD;
    font-size: 1.125rem;
    margin: 1rem;
    padding: .75rem 2rem;
`;

const Aviso = EsqueletoBotao.extend`
background: #FF9900;
border-color: #FF9900;
`;

const Informacao = EsqueletoBotao.extend`
background: #33CCFF;
border-color: #33CCFF;
`;

const Successo = EsqueletoBotao.extend`
    background: #00CC99;
    border-color: #00CC99;
`;

export { Aviso, Informacao, Successo };

Assim, importando e utilizando em nosso App.js teremos um botão com vários tipos:

Botão estendido

Para o post não se extender muito, irei parar por aqui, nos próximos veremos mais coisas sobre o Styled Components, o projeto de exemplo pode ser encontrado e baixado aqui.

Espero que tenha gostado, não deixe de comentar e assinar a newsletter para receber novidades por email, até a próxima.

Matheus Castiglioni

Matheus Castiglioni

Apaixonado pelo mundo dos códigos e um eterno estudante, gosto de aprender e saber um pouco de tudo, aquela curiosidade de saber como tudo funciona, tento compartilhar o máximo de conhecimentos adquiridos e ajudar todos aqueles que sou capaz.