A Vue component for rendering block text from Sanity. Allows you to pass other Vue components as custom serializers.
npm install --save sanity-blocks-vue-component
import BlockContent from 'sanity-blocks-vue-component'
Vue.component('block-content', BlockContent);
Basic usage in a single file component, see the full example below for more detail.
<template>
<block-content
:blocks="blocks"
:serializers="serializers"
/>
</template>
<script>
import MyComponent from 'MyComponent.vue'
export default {
data() {
return {
blocks : [...], // Sanity block text
serializers: {
types: {
foo: MyComponent
}
}
};
}
};
</script>
The following props can be passed to the component.
Prop | Required | Description | Type |
---|---|---|---|
blocks |
Yes | Block text retreived from Sanity. | Array, Object |
serializers |
No | Any required custom serializers, see below for more detail. | Object |
className |
No | The class applied to any container element if present. Ignored if a custom container serializer is passed. | String |
projectId |
No | ID of the Sanity project. | String |
dataset |
No | Name of the Sanity dataset containing the document that is being rendered. | String |
imageOptions |
No | Query parameters to apply in image blocks to control size/crop mode etc. | Object |
renderContainerOnSingleChild |
No | Set true to enforce a container element for single block input data. | Boolean |
Serializers are the functions used for rendering block content. They can be defined either as a string (e.g. div
) or as a Vue Component (see below for more detail). This package comes with default serializers that will work for rendering basic block content, but you may pass a serializer
prop to override or extend the default serializers. The object passed will be merged with the default serializers object.
Property | Description |
---|---|
types |
Object of serializers for block types. |
marks |
Object of serializers for marks. |
list |
Serializer for list containers. |
listItem |
Serializer for list items. |
hardBreak |
Serializer for hard breaks. |
container |
Serializer for the element used to wrap the blocks. |
When using custom Vue components as block serializers, all properties of the block object will be passed via v-bind
. To access the data, define the corresponding props in your component. Components will also be passed a _sanityProps
prop which is an object with two properties:
node
- the block data object.options
- Sanity specific options (projectId
,dataset
,imageOptions
) passed to the root component.
This additional prop can be useful for generating image URLs using the @sanity/image-url package.
When using custom Vue components as mark serializers, all properties of the block object will be passed via v-bind
. To access the data, define the corresponding props in your component. You can use slots (e.g. this.$slots.default
) to access the mark text or content.
<template>
<block-content
:blocks="blocks"
:serializers="serializers"
/>
</template>
<script>
// Import the component if not already added globally
import BlockContent from 'sanity-blocks-vue-component'
// Import any components to be used as serializers
import GreetingComponent from 'GreetingComponent.vue'
export default {
components: {
BlockContent
},
data() {
return {
// The block data will usually be retrieved from Sanity
blocks: [
{
_type: 'greeting', // Sanity specific prop, corresponds to the serializer name
_key: 'example', // Sanity specific prop
firstname: 'Foobert', // Example custom property for this block type
lastname: 'Barson', // Example custom property for this block type
}
],
serializers: {
types: {
greeting: GreetingComponent
}
}
};
}
};
</script>
<template>
<div>Hello, {{ firstname }} {{ lastname }}.</div>
</template>
<script>
export default {
// Define the block object properties this component receives as props
props: {
firstname: {
type: String,
},
lastname: {
type: String,
}
},
}
</script>
Relies heavily on the official Sanity block-content-to-hyperscript package.