Benutzerdefiniertes Template vs. Custom-Code-Block
- Ein benutzerdefiniertes Template ersetzt das Rendering eines vorhandenen Blocks durch dein eigenes Markup und übergibt dir die Daten dieses Blocks (den Titel und die Artikelanzahl des Headers, die Summen der Summary und so weiter). Es fügt nichts Neues hinzu; es gestaltet einen Block neu.
- Der Custom code-Block fügt einen neuen Block mit beliebigem HTML oder React an einer beliebigen Stelle im Warenkorb hinzu.
Ein benutzerdefiniertes Template verwenden
- Wähle einen Block im Editor aus und öffne seinen Code-Tab.
- Bearbeite das Standard-Template. Benutzerdefinierte Templates sind nur JSX (die Wahl zwischen HTML und JSX gibt es ausschließlich beim Custom-Code-Block).
- Klicke auf Compile. Das Kompilieren entfernt die Typen und transpiliert das JSX, sodass es Syntax-Fehler abfängt. Typfehler verhindern das Kompilieren nicht — der Editor markiert sie inline beim Tippen, mit derselben IntelliSense, die die Props des Blocks automatisch vervollständigt.
- Aktiviere das Template, damit der Warenkorb es anstelle des integrierten Renderings verwendet.
- Reset to default stellt das ursprüngliche Template des Blocks jederzeit wieder her.
Ein Template mit KI schreiben
- Die Compile-Regeln (ein einzelner Ausdruck, kein
export default, keine Imports) - Die exakten Props, die der Block erhält, passend zu dem, was die IntelliSense des Editors anzeigt
- Die gesperrte Funktionssignatur, die der Editor erzwingt
- Blockspezifische Regeln (Geldformate, welche Handler zu verdrahten sind, Barrierefreiheitsanforderungen)
- Einen Ausfüllbereich, in den du dein aktuelles Template einfügst und die gewünschte Änderung beschreibst
Der Prompt ist für jeden Block spezifisch. Der Copy AI prompt-Button erscheint nur bei Blöcken, die benutzerdefinierte Templates unterstützen.
Was dein Template ersetzt
Was du behältst: die Position des Blocks im Warenkorb, seinen Sichtbarkeits-Toggle, seine Einstellungen (die weiterhin die Props speisen, die du erhältst), das Custom CSS-Panel des Warenkorbs und das integrierte Lade-Skeleton.
Letzteres überrascht viele. Der Block prüft, ob der Warenkorb noch lädt, bevor er dein Template erreicht, sodass das integrierte Skeleton während des Ladens gerendert wird und dein Template erst läuft, wenn der Warenkorb bereit ist. Du musst keinen Ladezustand bauen.
Was innerhalb eines Templates verfügbar ist
- Du bekommst fünf Hooks:
useState,useEffect,useMemo,useRefunduseCallback. PlusFragment, für<>…</>. - Es gibt keine Imports. Du kannst nichts
importieren, und es gibt keinReact-Objekt im Scope, also keinReact.useReducer, keinReact.Children. Wenn ein Hook nicht in der obigen Liste steht, ist er nicht verfügbar. - Props sind schreibgeschützt. Das Mutieren einer Prop bringt nichts Nützliches. Um den Warenkorb zu ändern, verwende die Handler-Props, die dir der Block gibt (
onClose,increment,selectPlanund so weiter), statt direkt in Props zu schreiben. windowist erreichbar, sodass ein Template das Cart SDK überwindow.aftersell.cartaufrufen kann, wenn es etwas braucht, das die Props des Blocks nicht abdecken.
Konventionen über alle Blöcke hinweg
*Html-Props sind vorab bereinigter Rich Text. Rendere sie mitdangerouslySetInnerHTML. Sie haben den Sanitizer des Warenkorbs bereits durchlaufen, und Händler-Tokens wie{{total_price}}sind bereits aufgelöst.- Preise, die als
stringankommen, sind bereits im Geldformat des Shops formatiert. Preise alsnumbersind in Cents. Ein Block gibt dir das eine oder das andere, und die Tabelle jedes Blocks sagt dir, welches. isLoadingist innerhalb eines Templates immerfalse. Der Block rendert sein integriertes Skeleton und ruft dein Template erst auf, wenn der Warenkorb geladen ist — die Prop wird also der Vollständigkeit halber übergeben, nicht damit du darauf verzweigst.
Einige Blöcke geben in bestimmten Zuständen gar nichts zurück, sodass dein Template nie mit leeren Daten aufgerufen wird. Das Rewards-Template sieht nie ein leeres
milestones, und das Subscription-upgrade-Template sieht nie ein null view. Die Referenz jedes Blocks vermerkt, wo das gilt, damit du den Leerzustands-Zweig weglassen kannst.Ein benutzerdefiniertes Template stylen
Die zwei Klassenfamilien
cart-internal-header__title ist also das, was den Titel wie den integrierten Titel aussehen lässt, und cart-external-header__title ist der Griff, den du nehmen sollst, wenn du sein Aussehen ändern willst.
Kleine Änderungen: beide Klassennamen behalten
cart-external-*-Hooks zielt.
Umstrukturieren: beide Klassennamen entfernen
cart-internal-*, weil das integrierte CSS für das integrierte DOM geschrieben wurde. Behältst du diese Klassen auf umstrukturiertem Markup, erbst du Layout-Regeln, die Elemente voraussetzen, die du nicht mehr hast: Flex-Container, die andere Kinder erwarten, Abstände zwischen Elementen, die verschoben wurden, Positionierung relativ zu etwas, das du entfernt hast. Das zeigt sich meist darin, dass dein eigenes CSS „nicht funktioniert“, weil die integrierten Regeln gewinnen.
Zwei Wege, das Gebaute zu stylen:
Option 1: eigene Klassennamen plus Custom CSS
.header oder .title eine Kollision mit den eigenen Klassen des Warenkorbs, dem Template einer anderen App oder einem zukünftigen Block.
Option 2: Inline-Styles
:hover oder andere Pseudoklassen, keine Media Queries und keine Wiederverwendung über Blöcke hinweg. Greif zu Option 1, sobald du eines davon brauchst.
Einen Ansatz wählen
Der Warenkorb wird in einem Shadow Root gerendert, sodass das Stylesheet deines Themes nicht hineinreicht. Styles für ein benutzerdefiniertes Template müssen aus dem eigenen Custom CSS-Panel des Warenkorbs oder aus Inline-Styles kommen, nicht aus deinem Theme. Siehe Custom CSS.
Wenn ein Template fehlschlägt
Da der Block still verschwindet, statt sichtbar zu fehlern, prüfe ein Template immer in der Vorschau, bevor du veröffentlichst. Wenn ein Block fehlt, öffne zuerst die Browser-Konsole.
Zwei Dinge, gegen die du dich absichern solltest, da beide ein Template crashen, das vom Gegenteil ausgeht:
- Nullable Props. Viele Props sind unter normalen Bedingungen
null(logoUrlohne Logo,imageUrlohne Bild,variantTitlebei einem Produkt mit nur einer Variante). Prüfe sie, bevor du sie verwendest. - Arrays, die leer sein können.
discountTagsunddiscountCodessind weit öfter[]als nicht.
Einschränkungen
- Benutzerdefinierte Templates sind Anzeige-Overrides. Um Logik gegen den Warenkorb auszuführen (Events abonnieren, Artikel hinzufügen, auf Änderungen reagieren), verwende benutzerdefinierte Scripts und das Cart SDK.
- Fast jeder Block unterstützt eines. Die Ausnahmen sind der Express payments-Block, der Shopifys eigene Zahlungsbuttons hostet, und der Cart items-Container selbst — die Product-Zeile darin unterstützt allerdings ein benutzerdefiniertes Template.
- Ein Template kann nicht ändern, was ein Block grundlegend tut. Es ändert, wie die Daten des Blocks dargestellt werden, nicht die Daten oder das Verhalten dahinter.
Props für jeden Block
Der Custom code-Block ist die eine Oberfläche, die Markup hinzufügt, statt das Rendering eines Blocks zu ersetzen — seine Props sind daher anders: der gesamte Warenkorb plus eine Add-to-cart-Aktion. Siehe Custom-Code-Blöcke → Props.