React Nativeグローバルスタイル


96

私はReactを初めて使用し、コンポーネントベースのインラインスタイルの利点を理解しています。しかし、なんらかのグローバルスタイルを実現するための適切な方法があるかどうか疑問に思っています。たとえば、アプリ全体で同じテキストとボタンのカラーリングを使用したいとします。

すべてのコンポーネントで繰り返すのではなく(その後、必要に応じてxか所で変更する必要があります)、私の最初の考えは、独自のファイルに「ベース」StyleSheetクラスを作成し、コンポーネントにインポートすることです。

より良い、またはもっと「反応する」方法はありますか?

回答:


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

17
今すぐ使用できますimport { StyleSheet } from 'react-native';
LYu

私はグローバルスタイルを取得する別の方法を説明する答えを追加しました、あなたは見てとることもできますしましたstackoverflow.com/questions/30853178/react-native-global-styles/...を。静的な定義を回避するため、はるかに柔軟で、Reactの精神に沿っています。
Mr Br

これは、DRYではなく、Reactエコシステム内で推奨されているようなコンポーネントベースの設計(またはアーキテクチャ)でもないことに同意します。デフォルトのスタイルを持つすべてのコンポーネントをstyle={defaultStyle}追加する必要があります。代わりに、を作成して、仕様に合わせてスタイル設定DefaultViewviewれたの代わりにそれを使用できます。私はこの方法を詳しく説明する回答を少し前に書きました: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 2017年

1
'./Styles'は、ファイル名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 2017

重複した回答stackoverflow.com/a/30858201/5243543
ThaJay


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を試してください。これにより、グローバルスタイルだけでなく、ルートのフォントサイズに相対的な幅と高さを備えたデザインファーストのレスポンシブレイアウトシステムが実現します。


これは面白い!最初は奇妙に見えましたが、考えてみると、記述するコードが少ないことを考えると、かなり良いようです。
Niclas

ご利用いただきありがとうございます。特に、間隔スケールを理解する方法を学びます。サポートが必要な場合は、遠慮なくご連絡ください。
Fabian Zeindl 2016年

1
あなたがNPMに私のパッケージを主演することができれば@Niclasが、私は大好きです:npmjs.com/package/react-native-style-tachyons、理由ビーイングは、私が現在まで高くランクされている、あまりにもオンラインでの廃止予定のバージョンを持っているということです、星のため。
Fabian Zeindl

こんにちはファビアン、デフォルトのスタイルをテキストなどの特定の要素に自動的に適用することは可能ですか?その例を提供できますか?OPがすべての要素にstyle =を指定したかったとは思いませんが、これで問題ないようです。
マイケル・リボンズ2017

私の図書館ではありません。
Fabian Zeindl 2017

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をテキストとしてインポートすることもできるので、インポートを置き換えるだけで済みます。
ThaJay

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
ThaJay

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テーマで得られるものは次のとおりです。

特定のスタイルがスタイル名によってコンポーネントに自動的に適用されるグローバルスタイル:

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 ToolKitのコンポーネントセットも提供しているので、それらをインポートしてグローバルスタイル/テーマにスタイルを設定できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.