Appearance
Strapi Integration ​
Strapi is a headless CMS that can be integrated with the Composable Frontends. This example requires NUXT 3 instance.
How to install ​
Add Strapi Nuxt module as a dev dependencies
cmd
pnpm add -D @nuxtjs/strapi
Update Nuxt config nuxt.config.ts
js
export default {
  modules: ["@nuxtjs/strapi"],
};
More about installation can be found HERE
Cases of use ​
Fetching and displaying single element ​
As a example we will add a global banner to our demo shop. At the beginning we created a single type on the Strapi collection, with fallowing fields
ts
interface {
  text: string; // short input field - this will represent a text that we want to display in the banner
  color: string; // short input field - this will represent a color of the banner (this can be done also with color picker filed, but for this example we will use input text)
}
The next step is to create a banner component
vue
<script setup lang="ts">
interface GlobalBanner {
  text: string;
  color: string;
}
const { findOne } = useStrapi();
const { data } = await findOne<GlobalBanner>("global-banner");
const bgColor = computed(() => data.attributes?.color || "#fff");
</script>
<template>
  <section>
    <div class="text-center py-1" :style="{ 'background-color': bgColor }">
      {{ data.attributes.text }}
    </div>
  </section>
</template>
Now we can add our component to the layout. frontends/templates/vue-demo-store/layouts/default.vue
vue
<template>
  <div>
    <GlobalBanner />
    <LayoutHeader />
    <LayoutNotifications />
    <main class="mx-auto">
      <slot />
    </main>
    <LayoutFooter />
  </div>
</template>
Fetching and displaying pages ​
WARNING
This example is written for the vue-demo-store template and assuming that you implemented Multiple CMS middleware
Create new collection type Page on the Stripe admin site with fields:
ts
interface {
  text: string; // Content page
  seoUrl: string; // Page slug
}
Composable for resolving components
ts
interface StripePage {
  text: string;
  seoUrl: string;
}
export function useSWStrapi() {
  const getPage = async (route: string) => {
    const { findOne } = useStrapi();
    const response = await findOne<StripePage>("pages", undefined, {
      filters: {
        seoUrl: route,
      },
    });
    return response;
  };
  const resolveComponent = async (route: string) => {
    const page = await getPage(route);
    if (!page.data[0]) return null;
    return h("div", {}, page.data[0].attributes.text);
  };
  return {
    resolveComponent,
  };
}
Provide Strapi resolver to the pageRenderMiddlewares
ts
const { resolveComponent } = useSWStrapi();
provide("pageRenderMiddlewares", resolveComponent);

