Styles globaux React Native

98

Je suis nouveau avec React et je comprends les avantages des styles en ligne basés sur des composants. Mais je me demande s'il existe un moyen décent d'avoir une sorte de style global. Par exemple, j'aimerais utiliser la même coloration de texte et de bouton dans mon application.

Plutôt que de répéter dans chaque composant (et de devoir ensuite le changer à x endroits si nécessaire), ma pensée initiale est de créer une classe StyleSheet «de base» dans son propre fichier et de l'importer dans mes composants.

Existe-t-il une meilleure ou plus «réaction»?

Patm
la source

Réponses:

120

Vous pouvez créer une feuille de style réutilisable. Exemple:

style.js

'use strict';

var React = require('react-native');

var {
  StyleSheet,
} = React;

module.exports = StyleSheet.create({

alwaysred: {
    backgroundColor: 'red',
    height: 100,
    width: 100,
},

});

Dans votre composant:

var s = require('./style');

...puis:

<View style={s.alwaysred} ></View>
jeux ennuyés
la source
Oui, c'est ce que j'ai décrit. Merci pour la confirmation que j'ai eu la bonne idée. Marquera comme réponse correcte pour le moment.
Patm
17
Maintenant, vous pouvez simplement utiliserimport { StyleSheet } from 'react-native';
LYu
J'ai ajouté une réponse expliquant une manière différente d'obtenir le style global, vous voudrez peut-être jeter un coup d'œil à stackoverflow.com/questions/30853178/react-native-global-styles/… . Il est beaucoup plus flexible et dans l'esprit React car il évite la définition statique.
Mr Br
Je ne suis pas d'accord, ce n'est pas DRY et pas non plus une conception (ou une architecture) basée sur des composants comme celle recommandée dans l'écosystème React. chaque composant avec un style par défaut devra style={defaultStyle}être ajouté. Au lieu de cela, vous pouvez créer un DefaultViewet l'utiliser au lieu du fourni viewqui est stylé selon vos spécifications. J'ai écrit une réponse détaillant cette méthode il y a quelque temps: stackoverflow.com/a/52429040/5243543
ThaJay
86

Créez un fichier pour vos styles (IE, Style.js ).

Voici un exemple:

import { StyleSheet } from 'react-native';

export default StyleSheet.create({
  container: {
    flex: 1
  },
  welcome: {
    fontSize: 20
  }
});

Dans l'un des fichiers que vous souhaitez utiliser votre style, ajoutez ce qui suit:

import styles from './Style'
Barlow Tucker
la source
7
Je soupçonne que cette réponse est plus pertinente maintenant!
villancikos
1
«./Styles» doit être «./Style» pour correspondre au nom de fichier Style.js
oOEric
Dupliquer la réponse stackoverflow.com/a/30858201/5243543
ThaJay
10

Si vous souhaitez simplement définir des variables globales, vous pouvez essayer.

AppStyles.js

export default AppStyles = {
    colour: {
        background: '#f4f9fd',
        font: '#434e5a',
        primary: '#ff3b30'
    }
}

index.ios.js

import AppStyles from './AppStyles';

const styles = StyleSheet.create({
    container: {
        backgroundColor: AppStyles.colour.background
    }
});
Rob
la source
Vous n'avez pas besoin de l'importation dans AppStyles.js, mais c'est parfait lorsque vous voulez juste quelques variables de style globales simples!
willedanielsson le
Dupliquer la réponse stackoverflow.com/a/30858201/5243543
ThaJay
9

Vous pouvez également essayer la feuille de style react-native-extended-style qui prend en charge les variables de style globales:

// app.js
EStyleSheet.build({
   buttonColor: 'green'
});

// component.js
var styles = EStyleSheet.create({
  button: {
    backgroundColor: '$buttonColor',
    ...
  }
});
vitalets
la source
1
Travaillez comme un charme;)
EQuimper
8

Vous devez créer un fichier pour y stocker tous les styles comme ' styles.js ' et écrire le code de type css selon vos besoins

'use strict';
import {StyleSheet} from 'react-native';

export default StyleSheet.create({

    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center',
        backgroundColor: '#F5FCFF',
    },

    title: {
        fontSize: 10,
        color: '#000',
        backgroundColor: '#fff'
    },

    button: {
        fontSize: 12,
        color: '#000',
        backgroundColor: '#fff'
    }

});

et maintenant vous pouvez utiliser le style global comme vous pouvez le voir

import React, { Component } from 'react';
import { View, Button } from 'react-native';
import StyleSheet from './config/styles';

export default class App extends Component {

  render() {
    return (
      <View
        style={StyleSheet.container}>
        <Button
          style={StyleSheet.button}
          title="Go to Lucy's profile"
        />
      </View>
    );
  }
}
Amintabar
la source
Dupliquer la réponse stackoverflow.com/a/30858201/5243543
ThaJay
2

Essayez ma bibliothèque react-native-style-tachyons , qui vous donne non seulement des styles globaux, mais un système de mise en page réactif et axé sur la conception avec des largeurs et des hauteurs par rapport à la taille de votre police racine.

