Lägga till navigering och routning navigation-routing

Lär dig hur flera vyer i SPA kan användas genom att mappa till AEM sidor med SPA Editor SDK. Dynamisk navigering implementeras med React Router och React Core Components.

Syfte

  1. Förstå de alternativ för SPA modellroutning som är tillgängliga när du använder SPA Editor.
  2. Lär dig att använda Reaktionsrouter för att navigera mellan olika vyer av SPA.
  3. Använd AEM React Core Components för att implementera en dynamisk navigering som styrs av den AEM sidhierarkin.

Vad du ska bygga

I det här kapitlet läggs navigering till i en SPA i AEM. Navigeringsmenyn styrs av AEM sidhierarki och den JSON-modell som finns i kärnkomponenten för navigering används.

Navigering har lagts till

Förutsättningar

Granska de verktyg och instruktioner som krävs för att konfigurera en lokal utvecklingsmiljö. Det här kapitlet är en fortsättning på kapitlet Mappa komponenter, men för att följa med i allt du behöver finns ett SPA-aktiverat AEM-projekt som distribueras till en lokal AEM.

Lägg till navigeringen i mallen add-navigation-template

  1. Öppna en webbläsare och logga in på AEM, http://localhost:4502/. Startkodbasen ska redan distribueras.

  2. Navigera till SPA sidmall: http://localhost:4502/editor.html/conf/wknd-spa-react/settings/wcm/templates/spa-page-template/structure.html.

  3. Markera den yttre rotlayoutbehållaren och klicka på ikonen Princip . Var försiktig så att inte layoutbehållaren inte är låst för redigering.

    Välj ikon för rotlayoutbehållarprincipen

  4. Skapa en ny princip med namnet SPA Struktur:

    SPA Strukturprincip

    Välj komponenten Layoutbehållare under Tillåtna komponenter > Allmänt >.

    Under Tillåtna komponenter > WKND SPA REACT - STRUKTUR > väljer du komponenten Navigation:

    Välj navigeringskomponent

    Under Tillåtna komponenter > WKND SPA REACT - Innehåll > markerar du komponenterna Bild och Text. Du bör välja totalt 4 komponenter.

    Klicka på Klar för att spara ändringarna.

  5. Uppdatera sidan och lägg till komponenten Navigation ovanför den olåsta layoutbehållaren:

    lägg till navigeringskomponent i mall

  6. Markera navigeringskomponenten och klicka på dess princip-ikon för att redigera profilen.

  7. Skapa en ny princip med en principtitelSPA Navigering.

    Under Egenskaper:

    • Ange Navigeringsrot till /content/wknd-spa-react/us/en.
    • Ange Uteslut rotnivåer till 1.
    • Avmarkera Samla in alla underordnade sidor.
    • Ange Navigeringsstrukturdjupet till 3.

    Konfigurera navigeringsprincip

    Detta samlar in navigering 2 nivåer under /content/wknd-spa-react/us/en.

  8. När du har sparat dina ändringar bör du se det ifyllda Navigation som en del av mallen:

    Populerad navigeringskomponent

Skapa underordnade sidor

