Reagisci agli stili globali nativi


96

Sono nuovo con React e capisco i vantaggi degli stili inline basati sui componenti. Ma mi chiedo se esista un modo decente per avere una sorta di stile globale. Ad esempio, mi piacerebbe utilizzare la stessa colorazione di testo e pulsanti in tutta la mia app.

Piuttosto che ripetere in ogni componente (e successivamente doverlo cambiare in x posti se necessario), il mio pensiero iniziale è quello di creare una classe StyleSheet 'base' nel proprio file e importarla nei miei componenti.

Esiste un modo migliore o più "Reagisci"?

Risposte:


118

Puoi creare un foglio di stile riutilizzabile. Esempio:

style.js

'use strict';

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

var {
  StyleSheet,
} = React;

module.exports = StyleSheet.create({

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

});

Nel tuo componente:

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

...poi:

<View style={s.alwaysred} ></View>

Sì, questo è quello che ho descritto. Grazie per la conferma che ho avuto l'idea giusta. Contrassegnerà come risposta corretta per ora.
Patm

17
Ora puoi semplicemente usareimport { StyleSheet } from 'react-native';
LYu

Ho aggiunto una risposta che spiega un modo diverso di ottenere lo stile globale, potresti voler dare un'occhiata a stackoverflow.com/questions/30853178/react-native-global-styles/… . È molto più flessibile e nello spirito di React perché evita la definizione statica.
Mr Br

Non sono d'accordo, questo non è DRY e nemmeno il design basato su componenti (o architettura) come è raccomandato all'interno dell'ecosistema React. ogni componente con uno stile predefinito richiederà style={defaultStyle}di essere aggiunto. Invece, puoi creare un DefaultViewe usarlo al posto del fornito viewche ha uno stile secondo le tue specifiche. Ho scritto una risposta i dettagli di tale metodo di qualche tempo fa: stackoverflow.com/a/52429040/5243543
ThaJay

86

Crea un file per i tuoi stili (IE, Style.js).

Ecco un esempio:

import { StyleSheet } from 'react-native';

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

In uno qualsiasi dei file che desideri utilizzare con il tuo stile, aggiungi quanto segue:

import styles from './Style'

7
Sospetto che questa risposta sia più pertinente ora!
villancikos

1
"./Styles" dovrebbe essere "./Style" per corrispondere al nome del file Style.js
oOEric


10

Se volessi solo impostare alcune variabili globali potresti provare.

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
    }
});

Non è necessaria l'importazione in AppStyles.js, ma è perfetto per quando vuoi solo alcune semplici variabili di stile globali!
willedanielsson

Risposta duplicata stackoverflow.com/a/30858201/5243543
stackoverflow.com/a/30858201/5243543

8

Puoi anche provare il foglio di stile reattivo-nativo-esteso che supporta le variabili di stile globali:

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

// component.js
var styles = EStyleSheet.create({
  button: {
    backgroundColor: '$buttonColor',
    ...
  }
});

1
Funziona come un incantesimo;)
EQuimper

8

Devi creare un file per memorizzare tutto lo stile in esso come ' styles.js ' e scrivere il codice di tipo css di cui hai bisogno

'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'
    }

});

e ora puoi usare lo stile globale come puoi vedere

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>
    );
  }
}


2

Prova la mia libreria React-Native-Style-Tachyons , che non solo ti offre stili globali, ma anche un sistema di layout reattivo con larghezze e altezze relative alla dimensione del carattere principale.


Questo è interessante! A prima vista, sembrava strano, ma quando ci penso, e considero meno codice che dovrei scrivere, sembra abbastanza buono.
Niclas

Sono contento che funzioni per te. Imparerai ad apprezzare soprattutto la scala della spaziatura. Sentiti libero di contattarci se hai bisogno di supporto.
Fabian Zeindl

1
@ Niclas Mi piacerebbe se potessi aggiungere il mio pacchetto su NPM: npmjs.com/package/react-native-style-tachyons , il motivo è che ho anche una versione deprecata online, che attualmente è classificata più in alto , a causa delle stelle.
Fabian Zeindl

Ciao Fabian, è possibile che lo stile predefinito si applichi automaticamente a determinati elementi, ad esempio Testo? Puoi fornire un esempio di ciò? Non penso che l'OP volesse specificare style = per ogni elemento, ma sembra che si siano accontentati di questo.
Michael Ribbons

Non con la mia biblioteca, no.
Fabian Zeindl

2

Tutti questi metodi rispondono direttamente alla domanda, ma per quanto mi riguarda, non è il modo di farlo in un sistema di progettazione basato su componenti come React.

Possiamo iniziare con componenti atomici, quindi sovrapporli e raggrupparli fino in cima. Il seguente articolo potrebbe rendere più chiara questa linea di pensiero: http://atomicdesign.bradfrost.com/chapter-2/

Nel mondo naturale, gli elementi atomici si combinano per formare molecole. Queste molecole possono combinarsi ulteriormente per formare organismi relativamente complessi.

Se hai bisogno di un componente di base che non esiste, fallo. Quindi puoi creare altri componenti meno specifici con esso. per esempio:

// 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>
  )
}

Quindi usa CustomTextovunque invece di Text. È anche possibile farlo con View, div, spano qualsiasi altra cosa.


@TheJay questo ha perfettamente senso per i singoli componenti, ma come applicheresti lo stile a tutti gli schermi? Qualcosa come le pagine master di asp.net: quanzhanketang.com/aspnet/aspnet_masterpages.html
mxmissile

Hai letto l'ultima frase? È facile come sostituire <Text />con <CustomText />ovunque. Puoi anche importare CustomText come testo, quindi devi solo sostituire l'importazione.
ThaJay

0

File CSS esterno main.css

'use strict';

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

module.exports = StyleSheet.create({

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

crea istanza del file css nel componente.

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

<View style={mainCss.main}><Text>Hello</Text></View>


0

Qui puoi trovare un modo elegante per ordinare i tuoi stili e quindi importarli nei diversi componenti, puoi creare una cartella in cui raccogliere tutti i file di stili e creare e index.js che funzionerà come facciata:

index.js avrà il seguente aspetto:

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

export { Variables, GlobalStyles };

e poi importa in questo modo:

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

Qui per ulteriori informazioni:

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


-3

Dai un'occhiata ai temi Shoutem per React Native.

Ecco cosa ottieni con il tema Shoutem:

Stile globale in cui un determinato stile viene applicato automaticamente al componente in base al nome dello stile:

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

Attivazione di determinati stili di componenti specifici con styleName(come la classe CSS):

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

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

Ereditarietà automatica dello stile:

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>

Stile nidificato per componenti composti:

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>
  );
}

Per farlo funzionare è necessario utilizzare StyleProvideril componente wrapper che fornisce lo stile a tutti gli altri componenti attraverso il contesto. Simile a Redux StoreProvider.

Inoltre è necessario collegare il componente allo stile con in connectStylemodo da utilizzare sempre il componente connesso. Simile a Redux connect.

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

Puoi vedere un esempio nella documentazione.

Un'ultima cosa, abbiamo anche fornito un set di componenti nel nostro UI ToolKit che sono già collegati allo stile, quindi puoi semplicemente importarli e lo stile nel tuo stile / tema globale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.