Fabian Zeindl
la source
C'est intéressant! À première vue, cela avait l'air bizarre, mais quand j'y pense, et que je considère le moins de code que j'aurais à écrire, cela semble plutôt bien.
Niclas
Je suis content que ça marche pour toi. Vous apprendrez à apprécier en particulier l'échelle d'espacement. N'hésitez pas à nous contacter si vous avez besoin d'aide.
Fabian Zeindl
1
@Niclas J'adorerais si vous pouviez jouer mon package sur NPM: npmjs.com/package/react-native-style-tachyons , la raison étant que j'en ai une version obsolète en ligne également, qui est actuellement classée plus haut , à cause des étoiles.
Fabian Zeindl
Salut Fabian, est-il possible que le style par défaut s'applique automatiquement à certains éléments, disons Texte? Pouvez-vous en donner un exemple? Je ne pense pas que l'OP voulait spécifier style = pour chaque élément, mais il semble qu'ils se soient installés pour cela.
Michael Ribbons
Pas avec ma bibliothèque, non.
Fabian Zeindl
2

Toutes ces méthodes répondent directement à la question, mais en ce qui me concerne, ce n'est pas la manière de le faire dans un système de conception basé sur des composants comme React.

Nous pouvons commencer avec des composants atomiques, puis les superposer et les regrouper jusqu'en haut. L'article suivant pourrait rendre cette réflexion plus claire: http://atomicdesign.bradfrost.com/chapter-2/

Dans le monde naturel, les éléments atomiques se combinent pour former des molécules. Ces molécules peuvent se combiner davantage pour former des organismes relativement complexes.

Si vous avez besoin d'un composant de base qui n'existe pas, créez-le. Ensuite, vous pouvez créer d'autres composants moins spécifiques avec. par exemple:

// rerender is cheaper without style prop when
// the default style is an unchanged reference
// instead of a new object every time.
const style = {
  color   : 'MidnightBlue',
  fontSize: 14,
}

function getStyle (styleProp) {
  // styleProp is able to overwrite style
  if (styleProp) return {...style, ...styleProp}
  else return style
}

export default function CustomText (props) {
  return (
    <Text style={getStyle(props.style)}>
      {props.children}
    </Text>
  )
}

Ensuite, utilisez CustomTextpartout au lieu de Text. Vous pouvez aussi le faire avec View, div, spanou toute autre chose.

ThaJay
la source
@TheJay, cela a tout son sens pour les composants individuels, mais comment appliqueriez-vous le style à tous les écrans? Quelque chose comme les pages maîtres asp.net: quanzhanketang.com/aspnet/aspnet_masterpages.html
mxmissile
Avez-vous lu la dernière phrase? C'est aussi simple que de remplacer <Text />par <CustomText />partout. Vous pouvez même importer CustomText en tant que texte afin de ne plus avoir qu'à remplacer l'importation.
ThaJay
0

Fichier CSS externe main.css

'use strict';

var {
   StyleSheet,
 } = 'react-native';

module.exports = StyleSheet.create({

  main: {
     backgroundColor: 'gray',
     height: 20,
     width: 100,
  }
});

créer une instance de fichier css dans le composant.

var mainCss = require('./main');

<View style={mainCss.main}><Text>Hello</Text></View>
cheema harpreet
la source
Dupliquer la réponse stackoverflow.com/a/30858201/5243543
ThaJay
0

Ici, vous pouvez trouver un moyen élégant de trier vos styles puis de les importer dans les différents composants, vous pouvez créer un dossier dans lequel vous rassemblez tous les fichiers de styles et créez et index.js qui va fonctionner comme façade:

l'index.js ressemblera à:

import Variables from './variables';
import GlobalStyles from './global'; 

export { Variables, GlobalStyles };

puis importez comme ceci:

import { GlobalStyles } from './stylesheets/index';

Ici pour plus d'informations:

https://thoughtbot.com/blog/structure-for-styling-in-react-native

José Rojas
la source
-3

Jetez un œil aux thèmes Shoutem pour React Native.

Voici ce que vous obtenez avec le thème Shoutem:

Style global où un certain style est automatiquement appliqué au composant par son nom de style:

const theme = {
  'my.app.ComponentStyleName': {
    backgroundColor: 'navy',
  },
};

Activation de certains styles spécifiques aux composants avec styleName(comme la classe CSS):

const theme = {
  'my.app.ComponentStyleName': {
    '.rounded': {
      borderRadius: 20,
    },
    backgroundColor: 'navy',
  },
};

// Implementation - will apply borderRadius to Component
<Component styleName="rounded"/>

Héritage de style automatique:

const theme = {
  'my.app.ComponentStyleName': {
    'my.app.ChildComponentStyleName': {
      backgroundColor: 'red',
    },
    '.rounded': {
      borderRadius: 20,
    },
    backgroundColor: 'navy',
  },
};

// Implementation - will apply red background color to ChildComponent
<Component styleName="rounded">
  <ChildComponent/>
</Component>

Style imbriqué pour les composants composés:

const theme = {
  'my.app.ComponentStyleName': {
    containerView: {
      paddingTop: 10,
    },
    innerView: {
      backgroundColor: 'yellow',
    },
  },
};

// Of course do not forget to connect Component
function Component({ style }) {
  return (
   <View style={style.containerView}>
    <View style={style.innerView}>
     <Text>Warning with yellow background.</Text>
    </View>
   </View>
  );
}

Pour que cela fonctionne, vous devez utiliser StyleProviderle composant wrapper qui fournit du style à tous les autres composants via le contexte. Similaire à Redux StoreProvider.

Vous devez également connecter votre composant au style avec connectStyleafin de toujours utiliser le composant connecté. Similaire à Redux connect.

export const styledComponent = connectStyle('my.app.ComponentStyleName',
                                { ...defaultStyleIfAny })(Component);

Vous pouvez voir un exemple dans la documentation.

Une dernière chose, nous avons également fourni un ensemble de composants dans notre boîte à outils d'interface utilisateur qui sont déjà connectés au style, vous pouvez donc simplement les importer et les styliser dans votre style / thème global.

Monsieur Br
la source