You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Nuxt 3中将Strapi Editor-JS的JSON富文本渲染为HTML?

在Nuxt 3中渲染Strapi Editor.js富文本为HTML

你的Strapi富文本输出是Editor.js格式的JSON数据,下面提供两种可落地的渲染方案:

方案一:使用Editor.js官方渲染库

1. 安装依赖

npm install @editorjs/render

2. 在组件中实现渲染

创建或修改页面/组件,引入渲染库并处理数据:

<template>
  <div ref="renderContainer"></div>
</template>

<script setup>
import Renderer from '@editorjs/render'
import { ref, onMounted } from 'vue'
import { useRuntimeConfig } from '#app'

const renderContainer = ref(null)
const config = useRuntimeConfig()
// 替换为你从Strapi获取的富文本数据
const strapiRichText = {
  "time":1679496880268,
  "blocks":[/* 你的块数据 */],
  "version":"2.23.2"
}

onMounted(async () => {
  const renderer = new Renderer()
  // 处理图片URL,拼接Strapi服务地址
  const processedBlocks = strapiRichText.blocks.map(block => {
    if (block.type === 'image') {
      return {
        ...block,
        data: {
          ...block.data,
          file: {
            ...block.data.file,
            url: `${config.public.strapiBaseUrl}${block.data.file.url}`
          }
        }
      }
    }
    return block
  })
  // 渲染为HTML并插入容器
  const html = await renderer.render(processedBlocks)
  renderContainer.value.innerHTML = html
})
</script>

3. 配置Strapi基础地址

在nuxt.config.ts中添加公共配置:

export default defineNuxtConfig({
  runtimeConfig: {
    public: {
      strapiBaseUrl: 'http://你的Strapi服务地址:1337'
    }
  }
})

方案二:自定义组件渲染(无需第三方库)

如果需要更灵活的样式控制,可自定义组件处理每种块类型。

1. 创建主渲染组件 components/EditorRenderer.vue

<template>
  <div class="editor-content">
    <component 
      v-for="block in processedBlocks" 
      :key="block.id" 
      :is="getBlockComponent(block.type)" 
      :block="block" 
    />
  </div>
</template>

<script setup>
import { computed } from 'vue'
import { useRuntimeConfig } from '#app'

const props = defineProps({
  content: {
    type: Object,
    required: true
  }
})

const config = useRuntimeConfig()

// 处理图片URL
const processedBlocks = computed(() => {
  return props.content.blocks.map(block => {
    if (block.type === 'image') {
      return {
        ...block,
        data: {
          ...block.data,
          file: {
            ...block.data.file,
            url: `${config.public.strapiBaseUrl}${block.data.file.url}`
          }
        }
      }
    }
    return block
  })
})

// 根据块类型返回对应组件
const getBlockComponent = (type) => {
  switch(type) {
    case 'paragraph':
      return 'ParagraphBlock'
    case 'image':
      return 'ImageBlock'
    // 可扩展支持其他类型(如header、list等)
    default:
      return 'DefaultBlock'
  }
}
</script>

2. 创建子组件

  • ParagraphBlock.vue(处理段落):
<template>
  <p v-html="block.data.text"></p>
</template>

<script setup>
defineProps({
  block: {
    type: Object,
    required: true
  }
})
</script>
  • ImageBlock.vue(处理图片):
<template>
  <figure>
    <img 
      :src="block.data.file.url" 
      :alt="block.data.file.alt || block.data.caption" 
    />
    <figcaption v-if="block.data.caption">{{ block.data.caption }}</figcaption>
  </figure>
</template>

<script setup>
defineProps({
  block: {
    type: Object,
    required: true
  }
})
</script>
  • DefaultBlock.vue(处理未支持的块类型):
<template>
  <div class="unsupported-block">未支持的内容类型:{{ block.type }}</div>
</template>

<script setup>
defineProps({
  block: {
    type: Object,
    required: true
  }
})
</script>

3. 在页面中使用

<template>
  <EditorRenderer :content="strapiRichText" />
</template>

<script setup>
// 替换为你从Strapi获取的富文本数据
const strapiRichText = { /* 你的Editor.js JSON数据 */ }
</script>

内容的提问来源于stack exchange,提问作者Nyx47

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:35:01