SPA中的複合元件

複合元件將多個基本元件組合為單一元件,以充分利用AEM元件的模組化性質。 常見的複合元件使用案例是卡元件,由影像和文本元件的組合構成。

在AEM單頁應用程式(SPA)編輯器架構中正確實作複合元件時,內容作者可以像拖放任何其他元件一樣拖放元件,但仍可個別編輯組成複合元件的每個元件。

本文示範如何將複合元件新增至單頁應用程式,以便與AEM SPA編輯器順暢地運作。

使用案例

本文將以典型卡元件為例進行使用。 卡片是許多數位體驗的通用UI元素,通常由影像和相關文字或註解組成。 作者想要能夠拖放整張卡片,但可以個別編輯卡片的影像以及自訂相關文字。

必備條件

下列模型是支援複合元件使用案例的先決條件。

  • 您的AEM開發執行個體透過範例專案,在連接埠4502上於本機執行。
  • 已在AEM中啟用可編輯的有效外部React應用程式
  • React應用程式是使用RemotePage元件在AEM編輯器中載入的。

將複合元件添加到SPA

實作複合元件有三種不同的模型,視您在AEM中的SPA實作而定。

以下各節提供以卡片元件為例實作每個案例的範例。

元件不存在於AEM專案中。

首先,建立構成複合元件的元件,即影像及其文本的元件。

  1. 在AEM專案中建立文字元件。

  2. 從元件的editConfig節點中的專案新增對應的resourceType

     resourceType: 'wknd-spa/components/text' 
    
  3. 使用withMappable幫助程式啟用元件的編輯。

    export const AEMText = withMappable(Text, TextEditConfig); 
    

文字元件將類似於以下內容。

import React from 'react';
import { withMappable } from '@adobe/aem-react-editable-components';

export const TextEditConfig = {
  emptyLabel: 'Text',
  isEmpty: function(props) {
    return !props || !props.text || props.text.trim().length < 1;
  },
  resourceType: 'wknd-spa/components/text'
};

export const Text = ({ cqPath, richText, text }) => {
  const richTextContent = () => (
    <div className="aem_text"
      id={cqPath.substr(cqPath.lastIndexOf('/') + 1)}
      data-rte-editelement
      dangerouslySetInnerHTML={{__html: text}} />
  );
  return richText ? richTextContent() : (
     <div className="aem_text">{text}</div>
  );
};

export const AEMText = withMappable(Text, TextEditConfig);

如果您以類似方式建立影像元件,則可以將其與AEMText元件結合為新卡元件,使用影像和文字元件作為子項。

import React from 'react';
import { AEMText } from './AEMText';
import { AEMImage } from './AEMImage';

export const AEMCard = ({ pagePath, itemPath}) => (
  <div>
    <AEMText
       pagePath={pagePath}
       itemPath={`text`} />
    <AEMImage
       pagePath={pagePath}
       itemPath={`image`} />
   </div>
);

現在,產生的複合元件可以放置在應用程式中的任何位置,且會在SPA編輯器中新增文字和影像元件的預留位置。 在以下範例中,卡元件會新增至標題下方的首頁元件。

function Home() {
  return (
    <div className="Home">
      <h2>Current Adventures</h2>
      <AEMCard
        pagePath='/content/wknd-spa/home' />
    </div>
  );
}

這會在編輯器中顯示文字和影像的空白預留位置。 使用編輯器輸入這些值時,它們會儲存在指定的頁面路徑,即根層級的/content/wknd-spa/home中,且名稱會在itemPath中指定。

編輯器中的複合卡元件

元件存在於您的AEM專案中,但其必要內容不存在。

在此情況下,卡片元件已建立在包含標題和影像節點的AEM專案中。 子節點(文本和影像)具有相應的資源類型。

卡元件的節點結構

然後,您可以將其新增至SPA並擷取其內容。

  1. 在SPA中為此建立對應元件。 請確定子元件已對應至SPA專案內對應的AEM資源類型。 在此示例中,我們使用與上一個示例中詳細的相同的AEMTextAEMImage元件。

    import React from 'react';
    import { Container, withMappable, MapTo } from '@adobe/aem-react-editable-components';
    import { Text, TextEditConfig } from './AEMText';
    import Image, { ImageEditConfig } from './AEMImage';
    
    export const AEMCard = withMappable(Container, {
      resourceType: 'wknd-spa/components/imagecard'
    });
    
    MapTo('wknd-spa/components/text')(Text, TextEditConfig);
    MapTo('wknd-spa/components/image')(Image, ImageEditConfig);
    
  2. 由於imagecard元件沒有內容,請將卡片新增至頁面。 在SPA中納入來自AEM的現有容器。

    • 如果AEM專案中已有容器,可改將此項目包含在SPA中,並改為從AEM將元件新增至容器。
    • 確認卡片元件已對應至SPA中的對應資源類型。
    <ResponsiveGrid
     pagePath='/content/wknd-spa/home'
     itemPath='root/responsivegrid' />
    
  3. 將建立的wknd-spa/components/imagecard元件添加到頁面模板中容器元件的允許元件中。

現在,imagecard元件可以直接新增至AEM編輯器中的容器。

編輯器中的複合卡

元件及其必要內容均存在於您的AEM專案中。

如果內容存在於AEM中,則可提供內容的路徑,以直接將其包含在SPA中。

<AEMCard
    pagePath='/content/wknd-spa/home'
    itemPath='root/responsivegrid/imagecard' />

節點結構中的複合路徑

AEMCard元件與上一個使用案例中定義的相同。 SPA中會包含上述AEM專案位置中定義的內容。

本頁內容