インタラクティブな例を使用したスタイル付きコンポーネントのクイックガイド

「それはおもしろい…」スタイル付きコンポーネントについて最初に読んだとき、私は考えました。そして、私は、実証済みのReactコンポーネントに戻りました。

しかし、その後、スタイルコンポーネントの共同作成者であるMax Stoiberが、React in Flip Flopsコーディングブートキャンプで彼の新しいライブラリを見せてくれました。 「それはおもしろい」が「それは驚くべきことだ!」

興奮を抑えきれませんでした。スタイル付きコンポーネントの背後にある概念をようやく理解しました。コンポーネントのスタイル設定方法について、非常に多くの新しい可能性を開きました。 Webアプリケーションの構造化方法を簡素化しました。また、Reactアプリのスタイリングに一貫性を強制しました。

すべてはタグ付きテンプレートリテラルで始まりました

私は少し古い学校だと思うかもしれませんが、アイデアを本当に理解したい場合は、根底にある概念に頭を巻く必要があると思います。スタイル付けされたコンポーネントに直接飛び込むことができます。しかし、まず、プロジェクトを開始し、実際にスタイル付きコンポーネントを構築する前に、マックスとグレンの好奇心をかきたてたものを見つけましょう。

ES6のテンプレートリテラルは、変数とテキストを混在させる方法を簡素化します。 「アリス」と「ハッピー」の値がそれぞれ割り当てられた名前とムードの2つの変数を取る場合、テンプレートリテラルは次のようになります。

const文= `$ {name}は$ {mood} .`;

「アリスは幸せです」という文を生成します。

タグ付きテンプレートリテラルは、構文をさらに一歩進めます。

タグはJavaScript関数です。ただし、通常の機能と比較して2つの本質的な違いがあります。

  • タグ関数は、括弧の代わりにバックティック表記を使用して呼び出されます。次の例では、引数をバックティックでラップしてgreetingTag関数を呼び出しています。
greetingTag` $ {name}は$ {mood} .`;です。
  • JavaScriptは、テンプレートリテラル(バッククォート間のすべて)を関数の引数として扱います。最初のステップで、JavaScriptはテンプレートリテラルを文字列の配列に変換します。文字列の後には、抽出された変数が続きます。上記の例を使用すると、greetingTag関数に渡される変換された引数は次のようになります。
[""、 "は"、 "。"]、名前、気分

最初の引数の配列には、名前とムード変数の前、間に、後に配置したすべての文字列が含まれます。この例では、名前の前に何もないため、最初の文字列は空です。次の2つの引数、nameとmoodは、テンプレートリテラルから変数として抽出されました。

これで、greetingTag関数は、テキストの配列と名前およびムード変数に任意のロジックを適用し、目的の結果を返すことができます。

タグ関数、greetingTagを作成しましょう。この関数は、テキスト配列、名前、ムード変数の3つの引数を取ります。そして、使用するロジックは次のとおりです:moodの値が「happy」の場合、通常の挨拶文を返しますが、他のすべての場合は、元気の良い挨拶文を返します。

const greetingTag =(テキスト、名前、気分)=> {
  if(mood === 'happy'){
    return `こんにちは$ {name}!`;
  } else {
    「こんにちは$ {name}、あなたは素晴らしい!」を返します。
  }
}
const greeting = greetingTag` $ {name}は$ {mood} .`;です。

ここで、名前に「アリス」、ムードに「幸せ」を割り当てた場合、greetingTag関数は「Hi Alice!」を返します。ムードの値を「ハッピー」以外の単語に変更した場合-「興奮した」または「猫」と言うと、greetingTagは「Hi Alice、you are awesome!」を返します。

しかし、どのようにこの知識を使用してReactコンポーネントをスタイルできますか?

スタイル付きコンポーネント

MaxとGlennは、Reactコンポーネントをよりスタイリングし、より一貫したスタイルにする方法を探していたときに、この正確な質問に戸惑いました。あは!タグ付きテンプレートリテラルが変数だけでなく関数も受け入れることに気付いた瞬間になりました。以下の例のように:

const greeting = greetingTag` $ {name => `Hi $ {name}!`} `;

ここでは、greetingTagは関数を含むテンプレートリテラルを受け取ります。 greetingTagによって関数が実行されると、greetingTagは返された値にさらにロジックを適用し、結果を返すことができます。