Skapa sedan ytterligare sidor i AEM som ska fungera som de olika vyerna i SPA. Vi kommer också att inspektera den hierarkiska strukturen i JSON-modellen som AEM tillhandahåller.

  1. Gå till konsolen Platser: http://localhost:4502/sites.html/content/wknd-spa-react/us/en/home. Markera WKND SPA React Home Page och klicka på Create > Page:

    Skapa ny sida

  2. Under Mall väljer du SPA sida. Under Egenskaper anger du Sida 1 som namn för Titel och sida-1.

    Ange egenskaperna för den inledande sidan

    Klicka på Skapa och klicka på Öppna i popup-dialogrutan för att öppna sidan i AEM SPA.

  3. Lägg till en ny Text-komponent i huvudlayoutbehållaren. Redigera komponenten och ange texten: Sida 1 med RTE och elementet H2 .

    Exempel på innehåll, sida 1

    Du kan lägga till ytterligare innehåll, som en bild.

  4. Gå tillbaka till AEM Sites-konsolen och upprepa stegen ovan, och skapa en andra sida med namnet Sida 2 som motsvarar sidan 1.

  5. Skapa slutligen en tredje sida, Sida 3, men som underordnad till sida 2. När webbplatshierarkin är klar ska den se ut så här:

    Exempel på webbplatshierarki

  6. Navigeringskomponenten kan nu användas för att navigera till olika delar av SPA.

    Navigering och routning

  7. Öppna sidan utanför AEM: http://localhost:4502/content/wknd-spa-react/us/en/home.html. Använd komponenten Navigation för att navigera till olika vyer av programmet.

  8. Använd webbläsarens utvecklarverktyg för att inspektera nätverksförfrågningar när du navigerar. Skärmbilder nedan hämtas från Google Chrome webbläsare.

    Observera nätverksbegäranden

    Observera att efter den första sidinläsningen kommer efterföljande navigering inte att orsaka en uppdatering av hela sidan och att nätverkstrafiken minimeras när du återgår till tidigare besökta sidor.

JSON-modell för hierarkisida hierarchy-page-json-model

Kontrollera sedan den JSON-modell som driver SPA upplevelse av flera vyer.

  1. På en ny flik öppnar du JSON-modell-API:t som tillhandahålls av AEM: http://localhost:4502/content/wknd-spa-react/us/en.model.json. Det kan vara praktiskt att använda ett webbläsartillägg för att formatera JSON.

    Detta JSON-innehåll begärs när SPA läses in första gången. Den yttre strukturen ser ut så här:

    code language-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": {}
       }
    }
    

    Under :children ska du se en post för varje sida som skapas. Innehållet för alla sidor finns i den här inledande JSON-begäran. Med navigeringsroutningen läses efterföljande vyer av SPA in snabbt eftersom innehållet redan är tillgängligt på klientsidan.

    Det är inte klokt att läsa in ALL av innehållet i en SPA i den inledande JSON-begäran, eftersom det skulle göra den inledande sidinläsningen långsammare. Sedan ska vi titta på hur sidornas hierarkidjup samlas in.

  2. Gå till mallen SPA Root på: http://localhost:4502/editor.html/conf/wknd-spa-react/settings/wcm/templates/spa-app-template/structure.html.

    Klicka på menyn Sidegenskaper > Sidprofil:

    Öppna sidprincipen för SPA

  3. Mallen SPA Root har en extra hierarkisk struktur-flik som styr JSON-innehållet som samlas in. Strukturdjupet avgör hur djupt i platshierarkin underordnade sidor ska samlas under rotmappen. Du kan också använda fältet Strukturmönster för att filtrera bort ytterligare sidor baserat på ett reguljärt uttryck.

    Uppdatera strukturdjupet till :

    Uppdatera strukturdjup

    Klicka på Klar om du vill spara ändringarna i profilen.

  4. Öppna JSON-modellen http://localhost:4502/content/wknd-spa-react/us/en.model.json igen.

    code language-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": {}
       }
    }
    

    Observera att sökvägen Sidan 3 har tagits bort: /content/wknd-spa-react/us/en/home/page-2/page-3 från den ursprungliga JSON-modellen. Detta beror på att sidan 3 är på nivå 3 i hierarkin och att vi har uppdaterat principen så att endast innehåll med maximalt djup på nivå 2 inkluderas.

  5. Öppna SPA startsida igen: http://localhost:4502/content/wknd-spa-react/us/en/home.html och öppna webbläsarens utvecklingsverktyg.

    Uppdatera sidan så ska du se XHR-begäran till /content/wknd-spa-react/us/en.model.json, som är SPA. Observera att endast tre underordnade sidor inkluderas baserat på hierarkidjupets konfiguration till SPA rotmall som skapades tidigare i självstudiekursen. Detta inkluderar inte sidan 3.

    Initial JSON-begäran - SPA

  6. När utvecklingsverktygen är öppna använder du komponenten Navigation för att navigera direkt till sidan 3:

    Observera att en ny XHR-begäran görs till: /content/wknd-spa-react/us/en/home/page-2/page-3.model.json

    Sidan tre XHR-begäran

    Den AEM modellhanteraren förstår att JSON-innehållet Sidan 3 inte är tillgängligt och utlöser automatiskt den ytterligare XHR-begäran.

  7. Experimentera med djupa länkar genom att navigera direkt till: http://localhost:4502/content/wknd-spa-react/us/en/home/page-2.html. Tänk också på att webbläsarens bakåtknapp fortsätter att fungera.

