前回はサンプルのコードを配置して動かすところまで進めていきました。今回は、どういうコードの記述が必要か、データはどういう形で持つのか?などを確認していきたいと思います。
プレゼンテーションを確認する
前回作成をしたサンプルのコンポーネントの動作を確認していきたいと思います。まず、プレゼンテーションの設定を確認すると、BYOC Wrapper のコントロールが配置されています。
コントロールのデータを見ると、以下のようにプロパティが設定されています。
実際に設定をしたデータは、Component Props として保存されていることがわかります。
コードを確認していく
続いてサンプルのコードを確認していきます。まず最初にコンポーネントで記載しているレイアウト部分に関しては、以下のようになります。
export default function ExampleClientsideComponent(props: {
firstName: string;
lastName: string;
telephone: string;
bold: boolean;
}) {
return (
<>
<h2>Hybrid</h2>
<dl style={props.bold ? { fontWeight: 'bold' } : {}}>
<dt>Description</dt>
<dd>Interactive UI with SEO-friendly fallback</dd>
<dt>Rendered on</dt>
<dd>{typeof window != 'undefined' ? 'Clientside' : 'Server'}</dd>
<dt>Data</dt>
<dd>
{props.firstName} {props.lastName} / {props.telephone}
</dd>
</dl>
</>
);
}
上記のコンポーネントでは、以下の項目を利用してレンダリングしています。
- firstName: string;
- lastName: string;
- telephone: string;
- bold: boolean;
続いてこの下で記載されているコードは、コンポーネントに関する定義となっています。
FEAAS.registerComponent(ExampleClientsideComponent, {
name: 'hybrid',
title: 'Hybrid server/client',
description: 'Interactive UI with SEO-friendly fallback',
thumbnail: 'https://feaasstatic.blob.core.windows.net/assets/thumbnails/byoc.svg',
group: 'Examples',
required: ['firstName'],
properties: {
firstName: {
type: 'string',
title: 'First name',
},
lastName: {
type: 'string',
title: 'Last name',
},
telephone: {
type: 'number',
title: 'Telephone',
minLength: 10,
},
bold: {
type: 'boolean',
title: 'Show text in bold weight',
},
},
ui: {
firstName: {
'ui:autofocus': true,
'ui:emptyValue': '',
'ui:placeholder': 'Write your first name',
},
bold: {
'ui:widget': 'radio',
},
},
});
この部分でコンポーネントに関しての定義が入っています。
- name - コンポーネントの名称
- title - Pages で表示されるコンポーネント名
- group - Pages でコンポーネントを表示するグループ名
- thumbnail - Pages で表示するコンポーネントのサムネイル画像
- required - 必須項目
- properties - コンポーネントで持つデータに関して
それでは一気に、以下のようにコードを書き換えました。利用しているのはテキスト、それに合わせた画像の情報となります。
import * as FEAAS from '@sitecore-feaas/clientside/react';
export default function ByoCSample(props: {
simpleText: string;
imageUrl: string;
imageText: string;
}) {
return (
<>
<h2>ByoC Sample</h2>
<dl>
<dt>Rendered on</dt>
<dd>{typeof window != 'undefined' ? 'Clientside' : 'Server'}</dd>
<dt>Data</dt>
<dd>
{props.simpleText} {props.imageUrl} / {props.imageText}
</dd>
</dl>
</>
);
}
FEAAS.registerComponent(ByoCSample, {
name: 'BYOCsample',
title: 'BYOC Sample',
description: 'Interactive UI with SEO-friendly fallback',
thumbnail: 'https://feaasstatic.blob.core.windows.net/assets/thumbnails/byoc.svg',
group: 'Tailwind Sample',
required: ['simpleText'],
properties: {
simpleText: {
type: 'string',
title: 'Component Text',
},
imageUrl: {
type: 'string',
title: 'Image URL',
},
imageText: {
type: 'string',
title: 'Alt Text',
},
},
ui: {
simpleText: {
'ui:autofocus': true,
'ui:emptyValue': '',
'ui:placeholder': 'simple name',
},
},
});
項目を変更しただけですが、今回はこれで動かしたいと思います。実際に配置すると以下のように表示されます。
Pages でコンポーネントの配置、そしてその要素を変更できることを確認することができました。
プレーンなコンポーネントを生成する
今回はサンプルのコードを利用して作成をしましたが、コマンドでコンポーネントのソースコードを出力することが可能です。
powershell jss scaffold Sample --byoc
上記のコマンドを実行すると、src\components\Sample.tsx のファイルが生成されます。コードは以下の通りです。
import React from 'react';
import * as FEAAS from '@sitecore-feaas/clientside/react';
interface SampleProps {
title: string;
columnsCount: number;
}
export const Sample = (props: SampleProps): JSX.Element => {
const columns: string[] = [];
for (let i = 0; i < props.columnsCount; i++) {
columns.push(`Component Column ${i + 1}`);
}
return (
<div className="container">
<h2>{props.title || 'BYOC Demo'}</h2>
<p>Sample Component</p>
<div className="row">
{columns.map((text, index) => (
<div key={index} className={`col-sm-${props.columnsCount}`}>
{text}
</div>
))}
</div>
</div>
);
};
FEAAS.External.registerComponent(Sample, {
name: 'Sample',
properties: {
title: {
type: 'string',
},
columnsCount: {
type: 'number',
},
},
});
このコードを元に、コンポーネントを作って登録する形になるかと思います。
まとめ
今回は Bring own your component という仕組みで Sitecore にコンポーネントを追加しました。みたまま編集はできませんが、とはいえコンポーネントの中身を書き換えることができるコンポーネントを簡単に作ることができます。Figma などから出力したコードなどを利用する際に便利な機能になります。