スタイル付きコンポーネントもタグ関数です。ただし、グリーティングパターンを受け入れる代わりに、CSSスタイルを含むテンプレートリテラルを受け入れます。そして、挨拶文の代わりに、Reactコンポーネントを返します。

それがどのように機能するかをお見せしましょう。

サイドノート:以下のコード例はインタラクティブです。それらをいじって、スタイルを追加し、割り当てられた値を変更できます。タブをクリックして、さまざまなファイルを検査できます。または、上部のオレンジ、青オレンジ、または青のボタンを押して、異なるビューを切り替えます。

アプリケーションでスタイル付きコンポーネントを使用する場合は、最初にスタイル付きコンポーネントをインストールする必要があります。

npm install --styled-componentsを保存します

以下に、スタイル付きコンポーネントのタイトルを作成しました。

styled.h1はタグ関数です。以下と同じReactコンポーネントを返します。

ReactからReactをインポートします。
const Title =({children})=> 

{children}

このソリューションの利点は、スタイル付きコンポーネントが手間がかかることです。コンポーネントのタイトルは、ロイヤルブルーの色になります。

あなたが何を考えているか知っています。すべてのコンポーネントのスタイルをこの方法で記述する必要があったとしても、それはCSSクラスを記述することと大差ありません。ありがたいことに、スタイル付きコンポーネントははるかに賢いです!

ほとんどの場合、ヘッダーを黒に保ち、別の色を使用して散発的に強調したいだけだと想像してください。スタイル付きコンポーネントを使用すると、デフォルトで黒になり、プライマリプロップを渡すたびにroyalblueに変わる色対応のタイトルを作成できます。

他のReactコンポーネントと同様に、小道具をTitleに渡すことができます。ここでは、2番目のタイトルがプライマリプロップを受け取ります。スタイル付きコンポーネント宣言内の小道具にアクセスできます。それはまったく新しい可能性の世界を開きます。

上記では、スタイル付きコンポーネントのタイトルを定義しました。スタイル付きコンポーネント宣言内でプロップにアクセスできるため、コンポーネントの色を決定できます。この関数は三項演算子を使用し、プライマリプロパティがtrueの場合はroyalblueを返し、それ以外の場合はblackを返します。

次のように明示的に記述する必要はありません。

