A grande vantagem que o React native nos traz, é tornar único o código tanto para Android, quanto para IOS. Não só pensando nos dispositivos móveis, graças ao React, o código pode ser utilizado no desenvolvimento web. Mas quando chegamos na parte de estilização, podemos ter que nos acostumar e perceber que nessa parte a diferença do que estamos acostumados a ver no desenvolvimento web, é maior que o esperado.
Cascading Style Sheets (CSS)
A princípio mexer com estilo no React native, parece ser bem simples. Podemos ver as regras de CSS e que diferente da web, onde as as mesmas são escritas em kebab-case, utilizaremos a sintaxe com CamelCase.
O React Native utiliza o mecanismo de layout de Yoga, que implementa as especificações do flexbox e empresta nomes de regras CSS. Ex:
1 | .text { |
Que ficaria assim no React native:
1 | const styles = StyleSheet.create({ |
Isso faz com que a escrita do estilo seja muito familiar. Mas depois fica claro que o estilo no React Native é muito diferente do estilo na web. Nomes de regras e flexbox são as únicas coisas que o CSS e o estilo no React Native tem em comum.
Escopo por componente
No navegador, o CSS tem o escopo a nível da página. Para uma aplicação web de uma única página, isso significa que cada folha de estilo afeta a aplicação inteira. As regras de estilos individuais são aplicadas aos elementos no DOM, sendo definidos dentro dos blocos dos seletores. Existem muitas maneiras diferentes de selecionar os elementos DOM.
Com o React Native, os estilos não tem efeito em seu aplicação, a menos que você os passe especificamente aos seus componentes. Não existe um conceito de seletor
porque os componentes e os estilos estão bem acoplados. Isso significa que você pode usar o mesmo nome para estilos em várias folhas de estilo sem causar efeitos colaterais:
1 | const headerStyles = StyleSheet.create({ |
Herança
Os estilos não são herdados por padrão. Na web, os elementos DOM herdam alguns dos estilos dos pais por padrão. Estes são principalmente estilos relacionados a texto, e isso significa que você pode fazer:
1 | <style> |
Que é equivalente a:
1 | const styles = StyleSheet.create({ |
Os componentes podem para passar propriedades de estilo para os componentes filho. É o caso do <Text />
do React Native. Um componente <Text />
que é filho de outro componente <Text />,
herdará seus estilos:
1 | <Text style={styles.text}> |
O compartilhamento de estilos de texto com <Text />
tem uso limitado, pois <Text />
não permite que a maioria dos outros componentes React Native sejam seus filhos.
Lógica no estilo
O CSS é muito limitado na sua capacidade de calcular valores. Existem algumas funções que você pode usar, como calc()
e as variáveis CSS são suportadas em navegadores modernos. Além disso, a lógica para calcular estilos dinamicamente precisa ocorrer em outros lugares, sendo compilado com pré-processadores (como SASS).
No React Native, os estilos são definidos em JavaScript. Tendo uma linguagem de programação nos dá uma série de possibilidades.
Assim, temos novos padrões de estilo. Esse é um repositório que vale a pena ver.
Style e StyleSheet
Os estilos só podem ser transmitidos diretamente para um componente, da mesma forma que você passaria estilos para elementos DOM através do atributo style
:
1 | <p style="color: blue;">text</p> |
Achou que iria se livrar do estilo inline
? XD
A documentação do React native nos informar mais sobre o style.
O que pode ser novo para você é o StyleSheet, que cria uma folha de estilo a partir de um objeto de estilo, tornando possível se referir a ele por ID ao invés de criar um novo objeto de estilo sempre.
Gerenciando estilos
Pra mim, essa é a parte mais critica. Antes de recorrer a módulos de terceiros, uma escolha minha e um conselho é explorar as possibilidades ao utilizar o React native, principalmente se a ideia é ir para a linha universal (nativo e web).
Mixins
Como utilizamos no pré-processador SASS (meu preferido.. :D), os mixins são uma boa saída para reaproveitamento de código e organização:
1 | export const errorText = { |
1 | import { errorText } from "textMixins"; |
Estilo global
Como em muitas metodologias de CSS, temos uma boa organização definido o estilo primitivo e o reutilizando em suas folhas de estilo. Ex:
1 | export const COLOR_BLUE = "blue"; |
Podendo ser usado assim:
1 | import styles from "styles"; |
Ou assim:
1 | import { COLOR_BLUE, COLOR_RED } from "styles"; |
Teste e busque a melhor solução para o seu projeto. Aqui veremos só algumas possibilidades. Então descubra o seu problema e comece a pensar na solução para a arquitetura.
Muitas vezes, mesmo uma pequena mudança na forma como um componente funciona, significa que os nomes dos estilos não se encaixam. E os problemas podem aparecer e prejudicar o projeto. Então gaste um tempo, testando a necessidade do projeto e a melhor solução de organização e utilização.
Funções auxiliares
Estilos em JavaScript significa que você obtém o poder de uma linguagem de programação em vez de uma linguagem de estilo simples.
1 | // font https://gist.github.com/samueljmurray/eeb9495146ef0aad24f534cecd17487c |
Passando contexto para o estilo
Um componente <Button />
, por exemplo, pode aceitar uma propriedade de cor (string) e estilo quando estiver desabilitado (booleano), que afetam o seu estilo:
1 | export default StyleSheet.create({ |
1 | import styles from "buttonStyles"; |
O problema do exemplo acima, que pode ficar muita lógica misturada (estilo e funcionalidade do componente). Então, vamos deixar a lógica de estilo no seu devido lugar.
1 | export default (props) => StyleSheet.create({ |
1 | import styles from "buttonStyles"; |
Mais um exemplo, sem StyleSheet:
1 | class Button extends React.Component { |
Ficou mais complexo. Simplificando ficaria assim:
1 | class Button extends React.Component { |
Esses foram exemplos que seguirmos uma linha antes de avaliar bem o projeto, pode ficar muito complexo, independente do caminho escolhido. O melhor caminho é ver na prática e testar as possibilidades que conseguir.
Conclusão
Testando as abordagens ao estilo no React native, podemos ver a flexibilidade e também muda a forma como pensamos sobre como os estilos podem ser definidos em aplicações baseadas em componentes JavaScript, não apenas no React Native, mas também na web.
Tem muitas bibliotecas para testar:
- Styled components
- Extended StyleSheets for React Native
- Further - algebraic style composition for functional UIs
Então, vamos testar!