Aangepaste template versus Custom code-blok
- Een aangepaste template vervangt de rendering van een bestaand blok door je eigen markup, en geeft je de eigen gegevens van dat blok (de titel en het aantal items van de Header, de totalen van de Summary, enzovoort). Het voegt niets nieuws toe; het herstylet één blok.
- Het Custom code-blok voegt een nieuw blok toe met willekeurige HTML of React, overal in de cart.
Een aangepaste template gebruiken
- Selecteer een blok in de editor en open het tabblad Code.
- Bewerk de standaardtemplate. Aangepaste templates zijn alleen JSX (de keuze tussen HTML en JSX is exclusief voor het Custom code-blok).
- Klik op Compile. Compileren verwijdert de types en transpileert de JSX, dus het vangt syntaxfouten af. Typefouten stoppen een compile niet — de editor markeert die inline terwijl je typt, met dezelfde IntelliSense die de props van het blok automatisch aanvult.
- Zet de template aan zodat de cart deze gebruikt in plaats van de ingebouwde rendering.
- Reset to default herstelt op elk moment de oorspronkelijke template van het blok.
Een template schrijven met AI
- De compileregels (één expressie, geen
export default, geen imports) - De exacte props die het blok ontvangt, overeenkomend met wat de IntelliSense van de editor toont
- De vergrendelde functiesignatuur die de editor afdwingt
- Blokspecifieke regels (geldformaten, welke handlers je moet koppelen, toegankelijkheidsvereisten)
- Een invulsectie waar je je huidige template plakt en de gewenste wijziging beschrijft
De prompt is specifiek per blok. De knop Copy AI prompt verschijnt alleen op blokken die aangepaste templates ondersteunen.
Wat je template vervangt
Wat je behoudt: de positie van het blok in de cart, de zichtbaarheidsschakelaar, de instellingen (die nog steeds de props voeden die je ontvangt), het Custom CSS-paneel van de cart, en de ingebouwde laad-skeleton.
Dat laatste verrast mensen. Het blok controleert of de cart nog aan het laden is voordat het je template bereikt, dus de ingebouwde skeleton rendert tijdens het laden en je template draait pas zodra de cart klaar is. Je hoeft geen laadstatus te bouwen.
Wat er beschikbaar is binnen een template
- Je krijgt vijf hooks:
useState,useEffect,useMemo,useRefenuseCallback. PlusFragment, voor<>…</>. - Er zijn geen imports. Je kunt niets
importen, en er is geenReact-object beschikbaar, dus geenReact.useReducer, geenReact.Children. Als een hook niet in de bovenstaande lijst staat, is hij niet beschikbaar. - Props zijn alleen-lezen. Een prop muteren doet niets nuttigs. Om de cart te wijzigen, gebruik je de handler-props die het blok je geeft (
onClose,increment,selectPlan, enzovoort) in plaats van direct naar props te schrijven. windowis bereikbaar, dus een template kan de Cart SDK aanroepen viawindow.aftersell.cartwanneer het iets nodig heeft dat de props van het blok niet dekken.
Conventies voor elk blok
*Html-props zijn vooraf gesaneerde rich text. Render ze metdangerouslySetInnerHTML. Ze zijn al door de sanitizer van de cart gegaan, en merchant-tokens zoals{{total_price}}zijn al ingevuld.- Prijzen die als
stringbinnenkomen, zijn al geformatteerd in het geldformaat van de winkel. Prijzen alsnumberzijn in centen. Een blok geeft je het een of het ander, en de tabel van elk blok vermeldt welke. isLoadingis altijdfalsebinnen een template. Het blok rendert zijn ingebouwde skeleton en roept je template pas aan zodra de cart is geladen, dus de prop wordt voor de volledigheid meegegeven en niet om op te vertakken.
Een paar blokken renderen in bepaalde statussen helemaal niets, zodat je template nooit met lege data wordt aangeroepen. De Rewards-template ziet nooit een lege
milestones, en de Subscription upgrade-template ziet nooit een null view. De referentie van elk blok vermeldt waar dit van toepassing is, zodat je de lege-status-vertakking kunt overslaan.Een aangepaste template stylen
De twee class-families
Dus
cart-internal-header__title is wat de titel eruit laat zien als de ingebouwde titel, en cart-external-header__title is het handvat dat je moet vastpakken wanneer je het uiterlijk wilt veranderen.
Kleine wijzigingen: behoud beide classnames
cart-external-*-haakjes.
Herstructureren: laat beide classnames vallen
cart-internal-* vallen omdat de ingebouwde CSS voor de ingebouwde DOM is geschreven. Houd die classes op geherstructureerde markup en je erft lay-outregels die uitgaan van elementen die je niet meer hebt: flex-containers die andere kinderen verwachten, spacing tussen verplaatste elementen, positionering ten opzichte van iets dat je hebt verwijderd. Dit uit zich meestal als je eigen CSS die “niet werkt” terwijl de ingebouwde regels winnen.
Twee manieren om te stylen wat je hebt gebouwd:
Optie 1: je eigen classnames plus Custom CSS
.header of .title een botsing met de eigen classes van de cart, de template van een andere app of een toekomstig blok.
Optie 2: inline styles
:hover of andere pseudo-classes, geen media queries, en geen hergebruik over blokken heen. Grijp naar Optie 1 zodra je een van die dingen wilt.
Een aanpak kiezen
De cart rendert in een shadow root, dus de stylesheet van je thema kan er niet in reiken. Styles voor een aangepaste template moeten komen van het eigen Custom CSS-paneel van de cart of van inline styles, niet van je thema. Zie Aangepaste CSS.
Wanneer een template faalt
Omdat het blok stilletjes verdwijnt in plaats van zichtbaar een fout te geven, controleer je een template altijd in de voorvertoning voordat je publiceert. Als een blok is verdwenen, open dan eerst de browserconsole.
Twee dingen om op te letten, omdat beide een template laten crashen die anders veronderstelt:
- Nullable props. Veel props zijn
nullonder normale omstandigheden (logoUrlzonder logo,imageUrlzonder afbeelding,variantTitlebij een product met één variant). Controleer voordat je ze gebruikt. - Arrays die leeg kunnen zijn.
discountTagsendiscountCodeszijn vaker wel dan niet[].
Beperkingen
- Aangepaste templates zijn weergave-overrides. Om logica op de cart uit te voeren (abonneren op events, items toevoegen, reageren op wijzigingen), gebruik je Aangepaste scripts en de Cart SDK.
- Bijna elk blok ondersteunt er een. De uitzonderingen zijn het Express payments-blok, dat Shopify’s eigen betaalknoppen host, en de Cart items-container zelf, hoewel de Product-rij erbinnen wél een aangepaste template ondersteunt.
- Een template kan niet veranderen wat een blok fundamenteel doet. Het verandert hoe de gegevens van het blok worden gepresenteerd, niet de gegevens of het gedrag erachter.
Props per blok
Het Custom code-blok is het enige vlak dat markup toevoegt in plaats van de rendering van een blok te vervangen, dus zijn props zijn anders: de hele cart, plus een add-to-cart-actie. Zie Custom code-blokken → Props.