こんにちは、ボブ、あなたは素晴らしい!</ Title></pre><p>割り当てなしで主要な小道具を渡すことは、渡すことに似ています<br />primary = {true}。</p><p>ドアが大きく開いたので、タイトルをより普遍的にしましょう。小さいフォントを使用したり、時には大きいフォントを使用したりするには、タイトルが必要になる場合があります。通常の太さにしたい場合もあれば、目立たせて太字の太さにしたい場合もあります。また、タイトルを大文字にするか大文字にすることもできます。</p><p>スタイル付きコンポーネントを使用すると、単一のユニバーサルコンポーネントを作成できます。そうすれば、スタイルについて考えることなく、どこでも使用できます。</p><p>上記の例では、font-sizeに明示的な値が割り当てられています:48pxまたは32px。このようなコードは、コードベースが大きくなると維持するのが難しくなります。</p><h3>テーマ</h3><p>後で使用するために一連のスタイル付きコンポーネントを作成する場合、アプリケーション全体で一貫したスタイルを適用する必要があります。スタイリングルールを設定することは常に価値があります。できれば、別のファイルに入れてください。後で、すべてのコンポーネントを再訪する代わりに、スタイルを変更する必要がある場合、1か所でスタイルを変更できます。</p><p>スタイル付きコンポーネントは、まさにそのためのツールであるテーマを提供します。</p><p>テーマは、スタイリングパラメーターを定義できるJavaScriptオブジェクトです。</p><pre>constテーマ= {
  色:{
    プライマリ:「royalblue」、
    セカンダリ:「ティール」、
    テキスト:「黒」
  }、
  フォントサイズ: {
    xl:「2.4rem」、
    lg: "1.8rem"、
    md: "1.3rem"、
    nm: "1rem"、
    sm: "0.75rem"
  }
}</pre><p>上記のテーマは、色とfontSizeプロパティを定義します。アプリケーション全体のすべてのスタイル付きコンポーネントでそれらにアクセスできます。</p><p>ただし、最初に、アプリケーションにテーマを認識させる必要があります。 ThemeProviderに小道具として渡す必要があります—スタイル付きコンポーネントによって提供されるラッパーコンポーネント:</p><pre>import {ThemeProvider} from "styled-components";
「./theme.js」からテーマをインポートします。</pre><pre>const App =()=>(
  <ThemeProviderテーマ= {theme}>
    <div>
      <タイトル>こんにちは、アリス!</タイトル>
    </ div>
  </ ThemeProvider>
)</pre><p>前の例を使用して、テーマを使用する方法と、スタイル付きコンポーネント内でそのプロパティにアクセスする方法を学びましょう。</p><p>タイトルでは、props.themeを介してテーマオブジェクトにアクセスできます。たとえば、タイトルの色を選択するには、最初に特定の属性がタイトル(プライマリまたはセカンダリ)に渡されたかどうかを確認します。次に、テーマで宣言された対応するカラー値を返します。何も渡されていない場合は、標準のテキスト色を返します。</p><p>タイトルは、フォントサイズについても決定できるようになりました。最初にxl、lg、md、またはsm propが渡されたかどうかをチェックし、それに基づいて、適切な値をfont-sizeプロパティに割り当てます。小道具が渡されていない場合は、テーマで定義されているfontSize.nmの値を割り当てます。</p><p>柔軟なタイトルコンポーネントを作成しました。これで、CSSを心配することなく使用できます。特定の小道具のセットを渡すことで、その外観のみを決定できます。</p><h3>スタイル付きコンポーネントの拡張</h3><p>タイトルコンポーネントを1つだけ作成するだけでは不十分です。たとえば、ブログページでは、投稿タイトルにh1タグ、字幕にh2タグが必要です。テキストを表示するには段落も必要です。</p><p>スタイル付きコンポーネントは簡単に拡張できます。 h2タグを使用して、タイトルからすべてのスタイリングルールをコピーして貼り付ける新しいSubtitlecomponentを作成できます。または、withComponenthelperメソッドを使用してTitleコンポーネントを拡張できます。サブタイトルにはタイトルのすべてのプロパティがありますが、h2タグを使用します。</p><pre>const Subtitle = Title.withComponent( "h2");</pre><p>Titleを拡張してpタグを持つTextコンポーネントを作成し、同時にその色をtheme.textとして修正し、line-heightを1.65に設定できますか?ここでも、スタイル付きコンポーネントが輝いています:</p><pre>const Paragraph = Title.withComponent( "p");
const Text = Paragraph.extend`
  色:$ {props => props.theme.colors.text};
  行の高さ:1.65;</pre><p>最初に、タイトルのすべてのスタイリングルールを持つ中間のParagraphコンポーネントを作成しました。ただし、pタグを使用してから、Paragraphを拡張してその色とline-heightプロパティを設定するTextcomponentを使用します。以下で、タイトル、サブタイトル、およびテキストコンポーネントのコードを確認できます。</p><p>スタイル付きコンポーネントを使用すると、JavaScriptで通常のCSSを作成できます。さらに、CSSスタイルと擬似クラスをネストできます。メディアクエリと属性を追加できます。最後に、injectGlobalヘルパーメソッドを使用して、グローバルスタイリングルールを挿入し、フォントをインポートできます。</p><h3>擬似クラス</h3><p>擬似クラスの使用方法を学ぶために、マウスをその上に置いたときに色を変えるButtonコンポーネントを作成しましょう。</p><p>上記では、ボタンの上にマウスを移動するたびに色を変更するために&:hover擬似クラスをネストしました。同様に、CSSで利用可能な任意の擬似クラスを使用できます。</p><h3>スタイル付きコンポーネントを使用したグローバルスタイルの注入</h3><p>グローバルスタイルファイルをインポートする代わりに、injectGlobalヘルパーを使用して、アプリケーションにグローバルスタイルを追加できます。まず、injectGlobalヘルパーをインポートする必要があります。</p><pre>「styled-components」からスタイル付き{ThemeProvider、injectGlobal}をインポートします。</pre><p>以下の例では、injectGlobalを使用して以下を実行しています。</p><ul><li>フォントをインポートし、すべての要素のフォントファミリーを「Montserrat」に設定します。</li><li>マージン、パディング、ボーダーをリセットします。</li><li>screen.mediumおよびscreen.mobileよりも小さい画面サイズのmedia-queryを使用して、ルート要素のfont-sizeを変更します。両方ともテーマで定義されています。</li></ul><p>スタイル付きコンポーネントのテーマは一貫性を強化します。詳細については、今まで見た中で最高のドキュメントの1つであるStyled Components Docsをご覧ください。</p><p>MaxとGlenの好奇心のおかげで、スタイル付きコンポーネントは、Reactアプリケーションのスタイルを設定するためのすばらしいツールセットを提供します。スタイル付きコンポーネントのエコシステムは活況を呈しています。エコシステムのページにアクセスして、すぐに使用できるコンポーネントとグリッドシステムを調べてください。スタイル付きコンポーネントで構築された他の多くのツールを調べてください。</p><h3>結論</h3><p>このチュートリアルでは、タグ付きテンプレートリテラルの仕組みを学習しました。また、スタイル設定されたコンポーネントを使用してユニバーサルReactコンポーネントを構築する方法も学びました。これで、テーマを使用して次のアプリケーションの一貫したスタイルを実装する方法がわかりました。</p><p>スタイル付きコンポーネントは、Reactアプリケーションをスタイル設定する新しい方法です。すぐに使用できるスタイル付きコンポーネント:</p><ul><li>再利用可能な汎用コンポーネントを構築できます</li><li>スタイリングの一貫性を強化する</li><li>スタイルをネストできるようにします</li><li>必要に応じてベンダープレフィックスを追加する</li><li>単に素晴らしいです!</li></ul><p>この記事が気に入ったら、50回も—本当に感謝しているし、それは私に大きな違いをもたらします。</p><img alt="" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/dupliceopportunita/1575291447832.jpeg" /><p>最近、初心者向けの無料のReactチュートリアルを公開しました。ウェブアプリケーションをゼロから構築する方法を学びたい場合は、出発点として最適です。見るのに最適な映画を見つけるのに役立つアプリを作成する方法を学びますSweet Pumpkins</p></div><div class="neighbor-articles"><h4 class="ui header">また見なさい</h4><a href="/item/2key-smart-links-as-multi-party-state-networks-ae9481/" title="マルチパーティ状態ネットワークとしての2keyスマートリンク">マルチパーティ状態ネットワークとしての2keyスマートリンク</a><a href="/item/a-step-towards-computing-as-a-science-610077/" title="科学としてのコンピューティングへの一歩">科学としてのコンピューティングへの一歩</a><a href="/item/how-matrix-s-unique-blockchain-platform-acts-as-a-digital-foundation-for-obor-via-the-ida-project-e2ea40/" title="Matrixのユニークなブロックチェーンプラットフォームが、IDAプロジェクトを通じてOBORのデジタル基盤として機能する仕組み">Matrixのユニークなブロックチェーンプラットフォームが、IDAプロジェクトを通じてOBORのデジタル基盤として機能する仕組み</a><a href="/item/how-to-build-chrome-extensions-with-react-parcel-2107ae/" title="React + ParcelでChrome拡張機能を構築する方法">React + ParcelでChrome拡張機能を構築する方法</a><a href="/item/reusable-web-application-strategies-three-patterns-for-running-the-same-app-in-multiple-spots-919c10/" title="再利用可能なWebアプリケーション戦略:複数のスポットで同じアプリを実行するための3つのパターン">再利用可能なWebアプリケーション戦略:複数のスポットで同じアプリを実行するための3つのパターン</a></div></main><div class="push"></div></div><footer style="height:50px">dupliceopportunita.com<!-- --> © <!-- -->2019<!-- --> <a href="https://ko.dupliceopportunita.com/item/a-quick-guide-to-styled-components-with-interactive-examples-477086" title="https://dupliceopportunita.com">dupliceopportunita.com</a></footer></div></div></div><script src="https://cdn.jsdelivr.net/npm/cookieconsent@3/build/cookieconsent.min.js"></script><script>
                  window.cookieconsent.initialise({
                    "palette": {
                      "popup": {
                        "background": "#eaf7f7",
                        "text": "#5c7291"
                      },
                      "button": {
                        "background": "#56cbdb",
                        "text": "#ffffff"
                      }
                    },
                    "showLink": false
                  });
              </script><script async="" src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><script>
                (adsbygoogle = window.adsbygoogle || []).push({
                  google_ad_client: "ca-pub-3845662922897763",
                  enable_page_level_ads: true
                });
              </script></body></html>