
Security News
The Changelog Podcast: Practical Steps to Stay Safe on npm
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.
block-content-to-vue
Advanced tools
Dynamically render Vue.js components from Sanity.
npm i --save block-content-to-vue
import BlockContent from 'block-content-to-vue';
Include the script file, then install the component with Vue.use(BlockContent); e.g.:
<script src="https://cdn.jsdelivr.net/npm/vue"></script>
<script src="https://cdn.jsdelivr.net/npm/block-content-to-vue"></script>
<script>
Vue.use(BlockContent);
</script>
The component requires the props blocks and serializer.
<block-content :blocks="blocks" :serializer="serializer" />
blocks must be an array of content blocks from a Sanity query response e.g.:
[
{
_id: 12345, // required
_type: 'heading-block',
heading: 'The heading!',
subtitle: 'The subtitle'
},
{
_id: 12346, // required
_type: 'two-column-block',
leftColumn: 'Left column content',
rightColumn: 'Right column content'
}
]
serializer is an object describing the components you want to render based on the Sanity block's _type value.
For now the serializer supports all custom types you define yourself in the schema, and the types span, em, underline and strike-through.
The regular types like span receive the prop fields with all it's properties inside.
import Heading from '@/components/Heading.vue';
import TwoColumn from '@/components/TwoColumn.vue';
import Span from '@/components/Span.vue';
import Underline from '@/components/Underline.vue';
const serializer = {
types: {
'heading-block': Heading,
'two-column-block': TwoColumn,
'span': Span,
'underline': Underline,
}
}
The block-content-to-vue component will automatically make the properties of each block available as props in your component.
Let's have a look at the Heading component.
<template>
<div>
<h1>{{heading}}</h1>
<p>{{subtitle}}</p>
</div>
</template>
<script>
export default {
name: "Heading",
props: {
heading: String,
subtitle: String,
},
};
</script>
We can now define the props our component will receive, and we can type-check each of them. We can also use internal state and all the other good stuff from a regular Vue.js component.
<template>
<div id="app">
<BlockContent :blocks="post['contentBlock']" :serializer="serializer" />
</div>
</template>
<script>
import sanity from '@/sanity';
import BlockContent from "block-content-to-vue";
import Heading from "./components/heading.vue";
import Button from './components/button.vue'
const query = `*[_type == "post"] {
_id,
contentBlock
}
`
const serializer = {
'heading': Heading,
'button': Button,
}
export default {
name: "App",
components: { BlockContent },
data() {
return {
post: {},
serializer,
};
},
created () {
this.fetchData();
},
methods: {
fetchData() {
sanity.fetch(query).then(posts => {
this.post = posts[0]
});
}
}
};
</script>
FAQs
Dynamically render Vue.js components from Sanity
We found that block-content-to-vue demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
Learn the essential steps every developer should take to stay secure on npm and reduce exposure to supply chain attacks.

Security News
Experts push back on new claims about AI-driven ransomware, warning that hype and sponsored research are distorting how the threat is understood.

Security News
Ruby's creator Matz assumes control of RubyGems and Bundler repositories while former maintainers agree to step back and transfer all rights to end the dispute.