contentful-rich-text-vue-renderer
Render Contentful Rich Text field using Vue components
477,448
41
| Install | |
|---|---|
npm install contentful-rich-text-vue-renderer |
|
| Latest Version: | 3.2.1 |
| Vue: | 3 |
| Older releases: | 2 |
| License: | MIT |
| Last Updated: | Jan 9, 2026 |
| Links: | GitHub · npm |
Maintainer: tolgapaksoy
rich-text-vue-renderer
Vue 3 renderer for the Contentful rich text field type.
Version 2.x is for Vue 2 support.
Changelog
See releases page for changelog of versions.
Installation
Using npm:
npm install contentful-rich-text-vue-renderer
Using yarn:
yarn add contentful-rich-text-vue-renderer
Usage
<script>
import RichTextRenderer from 'contentful-rich-text-vue-renderer';
const document = {
nodeType: 'document',
content: [
{
nodeType: 'paragraph',
content: [
{
nodeType: 'text',
value: 'Hello world!',
marks: [],
},
],
},
],
};
export default {
data() {
return {
document
};
}
}
</script>
<template>
<RichTextRenderer :document="document" />
</template>
<!-- Will render in Vue as -> <p :key="key">Hello world!</p> -->
<script>
import RichTextRenderer from 'contentful-rich-text-vue-renderer';
const document = {
nodeType: 'document',
content: [
{
nodeType: 'paragraph',
content: [
{
nodeType: 'text',
value: 'Hello',
marks: [{ type: 'bold' }],
},
{
nodeType: 'text',
value: ' world!',
marks: [{ type: 'italic' }],
},
],
},
],
};
export default {
data() {
return {
document
};
}
}
</script>
<template>
<RichTextRenderer :document="document" />
</template>
You can also pass custom renderers for both marks and nodes as an optional parameter like so:
<script>
import { h } from "vue";
import { BLOCKS, MARKS } from '@contentful/rich-text-types';
import RichTextRenderer from 'contentful-rich-text-vue-renderer';
const document = {
nodeType: 'document',
content: [
{
nodeType: 'paragraph',
content: [
{
nodeType: 'text',
value: 'Hello',
marks: [{ type: 'bold' }]
},
{
nodeType: 'text',
value: ' world!',
marks: [{ type: 'italic' }]
},
],
},
]
};
export default {
data() {
return {
document
};
},
methods: {
renderMarks() {
return {
[MARKS.BOLD]: (text, key) => h('custom-bold', { key }, text)
};
},
renderNodes() {
return {
[BLOCKS.PARAGRAPH]: (node, key, next) => h('custom-paragraph', { key }, next(node.content, key, next))
}
};
}
}
</script>
<template>
<RichTextRenderer :document="document" :nodeRenderers="renderNodes()" :markRenderers="renderMarks()" />
</template>
<!-- Will render in Vue as -> <custom-paragraph :key="key"><custom-bold :key="key">Hello</custom-bold><u :key="key"> world!</u></custom-paragraph> -->
Last, but not least, you can pass a custom rendering component for an embedded entry:
<script>
import { h } from "vue";
import { BLOCKS } from '@contentful/rich-text-types';
import RichTextRenderer from 'contentful-rich-text-vue-renderer';
const document = {
nodeType: 'document',
content: [
{
nodeType: 'embedded-entry-block',
data: {
target: (...)Link<'Entry'>(...);
},
},
]
};
// Example function to render an embedded entry in a RichText editor.
// For instance, a react-router link to an entry.
const customEmbeddedEntry = (node, key) => {
return h('Link', { key, to: 'link to embedded entry' }, 'content for the <Link> component');
};
export default {
data() {
return {
document
}
},
methods: {
renderNodes() {
return {
[BLOCKS.EMBEDDED_ENTRY]: customEmbeddedEntry
}
}
}
}
</script>
<template>
<RichTextRenderer :document="document" :nodeRenderers="renderNodes()" />
</template>
<!-- Will render as -> <custom-component :key="key">(...)Link<'Entry'>(...)</custom-component> -->
The nodeRenderers prop should be one of the following BLOCKS and INLINES properties as defined in @contentful/rich-text-types:
-
BLOCKSDOCUMENTPARAGRAPHHEADING_1HEADING_2HEADING_3HEADING_4HEADING_5HEADING_6UL_LISTOL_LISTLIST_ITEMQUOTEHREMBEDDED_ENTRYEMBEDDED_ASSETTABLETABLE_ROWTABLE_CELLTABLE_HEADER_CELL
-
INLINESEMBEDDED_ENTRY(this is different from theBLOCKS.EMBEDDED_ENTRY)HYPERLINKENTRY_HYPERLINKASSET_HYPERLINK
The markRenderers prop should be one of the following MARKS properties as defined in @contentful/rich-text-types:
BOLDITALICUNDERLINECODESUBSCRIPTSUPERSCRIPTSTRIKETHROUGH
Related Packages
Version History
| Version | Released | License |
|---|---|---|
| 3.2.1 | MIT | |
| 3.2.0 | MIT | |
| 3.1.0 | MIT | |
| 3.0.1 | MIT | |
| 3.0.0 | MIT | |
| 2.1.0 | MIT | |
| 2.0.1 | MIT | |
| 2.0.0 | MIT | |
| 1.1.5 | MIT | |
| 1.1.4 | MIT | |
| 1.1.3 | MIT | |
| 1.1.2 | MIT | |
| 1.1.1 | MIT | |
| 1.1.0 | MIT | |
| 1.0.1 | ISC | |
| 1.0.0 | ISC |
Pre-releases (5)
| Version | Released | License |
|---|---|---|
| 3.0.0-rc.3 | MIT | |
| 3.0.0-rc.2 | MIT | |
| 3.0.0-rc.1 | MIT | |
| 3.0.0-rc.0 | MIT | |
| 2.2.0-beta.0 | MIT |