了解如何使用SPA Editor SDK對應至AEM頁面,以支援SPA中的多個檢視。 動態導航是使用React Router和React Core Components實現的。
本章將新增導覽至AEM中的SPA。 導覽功能表將由AEM頁面階層驅動,且會使用導覽核心元件提供的JSON模型。
查看設定本地開發環境所需的工具和說明。 本章是映射元件章節的繼續,但是,您只需要部署至本機AEM例項的SPA啟用AEM專案,便能順利完成。
開啟瀏覽器並登入AEM, http://localhost:4502/。 應已部署起始代碼庫。
導覽至SPA頁面範本:http://localhost:4502/editor.html/conf/wknd-spa-react/settings/wcm/templates/spa-page-template/structure.html。
選擇最外層根佈局容器,然後按一下其策略表徵圖。 請留意不以選取版面容器未鎖定以供編寫。
建立名為SPA Structure的新策略:
在「允許的元件」>「一般」下,選擇「佈局容器」元件。
在允許的元件 > WKND SPA REACT - STRUCTURE下,選擇導航元件:
在「允許的元件 > WKND SPA REACT — 內容」下,選擇Image和Text元件。 您應選取總計4個元件。
按一下Done以儲存變更。
重新整理頁面,並在取消鎖定的配置容器上方新增Navigation元件:
選擇導航元件,然後按一下其策略表徵圖以編輯策略。
使用SPA導航的策略標題建立新策略。
在Properties下:
/content/wknd-spa-react/us/en
。這將收集/content/wknd-spa-react/us/en
下方深處的導覽2層。
儲存變更後,範本中應該會顯示已填入的Navigation
:
接下來,在AEM中建立其他頁面,作為SPA中的不同檢視。 我們也會檢查AEM提供的JSON模型的階層結構。
導覽至Sites主控台:http://localhost:4502/sites.html/content/wknd-spa-react/us/en/home。 選擇WKND SPA React首頁,然後按一下Create > Page:
在Template下,選擇SPA Page。 在Properties下,以Title和page-1為名稱輸入Page 1。
按一下建立,然後在對話方塊快顯視窗中,按一下開啟以在AEM SPA編輯器中開啟頁面。
將新的Text元件添加到主佈局容器中。 編輯元件並輸入文本:使用RTE和 H2 元素的第1頁。
您可以隨意新增其他內容,例如影像。
返回AEM Sites主控台,並重複上述步驟,建立名為Page 2的第二個頁面,作為Page 1的同層級。
最後,建立第三個頁面,第3頁,但作為第2頁的子。 完成網站階層後,應如下所示:
導覽元件現在可用來導覽至SPA的不同區域。
在AEM編輯器外部開啟頁面:http://localhost:4502/content/wknd-spa-react/us/en/home.html。 使用導覽元件來導覽至應用程式的不同檢視。
在您導覽時,使用瀏覽器的開發人員工具來檢查網路請求。 以下螢幕擷取畫面是從Google Chrome瀏覽器擷取。
請注意,在初始頁面載入後,後續導覽不會導致完整頁面重新整理,且當返回至先前造訪的頁面時,網路流量會最小化。
接下來,檢查可帶來SPA多檢視體驗的JSON模型。
在新索引標籤中,開啟AEM提供的JSON模型API:http://localhost:4502/content/wknd-spa-react/us/en.model.json。 使用瀏覽器擴充功能將格式化為JSON可能會很有幫助。
首次載入SPA時,會要求此JSON內容。 外部結構如下所示:
{
"language": "en",
"title": "en",
"templateName": "spa-app-template",
"designPath": "/libs/settings/wcm/designs/default",
"cssClassNames": "spa page basicpage",
":type": "wknd-spa-react/components/spa",
":items": {},
":itemsOrder": [],
":hierarchyType": "page",
":path": "/content/wknd-spa-react/us/en",
":children": {
"/content/wknd-spa-react/us/en/home": {},
"/content/wknd-spa-react/us/en/home/page-1": {},
"/content/wknd-spa-react/us/en/home/page-2": {},
"/content/wknd-spa-react/us/en/home/page-2/page-3": {}
}
}
在:children
下,應該會看到每個已建立頁面的項目。 所有頁面的內容都位於此初始JSON要求中。 使用導覽路由,後續的SPA檢視將會快速載入,因為內容已在用戶端提供。
在初始JSON要求中載入SPA內容的ALL並不明智,因為這會減緩初始頁面載入速度。 接下來,我們將查看頁面階層深度的收集方式。
導覽至SPA根範本:http://localhost:4502/editor.html/conf/wknd-spa-react/settings/wcm/templates/spa-app-template/structure.html。
按一下頁面屬性功能表 > 頁面原則:
SPA根範本有額外的階層結構標籤,可控制收集的JSON內容。 「結構深度」決定了網站階層中的深度,以收集根下方的子頁面。 您也可以使用結構模式欄位,根據規則運算式篩除其他頁面。
將結構深度更新為2:
按一下Done以保存對策略的更改。
重新開啟JSON模型http://localhost:4502/content/wknd-spa-react/us/en.model.json。
{
"language": "en",
"title": "en",
"templateName": "spa-app-template",
"designPath": "/libs/settings/wcm/designs/default",
"cssClassNames": "spa page basicpage",
":type": "wknd-spa-react/components/spa",
":items": {},
":itemsOrder": [],
":hierarchyType": "page",
":path": "/content/wknd-spa-react/us/en",
":children": {
"/content/wknd-spa-react/us/en/home": {},
"/content/wknd-spa-react/us/en/home/page-1": {},
"/content/wknd-spa-react/us/en/home/page-2": {}
}
}
注意Page 3路徑已移除:/content/wknd-spa-react/us/en/home/page-2/page-3
。 這是因為頁面3位於階層中的第3層,我們更新了原則,僅包含最大深度為第2層的內容。
重新開啟SPA首頁:http://localhost:4502/content/wknd-spa-react/us/en/home.html並開啟瀏覽器的開發人員工具。
重新整理頁面,您應該會看到/content/wknd-spa-react/us/en.model.json
(即SPA根)的XHR請求。 請注意,根據先前在教學課程中對SPA根範本進行的階層深度設定,僅包含三個子頁面。 這不包括第3頁。
開啟開發人員工具後,使用Navigation
元件直接導覽至第3頁:
請注意,系統已對下列項目提出新的XHR請求:/content/wknd-spa-react/us/en/home/page-2/page-3.model.json
AEM Model Manager了解JSON內容不可用,並自動觸發其他XHR要求。
直接導覽至:http://localhost:4502/content/wknd-spa-react/us/en/home/page-2.html。 另請注意,瀏覽器的返回按鈕可繼續運作。
導航和路由採用React Router實現。 React Router是React應用程式的導航元件集合。 AEM React核心 元件使用React Router的功能來實 施前述步驟中使用的Navigation元件。
接下來,檢查React Router與SPA的整合情況,並使用React Router的Link元件進行實驗。
在IDE中,在ui.frontend/src/index.js
處開啟檔案index.js
。
/* index.js */
import { Router } from 'react-router-dom';
...
...
ModelManager.initialize().then(pageModel => {
const history = createBrowserHistory();
render(
<Router history={history}>
<App
history={history}
cqChildren={pageModel[Constants.CHILDREN_PROP]}
cqItems={pageModel[Constants.ITEMS_PROP]}
cqItemsOrder={pageModel[Constants.ITEMS_ORDER_PROP]}
cqPath={pageModel[Constants.PATH_PROP]}
locationPathname={window.location.pathname}
/>
</Router>,
document.getElementById('spa-root')
);
});
注意App
被包在React Router的Router
元件中。 ModelManager
由AEM SPA Editor JS SDK提供,會根據JSON模型API將動態路由新增至AEM頁面。
在ui.frontend/src/components/Page/Page.js
開啟檔案Page.js
class AppPage extends Page {
get containerProps() {
let attrs = super.containerProps;
attrs.className =
(attrs.className || '') + ' page ' + (this.props.cssClassNames || '');
return attrs;
}
}
export default MapTo('wknd-spa-react/components/page')(
withComponentMappingContext(withRoute(AppPage))
);
Page
SPA元件使用MapTo
函式將AEM中的Pages對應至對應的SPA元件。 withRoute
公用程式可協助根據cqPath
屬性以動態方式將SPA路由至適當的AEM子頁面。
在ui.frontend/src/components/Header/Header.js
開啟Header.js
元件。
更新Header
以將Link中的<h1>
標籤包裝到首頁:
//Header.js
import React, {Component} from 'react';
+ import {Link} from 'react-router-dom';
require('./Header.css');
export default class Header extends Component {
render() {
return (
<header className="Header">
<div className="Header-container">
+ <Link to="/content/wknd-spa-react/us/en/home.html">
<h1>WKND</h1>
+ </Link>
</div>
</header>
);
}
我們不使用React Router提供的預設<a>
錨點標籤,而是使用<Link>
。 只要to=
指向有效的路由,SPA就會切換到該路由,而not會執行完整的頁面刷新。 在此,我們只需將首頁的連結硬式編碼,以說明Link
的使用方式。
在ui.frontend/src/App.test.js
更新測試。App.test.js
+ import { BrowserRouter as Router } from 'react-router-dom';
import App from './App';
it('renders without crashing', () => {
const div = document.createElement('div');
- ReactDOM.render(<App />, div);
+ ReactDOM.render(<Router><App /></Router>, div);
});
由於我們在App.js
中引用的靜態元件內使用React Router的功能,因此需要更新單元測試以考慮該功能。
開啟終端機,導覽至專案的根目錄,並使用您的Maven技能將專案部署至AEM:
$ cd aem-guides-wknd-spa.react
$ mvn clean install -PautoInstallSinglePackage
導覽至AEM中SPA的其中一個頁面:http://localhost:4502/content/wknd-spa-react/us/en/home/page-1.html
請使用Header
中的連結,而非使用Navigation
元件進行導覽。
請注意,已觸發完整頁面重新整理為not,且SPA路由正在運作。
或者,使用標準<a>
錨點標籤來實驗Header.js
檔案:
<a href="/content/wknd-spa-react/us/en/home.html">
<h1>WKND</h1>
</a>
這有助於說明SPA路由與一般網頁連結之間的差異。
恭喜您,您已了解如何使用SPA Editor SDK對應至AEM頁面,以支援SPA中的多個檢視。 動態導航已使用React Router實現,並添加到Header
元件中。