將SPA元件對應至AEM元件 map-components

瞭解如何使用AEM SPA Editor JS SDK將React元件對應至Adobe Experience Manager (AEM)元件。 元件對應可讓使用者在SPA SPA編輯器中對AEM元件進行動態更新,類似於傳統的AEM編寫。

本章更深入地探討AEM JSON模型API,以及如何將AEM元件公開的JSON內容作為prop自動插入到React元件中。

目標

  1. 瞭解如何將AEM元件對應至SPA元件。
  2. Inspect React元件如何使用從AEM傳遞的動態屬性。
  3. 瞭解如何立即使用React AEM Core Components

您將建置的內容

本章會檢查提供的Text SPA元件如何對應至AEM Text元件。 React核心元件(例如Image SPA元件)用於SPA並在AEM中編寫。 配置容器 ​和​ 範本編輯器 ​原則的現成功能也可用來建立外觀稍有變化的檢視。

章節範例最終製作

先決條件

檢閱設定本機開發環境所需的工具和指示。 本章是整合SPA章節的延續,但您只要遵循啟用SPA的AEM專案即可。

對應方法

基本概念是對應SPA元件至AEM元件。 AEM元件,執行伺服器端,將內容匯出為JSON模型API的一部分。 SPA會使用JSON內容,在瀏覽器中執行使用者端。 SPA元件和AEM元件之間會建立1:1對應。

將AEM元件對應到React元件的高階概觀

將AEM元件對應到React元件的高階概觀

Inspect文字元件

AEM專案原型提供對應至AEM 文字元件Text元件。 這是​ content ​元件的範例,它從AEM轉譯​ 內容

讓我們瞭解元件的運作方式。

Inspect JSON模型

  1. 在跳入SPA程式碼之前,請務必瞭解AEM提供的JSON模型。 導覽至核心元件庫,並檢視文字元件的頁面。 核心元件庫提供所有AEM核心元件的範例。

  2. 選取其中一個範例的​ JSON ​標籤:

    文字JSON模型

    您應該會看到三個屬性: textrichText:type

    :type是保留屬性,列出AEM元件的sling:resourceType (或路徑)。 :type的值是用來將AEM元件對應到SPA元件的值。

    textrichText是公開給SPA元件的其他屬性。

  3. http://localhost:4502/content/wknd-spa-react/us/en.model.json檢視JSON輸出。 您應該能夠找到類似以下的專案:

    code language-json
    "text": {
        "id": "text-a647cec03a",
        "text": "<p>Hello World! Updated content!</p>\r\n",
        "richText": true,
        ":type": "wknd-spa-react/components/text",
        "dataLayer": {}
       }
    

Inspect文字SPA元件

  1. 在您選擇的IDE中,開啟SPA的AEM專案。 展開ui.frontend模組並開啟ui.frontend/src/components/Text/Text.js下的檔案Text.js

  2. 我們將檢查的第一個區域是位於~第40行的class Text

    code language-js
    class Text extends Component {
    
        get richTextContent() {
            return (<div
                    id={extractModelId(this.props.cqPath)}
                    data-rte-editelement
                    dangerouslySetInnerHTML={{__html: DOMPurify.sanitize(this.props.text)}} />
                    );
        }
    
        get textContent() {
            return <div>{this.props.text}</div>;
        }
    
        render() {
            return this.props.richText ? this.richTextContent : this.textContent;
        }
    }
    

    Text是標準React元件。 元件使用this.props.richText來決定要呈現的內容是RTF文字還是純文字。 實際使用的「內容」來自this.props.text

    為避免潛在的XSS攻擊,在使用danguallySetInnerHTML轉譯內容之前,RTF會透過DOMPurify逸出。 在練習的前面重新叫用JSON模型中的richTexttext屬性。

  3. 接下來,開啟ui.frontend/src/components/import-components.js檢視~第86行的TextEditConfig

    code language-js
    const TextEditConfig = {
    emptyLabel: 'Text',
    
        isEmpty: function(props) {
            return !props || !props.text || props.text.trim().length < 1;
        }
    };
    

    上述程式碼負責決定何時在AEM製作環境中呈現預留位置。 如果isEmpty方法傳回​ true,則會轉譯預留位置。

  4. 最後檢視~第94行上的MapTo呼叫:

    code language-js
    export default MapTo('wknd-spa-react/components/text')(LazyTextComponent, TextEditConfig);
    

    MapTo由AEM SPA編輯器JS SDK (@adobe/aem-react-editable-components)提供。 路徑wknd-spa-react/components/text代表AEM元件的sling:resourceType。 此路徑與先前觀察到的JSON模型公開的:type相符。 MapTo負責剖析JSON模型回應,並將正確的值作為props傳遞給SPA元件。

    您可以在ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/text找到AEM Text元件定義。

