Reaccionar estilos globales nativos

98

Soy nuevo en React y entiendo los beneficios de los estilos en línea basados ​​en componentes. Pero me pregunto si hay una forma decente de tener algún tipo de estilo global. Por ejemplo, me gustaría usar el mismo color de Texto y Botón en toda mi aplicación.

En lugar de repetir en cada componente (y posteriormente tener que cambiarlo en x lugares si es necesario), mi pensamiento inicial es crear una clase StyleSheet 'base' en su propio archivo e importarla en mis componentes.

¿Existe una forma mejor o más de 'Reaccionar'?

Patm
fuente

Respuestas:

120

Puede crear una hoja de estilo reutilizable. Ejemplo:

style.js

'use strict';

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

var {
  StyleSheet,
} = React;

module.exports = StyleSheet.create({

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

});

En su componente:

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

...luego:

<View style={s.alwaysred} ></View>
juegos aburridos
fuente
Sí, esto es lo que describí. Gracias por la confirmación de que tuve la idea correcta. Marcará como respuesta correcta por ahora.
Patm
17
Ahora puede usarimport { StyleSheet } from 'react-native';
LYu
Agregué una respuesta que explica una forma diferente de obtener el estilo global, es posible que desee echar un vistazo a stackoverflow.com/questions/30853178/react-native-global-styles/… . Es mucho más flexible y tiene el espíritu de React porque evita la definición estática.
Mr Br
No estoy de acuerdo, esto no es DRY y tampoco un diseño (o arquitectura) basado en componentes como se recomienda dentro del ecosistema React. cada componente con estilo predeterminado deberá style={defaultStyle}agregarse. En su lugar, puede crear un DefaultViewy usarlo en lugar del proporcionado viewque tiene el estilo de su especificación. Escribí una respuesta detallando este método hace un tiempo: stackoverflow.com/a/52429040/5243543
ThaJay
86

Cree un archivo para sus estilos (IE, Style.js).

Aquí hay un ejemplo:

import { StyleSheet } from 'react-native';

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

En cualquiera de los archivos en los que desee utilizar su estilo, agregue lo siguiente:

import styles from './Style'
Barlow Tucker
fuente
7
¡Sospecho que esta respuesta es más relevante ahora!
villancikos
1
'./Styles' debe ser './Style' para que coincida con el nombre de archivo Style.js
oOEric
Respuesta duplicada stackoverflow.com/a/30858201/5243543
ThaJay
10

Si solo desea establecer algunas variables globales, puede intentarlo.

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
    }
});
Robar
fuente
No necesita la importación en AppStyles.js, ¡pero esto es perfecto para cuando solo desea algunas variables de estilo globales simples!
willedanielsson
Respuesta duplicada stackoverflow.com/a/30858201/5243543
ThaJay
9

También puede probar react-native-extended-stylesheet que admite variables de estilo globales:

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

// component.js
var styles = EStyleSheet.create({
  button: {
    backgroundColor: '$buttonColor',
    ...
  }
});
vitalets
fuente
1
Trabaja como un encanto;)
EQuimper
8

Debe crear un archivo para almacenar todo el estilo en él, como ' styles.js ' y escribir el código de tipo css que necesite

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

});

y ahora puede usar el estilo global como puede ver

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
fuente
Respuesta duplicada stackoverflow.com/a/30858201/5243543
ThaJay
2

Pruebe mi biblioteca react-native-style-tachyons , que no solo le brinda estilos globales, sino también un sistema de diseño receptivo que prioriza el diseño con anchos y alturas en relación con el tamaño de fuente raíz.

Fabián Zeindl
fuente
¡Esto es interesante! A primera vista, parecía extraño, pero cuando lo pienso y considero la menor cantidad de código que tendría que escribir, parece bastante bueno.
Niclas
Me alegro de que te funcione. Aprenderá a apreciar especialmente la escala de espaciado. No dude en comunicarse si necesita ayuda.
Fabian Zeindl
1
@Niclas Me encantaría si pudieras destacar mi paquete en NPM: npmjs.com/package/react-native-style-tachyons , la razón es que también tengo una versión obsoleta en línea, que actualmente está en una posición más alta , debido a las estrellas.
Fabian Zeindl
Hola Fabian, ¿es posible que el estilo predeterminado se aplique automáticamente a ciertos elementos, digamos Texto? ¿Puede dar un ejemplo de eso? No creo que el OP quisiera especificar style = para cada elemento, pero parece que se conformaron con esto.
Michael Ribbons
No con mi biblioteca, no.
Fabian Zeindl
2

Todos estos métodos responden directamente a la pregunta, pero en lo que a mí respecta, no es la forma de hacerlo en un sistema de diseño basado en componentes como React.

Podemos comenzar con componentes atómicos, luego colocarlos en capas y agruparlos hasta la parte superior. El siguiente artículo podría aclarar esta línea de pensamiento: http://atomicdesign.bradfrost.com/chapter-2/

En el mundo natural, los elementos atómicos se combinan para formar moléculas. Estas moléculas pueden combinarse más para formar organismos relativamente complejos.

Si necesita un componente base que no existe, lo crea. Entonces puedes hacer otros componentes menos específicos con él. por ejemplo:

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

Luego use en CustomTexttodas partes en lugar de Text. También puede hacerlo con View, div, spano cualquier otra cosa.

ThaJay
fuente
@TheJay, esto tiene mucho sentido para los componentes individuales, pero ¿cómo aplicaría el estilo a todas las pantallas? Algo así como páginas maestras de asp.net: quanzhanketang.com/aspnet/aspnet_masterpages.html
mxmissile
¿Leíste la última frase? Es tan fácil como reemplazarlo <Text />por <CustomText />todas partes. Incluso puede importar texto personalizado como texto para que solo tenga que reemplazar la importación.
ThaJay
0

Archivo CSS externo main.css

'use strict';

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

module.exports = StyleSheet.create({

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

crear una instancia de archivo css en el componente.

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

<View style={mainCss.main}><Text>Hello</Text></View>
Cheema harpreet
fuente
Respuesta duplicada stackoverflow.com/a/30858201/5243543
ThaJay
0

Aquí puede encontrar una forma elegante de ordenar sus estilos y luego importarlos a los diferentes componentes, puede crear una carpeta en la que recopile todos los archivos de estilos y cree un index.js que funcionará como fachada:

el index.js se verá así:

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

export { Variables, GlobalStyles };

y luego importar así:

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

Aquí para más información:

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

Jose Rojas
fuente
-3

Eche un vistazo a Temas de Shoutem para React Native.

Esto es lo que obtienes con el tema Shoutem:

Estilo global donde cierto estilo se aplica automáticamente al componente por su nombre de estilo:

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

Activando cierto estilo de componente específico con styleName(como clase CSS):

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

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

Herencia de estilo automática:

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>

Estilo anidado para componentes compuestos:

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

Para que funcione, debe usar StyleProviderel componente contenedor que proporciona estilo a todos los demás componentes a través del contexto. Similar a ReduxStoreProvider .

También necesita conectar su componente al estilo connectStylepara que siempre use el componente conectado. Similar a Redux connect.

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

Puede ver un ejemplo en la documentación.

Una última cosa, también hemos proporcionado un conjunto de componentes en nuestro UI ToolKit que ya están conectados al estilo, por lo que puede importarlos y diseñar en su estilo / tema global.

Sr. Br
fuente