响应本机全局样式


96

我是React的新手,我了解基于组件的内联样式的好处。但是我想知道是否有一种不错的方式来具有某种全球风格。例如,我想在我的整个应用程序中使用相同的文本和按钮颜色。

而不是在每个组件中重复(然后需要在x位置上进行更改),我的最初想法是在自己的文件中创建一个“基本” StyleSheet类,并将其导入到我的组件中。

有更好或更“反应”的方式吗?

Answers:


118

您可以创建一个可重用的样式表。例:

style.js

'use strict';

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

var {
  StyleSheet,
} = React;

module.exports = StyleSheet.create({

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

});

在您的组件中:

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

...然后:

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

是的,这就是我所描述的。感谢您确认我的想法正确。现在将标记为正确答案。
Patm 2015年

17
现在您可以使用import { StyleSheet } from 'react-native';
LYu

我添加了答案,解释了获取Global样式的另一种方法,您可能想看看stackoverflow.com/questions/30853178/react-native-global-styles/…。它更加灵活,并且具有React精神,因为它避免了静态定义。
Br Br

我不同意,这不是DRY,也不是像React生态系统中推荐的基于组件的设计(或架构)。每个具有默认样式的组件都需要style={defaultStyle}添加。相反,您可以创建一个,DefaultView并使用它来代替view为您的规范样式化的。不久前,我写了一个答案,详细介绍了此方法:stackoverflow.com/a/52429040/5243543
ThaJay

86

为您的样式创建一个文件(IE,Style.js)。

这是一个例子:

import { StyleSheet } from 'react-native';

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

在要使用样式的任何文件中,添加以下内容:

import styles from './Style'

7
我怀疑这个答案现在更有意义了!
villancikos

1
“ ./Styles”应为“ ./Style”,以匹配文件名Style.js
oOEric

重复的答案stackoverflow.com/a/30858201/5243543
ThaJay

9

如果您只想设置一些全局变量,则可以尝试。

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

不需要AppStyles.js中的导入,但这非常适合只需要一些简单的全局样式变量的情况!
willedanielsson

重复的答案stackoverflow.com/a/30858201/5243543
ThaJay

8

您还可以尝试支持全局样式变量的react-native-extended-stylesheet

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

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

1
像魅力一样工作;)
EQuimper

8

您必须创建一个文件来存储所有样式(例如“ styles.js ”),并根据需要编写css类型代码

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

});

现在您可以使用全局样式

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

试试我的库react-native-style-tachyons,它不仅为您提供全局样式,而且还提供设计优先的响应式布局系统,其宽度和高度相对于您的根字体大小。


这是有趣的!乍一看,它看起来很怪异,但是当我考虑它并考虑需要写的更少的代码时,它似乎还不错。
尼古拉斯

很高兴为您服务。您将学到特别欣赏间距比例尺。如果您需要支持,请随时与我们联系。
Fabian Zeindl '16

1
@Niclas,如果您可以在NPM上为我的包裹加注星标,我会很乐意:npmjs.com/package/react-native-style-tachyons,原因是我在线上也有它的不推荐使用的版本,目前它的排名更高,因为有星星。
Fabian Zeindl

嗨,Fabian,是否可以将默认样式自动应用于某些元素,例如Text?你能提供一个例子吗?我不认为OP希望为每个元素都指定style =,但似乎他们对此有所满意。
Michael Ribbons

不在我的图书馆,不。
Fabian Zeindl

2

所有这些方法都直接回答了这个问题,但是就我而言,这不是在基于组件的设计系统(如React)中实现的方法。

我们可以从原子组件开始,然后将它们分层并一直分组到顶部。以下文章可能使这种思路更加清晰:http : //atomicdesign.bradfrost.com/chapter-2/

在自然界中,原子元素结合在一起形成分子。这些分子可以进一步结合形成相对复杂的生物。

如果您需要一个不存在的基本组件,则可以使用它。然后,您可以使用它来制作其他不太具体的组件。例如:

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

然后CustomText在所有地方使用而不是Text。你也可以用它做Viewdivspan或其他任何东西。


@TheJay这对于单个组件完全有意义,但是如何将样式应用于所有屏幕?类似于asp.net母版页:quanzhanketang.com/aspnet/aspnet_masterpages.html
mxmissile

你读了最后一句话吗?就像<Text /><CustomText />任何地方替换一样简单。您甚至可以将CustomText导入为Text,因此只需替换导入即可。
ThaJay,时间为13:59

0

外部CSS文件main.css

'use strict';

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

module.exports = StyleSheet.create({

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

在组件中创建css文件的实例。

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

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

重复的答案stackoverflow.com/a/30858201/5243543
泰国杰伊

0

在这里,您可以找到一种优雅的方式来对样式进行排序,然后将其导入到不同的组件中,可以创建一个文件夹,在其中收集所有样式文件,并创建将用作外观的index.js:

index.js将如下所示:

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

export { Variables, GlobalStyles };

然后像这样导入:

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

在这里获取更多信息:

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


-3

看看React Native的Shoutem主题

这是您通过Shoutem Theme获得的功能:

全局样式,其中某些样式通过其样式名称自动应用于组件:

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

使用激活特定于组件的样式styleName(例如CSS类):

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

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

自动样式继承:

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>

组成组件的嵌套样式:

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

要使其正常工作,您需要使用StyleProvider,包装器组件通过上下文为所有其他组件提供样式。与Redux相似StoreProvider

另外,您需要将组件与样式连接在一起,connectStyle以便始终使用连接的组件。与Redux相似connect

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

您可以在文档中查看示例。

最后一件事,我们还在UI工具包中提供了已经与样式关联的一组组件,因此您可以按照全局样式/主题导入它们和样式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.