使用React核心元件

AEM WCM元件 — React Core實施AEM WCM元件 — Spa編輯器 — React Core實施。 這是一組可重複使用的UI元件,對應至現成可用的AEM元件。 大部分專案都可重複使用這些元件,作為自身實施的起點。

  1. 在專案程式碼中,開啟位於ui.frontend/src/components的檔案import-components.js
    此檔案會匯入所有對應至SPA元件的AEM元件。 鑑於SPA Editor實作的動態性質,我們必須明確參考任何繫結至AEM可編寫元件的SPA元件。 這可讓AEM作者選擇在應用程式中隨處使用元件。

  2. 下列匯入陳述式包含寫入專案中的SPA元件:

    code language-js
    import './Page/Page';
    import './Text/Text';
    import './Container/Container';
    import './ExperienceFragment/ExperienceFragment';
    
  3. 有幾個來自@adobe/aem-core-components-react-spa@adobe/aem-core-components-react-base的其他imports。 這些匯入React Core元件,並用於目前專案。 然後使用MapTo將這些元件對應至專案特定的AEM元件,就像之前的Text元件範例一樣。

更新AEM原則

原則是AEM範本的一項功能,可讓開發人員和進階使用者精細控制可使用哪些元件。 React核心元件包含在SPA程式碼中,但必須先透過原則啟用,才能在應用程式中使用。

  1. 從AEM開始畫面導覽至​ 工具 > 範本 > WKND SPA React

  2. 選取並開啟​ SPA頁面 ​範本以進行編輯。

  3. 選取​ 配置容器,然後按一下它的​ 原則 ​圖示以編輯原則:

    配置容器原則

  4. 在​ 允許的元件 > WKND SPA React - Content >檢查​ 影像Teaser ​和​ 標題

    可用的已更新元件

    在​ 預設元件 > 新增對應 ​下並選擇​ 影像 — WKND SPA React - Content ​元件:

    設定預設元件

    輸入image/*的​ mime型別

    按一下​ 完成 ​以儲存原則更新。

  5. 在​ 配置容器 ​中,按一下​ 文字 ​元件的​ 原則 ​圖示。

    建立名稱為​ WKND SPA Text ​的新原則。 在​ 外掛程式 > 格式 >核取所有方塊以啟用其他格式選項:

    啟用RTE格式

    在​ 外掛程式 > 段落樣式 >下方,勾選方塊以​ 啟用段落樣式

    啟用段落樣式

    按一下​ 完成 ​以儲存原則更新。

作者內容

  1. 瀏覽至​ 首頁 http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html

  2. 您現在應該可以在頁面上使用其他元件​ ImageTeaser ​和​ Title

    其他元件

  3. 您也應該能夠編輯Text元件,並在​ 全熒幕 ​模式中新增其他段落樣式。

    全熒幕RTF編輯

  4. 您也應該能夠從​ 資產尋找器 ​拖放影像:

    拖放影像

  5. 使用​ Title ​和​ Teaser ​元件進行實驗。

  6. 透過AEM Assets新增您自己的影像,或安裝標準WKND參考網站完成的程式碼基底。 WKND參考網站包含許多可在WKND SPA上重複使用的影像。 可以使用AEM封裝管理員來安裝封裝。

    封裝管理員安裝wknd.all

Inspect配置容器

AEM SPA編輯器SDK會自動提供對​ 配置容器 ​的支援。 名稱所指示的​ 配置容器 ​是​ 容器 ​元件。 容器元件是接受JSON結構的元件,這些結構代表​ 其他 ​個元件並動態具現化它們。

讓我們進一步檢查配置容器。

  1. 在瀏覽器中導覽至http://localhost:4502/content/wknd-spa-react/us/en.model.json

    JSON模型API — 回應式格線

    配置容器 ​元件有wcm/foundation/components/responsivegridsling:resourceType,而且可由SPA編輯器使用:type屬性來辨識,就像TextImage元件一樣。

    SPA編輯器也提供使用配置模式重新調整元件大小的相同功能。

  2. 返回http://localhost:4502/editor.html/content/wknd-spa-react/us/en/home.html。 新增其他​ 影像 ​元件,然後嘗試使用​ 配置 ​選項重新調整其大小:

    使用版面配置模式重新調整影像大小

  3. 重新開啟JSON模型http://localhost:4502/content/wknd-spa-react/us/en.model.json,並觀察作為JSON一部分的columnClassNames

    欄類別名稱

    類別名稱aem-GridColumn--default--4表示元件應以12欄格線為4欄寬。 如需回應式格線的詳細資訊,請參閱此處

  4. 返回IDE,在ui.apps模組中有一個在ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/clientlibs/clientlib-grid定義的使用者端程式庫。 開啟檔案less/grid.less

    此檔案決定​ 配置容器 ​使用的中斷點(defaulttabletphone)。 此檔案旨在根據專案規格自訂。 目前中斷點設定為1200px768px

  5. 您應該能夠使用Text元件的回應式功能和更新的RTF原則來編寫如下的檢視:

    章節範例最終製作

恭喜! congratulations

恭喜,您已瞭解如何將SPA元件對應至AEM Components,並且您已使用React Core Components。 您也有機會探索​ 配置容器 ​的回應式功能。

後續步驟 next-steps

導覽及路由 — 瞭解如何使用SPA編輯器SDK對應至AEM頁面,以支援SPA中的多個檢視。 動態導覽是使用React Router和React Core Components來實施。

(額外優點)將組態保留至原始檔控制 bonus-configs

在許多情況下,尤其是在AEM專案開始時,將設定(例如範本和相關內容原則)保留到原始檔控制中很有價值。 這可確保所有開發人員都針對相同的內容和設定集,且可確保環境之間有額外的一致性。 一旦專案達到一定的成熟度,管理範本的實務就可以交給特殊的超級使用者群組。

後續幾個步驟將使用Visual Studio Code IDE和VSCode AEM Sync進行,但可能會使用任何工具和您已設定為從AEM本機執行個體​ 提取 ​或​ 匯入 ​內容的任何IDE來執行。

  1. 在Visual Studio Code IDE中,確定您已透過Marketplace擴充功能安裝​ VSCode AEM Sync

    VSCode AEM Sync

  2. 展開專案總管中的​ ui.content ​模組,並導覽至/conf/wknd-spa-react/settings/wcm/templates

  3. 按一下滑鼠右鍵 templates資料夾並選取​ 從AEM伺服器匯入

    VSCode匯入範本

  4. 重複步驟以匯入內容,但選取位於/conf/wknd-spa-react/settings/wcm/templates/policies的​ 原則 ​資料夾。

  5. Inspect位於ui.content/src/main/content/META-INF/vault/filter.xmlfilter.xml檔案。

    code language-xml
    <!--ui.content filter.xml-->
    <?xml version="1.0" encoding="UTF-8"?>
     <workspaceFilter version="1.0">
         <filter root="/conf/wknd-spa-react" mode="merge"/>
         <filter root="/content/wknd-spa-react" mode="merge"/>
         <filter root="/content/dam/wknd-spa-react" mode="merge"/>
         <filter root="/content/experience-fragments/wknd-spa-react" mode="merge"/>
     </workspaceFilter>
    

    filter.xml檔案負責識別隨套件安裝的節點路徑。 請注意每個篩選器上的mode="merge",這表示現有內容將不會被修改,只會新增內容。 由於內容作者可能正在更新這些路徑,因此程式碼部署​ 不會 ​覆寫內容非常重要。 請參閱FileVault檔案,以取得使用篩選元素的詳細資訊。

    比較ui.content/src/main/content/META-INF/vault/filter.xmlui.apps/src/main/content/META-INF/vault/filter.xml,瞭解每個模組所管理的不同節點。

(額外練習)建立自訂影像元件 bonus-image

React Core元件已提供SPA影像元件。 不過,如果您需要額外的練習,請建立您自己的React實作,該實作對應到AEM 影像元件Image元件是​ content ​元件的另一個範例。

Inspect和JSON

在跳入SPA程式碼之前,請檢查AEM提供的JSON模型。

  1. 導覽至核心元件庫🔗中的影像範例。

    影像核心元件JSON

    srcalttitle的屬性是用來填入SPA Image元件。

    note note
    NOTE
    有其他公開的影像屬性(lazyEnabledwidths)可讓開發人員建立最適化且延遲載入的元件。 此教學課程中建置的元件非常簡單,不會 ​使用這些進階屬性。

實作影像元件

  1. 接下來,在ui.frontend/src/components下建立名為Image的新資料夾。

  2. Image資料夾下方建立名為Image.js的新檔案。

    Image.js檔案

  3. 將下列import陳述式新增至Image.js

    code language-js
    import React, {Component} from 'react';
    import {MapTo} from '@adobe/aem-react-editable-components';
    
  4. 然後新增ImageEditConfig以決定何時在AEM中顯示預留位置:

    code language-js
    export const ImageEditConfig = {
    
        emptyLabel: 'Image',
    
        isEmpty: function(props) {
            return !props || !props.src || props.src.trim().length < 1;
        }
    };
    

    如果未設定src屬性,則會顯示預留位置。

  5. 下一個實作Image類別:

    code language-js
     export default class Image extends Component {
    
        get content() {
            return <img     className="Image-src"
                            src={this.props.src}
                            alt={this.props.alt}
                            title={this.props.title ? this.props.title : this.props.alt} />;
        }
    
        render() {
            if(ImageEditConfig.isEmpty(this.props)) {
                return null;
            }
    
            return (
                    <div className="Image">
                        {this.content}
                    </div>
            );
        }
    }
    

    上述程式碼將根據JSON模型傳入的prop srcalttitle呈現<img>

  6. 新增MapTo程式碼以將React元件對應至AEM元件:

    code language-js
    MapTo('wknd-spa-react/components/image')(Image, ImageEditConfig);
    

    請注意,字串wknd-spa-react/components/image對應至ui.apps中AEM元件的位置: ui.apps/src/main/content/jcr_root/apps/wknd-spa-react/components/image

  7. 在相同目錄中建立名為Image.css的新檔案,並新增下列專案:

    code language-scss
    .Image-src {
        margin: 1rem 0;
        width: 100%;
        border: 0;
    }
    
  8. Image.js中,在import陳述式下方的頂端加入檔案參考:

    code language-js
    import React, {Component} from 'react';
    import {MapTo} from '@adobe/aem-react-editable-components';
    
    require('./Image.css');
    
  9. 開啟檔案ui.frontend/src/components/import-components.js並新增新Image元件的參考:

    code language-js
    import './Page/Page';
    import './Text/Text';
    import './Container/Container';
    import './ExperienceFragment/ExperienceFragment';
    import './Image/Image'; //add reference to Image component
    
  10. import-components.js中註解React核心元件影像:

    code language-js
    //MapTo('wknd-spa-react/components/image')(ImageV2, {isEmpty: ImageV2IsEmptyFn});
    

    這將確保改用我們的自訂影像元件。

  11. 從專案的根使用Maven將SPA程式碼部署到AEM:

    code language-shell
    $ cd aem-guides-wknd-spa.react
    $ mvn clean install -PautoInstallSinglePackage
    
  12. 在AEM中Inspect SPA。 頁面上的任何影像元件都應繼續運作。 Inspect呈現的輸出結果,您應該會看到自訂影像元件的標籤,而不是React核心元件。

    自訂影像元件標籤

    code language-html
    <div class="Image">
        <img class="Image-src" src="/content/image-src.jpg">
    </div>
    

    React核心元件影像標籤

    code language-html
    <div class="cmp-image cq-dd-image">
        <img src="/content/image-src.jpg" class="cmp-image__image">
    </div>
    

    這是擴充及實作您自己的元件的絕佳簡介。

recommendation-more-help
e25b6834-e87f-4ff3-ba56-4cd16cdfdec4