JSS Reactサンプルアプリでのプレースホルダの操作

Version:
日本語翻訳に関する免責事項

このページの翻訳はAIによって自動的に行われました。可能な限り正確な翻訳を心掛けていますが、原文と異なる表現や解釈が含まれる場合があります。正確で公式な情報については、必ず英語の原文をご参照ください。

JSS Reactアプリでプレースホルダーを使用するには、いくつかの方法があります。

先端

JSSアプリのプレースホルダーに関するガイドを読んで、プレースホルダーとは何か、どのように機能するかを理解することをお勧めします。

基本的なプレースホルダーのテクニック

コンポーネントにプレースホルダーを追加する最も一般的な方法は、Placeholderコンポーネントを使用することです。

import { Placeholder } from '@sitecore-jss/sitecore-jss-react';

const App = ({ rendering }) => (
  <div>
    <h1>My App</h1>
    <Placeholder name="jss-main" rendering={rendering} />
  </div>
);

Placeholderコンポーネントの場合:

  • nameは、公開するプレースホルダのキーです。

  • renderingは以下を表すことができます。

    • 現在Sitecoreが提供するレイアウト/ルート データ。

    • 別のコンポーネント内からプレースホルダーを公開する場合は、親コンポーネント データ。

高次コンポーネントプレースホルダー手法

高次コンポーネント (HOC) パターンを使用すると、プレースホルダー内のコンポーネントの配列を取得し、プレースホルダーを公開するコンポーネントにプロパティとして挿入できます。

import { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';

const Tabs = ({ tabs }) => {
  return (
    <div>
      {tabs}
    </div>
  );
};

export default withPlaceholder('tabs')(Tabs);

component配列を出力すると、アプリケーションはコンポーネントを出力した場所にレンダリングします。この手法の主な利点は、ラッパー コンポーネントがないことです。 Placeholderコンポーネントを使用すると、すべての子コンポーネントがコンポーネントツリーでその下にレンダリングされます。この手法でプレースホルダーを出力すると、プレースホルダーにはラッピング コンポーネントがなく、インラインでレンダリングされます。この方法は、次のreact-fullpageの例に示すように、特定のコンポーネント階層に基づくライブラリを使用する場合に便利です。

<SectionsContainer>
  <Section color="#69D2E7">Page 1</Section>
  <Section color="#A7DBD8">Page 2</Section>
  <Section color="#E0E4CC">Page 3</Section>
</SectionsContainer>

前のサンプルでは、コンポーネント階層がSectionsContainer->Sectionであることが想定されています。必要に応じて、プレースホルダーを使用してSectionコンポーネントを追加し、Sitecoreでそれらを定義できるようにすることができます。Placeholderコンポーネントを使用してこれを行うと、階層は次のように表示されますSectionsContainer -> Placeholder -> YourComponent -> Section

<SectionsContainer>
  <Placeholder name="jss-sections" rendering={rendering} />
</SectionsContainer>

HOCベースのプレースホルダーを使用すると、インラインコンポーネントまたはコンポーネント変換のいずれかでこれを解決できます。

インラインコンポーネント

ライブラリがコンポーネントのラッピングの1つのレイヤーを防げない場合は、子コンポーネントをレンダリング コンポーネントに配置できます。次のようなコンポーネント階層の取得SectionsContainer -> YourComponent -> Section :

import { withPlaceholder } from '@sitecore-jss/sitecore-jss-react';

const ContainerComponent = ({ sectionsPlaceholder }) => {
  return <SectionsContainer>{sectionsPlaceholder}</SectionsContainer>;
};

// you can also alias the property for the placeholder when using the HOC - or pass an array of placeholders
export const ContainerSitecoreComponent = withPlaceholder({ placeholder: 'sections', prop: 'sectionsPlaceholder' })(ContainerComponent);

// the <Section> is in the child Sitecore component added to the placeholder
export const ChildSitecoreComponent = (props) => (
  <Section>
    <h1>Your JSS or other React components here</h1>
  </Section>
);

コンポーネントの変換

この例のSectionsContainer -> Sectionのように完全にフラットなコンポーネント階層が必要な場合は、挿入されたプロパティが配列であることを利用して、map関数を使用してラッパーで子コンポーネントを変換できます。子Sitecoreコンポーネントは、ラッピングにまったく気付かず、コンテンツのみをレンダリングして、この手法を使用するときに懸念事項を明確に分離できます。

const ContainerComponent = ({ sectionsPlaceholder }) => {
  return (
    <SectionsContainer>
      {sectionsPlaceholder.map((component, index) => {
        // this if is important, as it prevents breakage when using Sitecore Experience Editor
        if (component.props && component.props.type === 'text/sitecore') return component;

        // wraps _all_ child components in a <Section> component
        return <Section key={index}>{component}</Section>;
      })}
    </SectionsContainer>
  );
};

export const ContainerSitecoreComponent = withPlaceholder({ placeholder: 'sections', prop: 'sectionsPlaceholder' })(ContainerComponent);

レンダリング プロップAPI

JSSは、高階コンポーネントよりもrender propsパターンを好む場合にサポートします。<Placeholder>コンポーネントのrenderプロパティを使用すると、上位コンポーネントと同じ方法でプレースホルダーコンテンツのレンダリングを引き継ぎ、動的プロパティを使用できます。

次の例は、コンポーネント配列を取得し、レンダリング プロパティを使用してレンダリングする方法を示しています。

import { Placeholder } from '@sitecore-jss/sitecore-jss-react';

const App = ({ rendering }) => (
  <div>
    <h1>My App</h1>
    <Placeholder name="jss-main" rendering={rendering} render={(components, placeholderData, props) => <div>{components}</div>} />
  </div>
);

プレースホルダーのrender関数には、次の2つの省略可能な引数を使用できます。

  • propsパラメータは、<Placeholder>に渡されるプロパティのミラーです。

  • placeholderDataパラメータは、現在のプレースホルダーのレイアウト データを提供します。

直接プレースホルダーのイントロスペクション

コンポーネントではなくプレースホルダのデータにアクセスしたい場合も、それが可能です。この手法の良い使用例は、タブなどのコンポーネントで、2つの場所 (タブのタイトルとタブの内容) にピースをレンダリングする必要がある場合です。プレースホルダ階層は大きなJavaScriptオブジェクトであるため、props.renderingを使用して自分でトラバースし、子コンポーネントのデータとフィールドを検出できます。

const Tabs = ({ rendering, tabs }) => (
<Tab.Container>
  <div class="tabsHeading">
    {(rendering.placeholders.tabs || [])
      .filter((tab) => tab && tab.fields && tab.fields.title)
      .map((tab, index) => (
        <Tab.Heading key={index}>
          <Text field={tab.fields.title} />
        </Tab.Heading>
      ))}
  </div>

  <div class="tabContents">
    {tabs}
  </div>
</Tab.Container>
);

export default withPlaceholder('tabs')(Tabs);

技術的には、この手法を使用して、プレースホルダーコンポーネントやHOCを使用せずに、プレースホルダーを完全にカスタム化してレンダリングすることができます。通常、これはお勧めしません。

プレースホルダーの強化

Placeholderコンポーネントは、開発者のエクスペリエンスを向上させることができるいくつかのカスタマイズをサポートしています。HOCプレースホルダーでも、関数を使用して同じpropsを注入するpropsTransformerオプションを使用して、同じカスタマイズが可能です。

エラーコンポーネント

プレースホルダーでレンダリングエラーが発生した場合、プレースホルダーはプレースホルダーの内容の代わりにエラーコンポーネントを表示し、エラーの詳細をコンソールに記録します。このコンポーネントは、errorComponent propを使用して独自のReactコンポーネントを置き換えることでカスタマイズできます。

欠落しているコンポーネントコンポーネント

プレースホルダーにcomponentFactory不明なレンダリング名が含まれている場合 (たとえば、バックエンド開発者がFooレンダリングを作成してページに追加するが、まだFoo.jsがない場合)、レンダリングはReactコンポーネントのmissingComponentComponentプロパティで定義されたMissingComponentコンポーネントに置き換えられます。デフォルトの実装は単純なメッセージですが、missingComponentComponentプロパティで独自のReactコンポーネントを使用してカスタマイズできます。

非表示のレンダリングの処理

パーソナライゼーションルールでレンダリングが非表示になっている場合、レンダリングにJSS実装がない場合のエラーメッセージを防ぐために、レンダリングはHiddenRenderingコンポーネントに置き換えられます。コンポーネントを作成し、hiddenRenderingComponentプロパティを使用してプレースホルダに提供できます。

この記事を改善するための提案がある場合は、 お知らせください!