Inspect React Routing react-routing

Navigering och routning implementeras med Reaktionsrouter. React Router är en samling navigeringskomponenter för React-program. AEM React Core Components använder funktioner i React Router för att implementera komponenten Navigation som användes i föregående steg.

Kontrollera sedan hur React Router är integrerat med SPA och experimentera med React Routers Link -komponent.

  1. I IDE öppnar du filen index.js vid ui.frontend/src/index.js.

    code language-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')
        );
    });
    

    Observera att App är omsluten i komponenten Router från React Router. ModelManager, som tillhandahålls av AEM JS SDK-redigeraren för SPA, lägger till dynamiska vägar till AEM sidor baserat på JSON-modellens API.

  2. Öppna filen Page.js vid ui.frontend/src/components/Page/Page.js

    code language-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))
    );
    

    Komponenten Page SPA använder funktionen MapTo för att mappa sidor i AEM till en motsvarande SPA. Verktyget withRoute hjälper till att dynamiskt dirigera SPA till rätt AEM underordnad sida baserat på egenskapen cqPath.

  3. Öppna komponenten Header.jsui.frontend/src/components/Header/Header.js.

  4. Uppdatera Header för att kapsla in taggen <h1> i en länk på startsidan:

    code language-diff
      //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>
            );
        }
    

    I stället för att använda standardankartaggen <a> använder vi <Link> som tillhandahålls av React Router. Så länge som to= pekar på en giltig väg, kommer SPA att växla till den vägen och inte utföra en uppdatering av hela sidan. Här kan vi helt enkelt hårdkoda länken till hemsidan för att visa hur Link används.

  5. Uppdatera testet App.test.js ui.frontend/src/App.test.js.

    code language-diff
    + 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);
      });
    

    Eftersom vi använder funktionerna i React Router i en statisk komponent som refereras i App.js måste vi uppdatera enhetstestet för att ta hänsyn till det.

  6. Öppna en terminal, navigera till projektets rot och distribuera projektet till AEM med dina Maven-kunskaper:

    code language-shell
    $ cd aem-guides-wknd-spa.react
    $ mvn clean install -PautoInstallSinglePackage
    
  7. Navigera till en av sidorna i SPA i AEM: http://localhost:4502/content/wknd-spa-react/us/en/home/page-1.html

    Använd länken i Header i stället för att använda komponenten Navigation för att navigera.

    Huvudlänk

    Observera att en uppdatering av hela sidan har inte utlösts och att SPA fungerar.

  8. Du kan också experimentera med filen Header.js med en <a> -ankartagg som standard:

    code language-js
    <a href="/content/wknd-spa-react/us/en/home.html">
        <h1>WKND</h1>
    </a>
    

    Detta kan illustrera skillnaden mellan SPA och vanliga länkar på webbsidor.

Grattis! congratulations

Grattis! Du har lärt dig hur flera vyer i SPA kan användas genom att mappa till AEM sidor med SPA Editor SDK. Dynamisk navigering har implementerats med React Router och lagts till i komponenten Header.

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