The Blocks field represents a list of items, similar to the Group List field, but allows each entity in the list to have a unique shape.
For an in-depth explanation of the Blocks field, read our "What are Blocks?" blog post. To see a real-world example of Blocks in use, check out the Tina Grande Starter.
In the gif above, you see a list of Blocks: Title, Image, and Content. The form for this field could be configured like this:
const PageForm = {
label: 'Page',
fields: [
{
label: 'Page Sections',
name: 'rawJson.blocks',
component: 'blocks',
templates: {
'title-block': TitleBlock,
'image-block': ImageBlock,
'content-block': ContentBlock,
},
},
],
}
Each of the templates
in this configuration represent a configuration object that looks more or less like a top-level form configuration object.
/*
** Block template definition for the content block
**/
export const ContentBlock = {
label: 'Content',
key: 'content-block',
defaultItem: {
content: '',
},
fields: [{ name: 'content', label: 'Content', component: 'markdown' }],
}
The source data for the ContentBlock
might look like the example below. When new blocks are added, additional JSON objects will be added to the blocks
array:
{
"blocks": [
{
"content": "**Billions upon billions** are creatures of the cosmos Orion's sword cosmic fugue at the edge of forever science?",
"_template": "content-block"
}
]
}
import { Field } from '@tinacms/core'
interface BlocksConfig {
name: string
component: 'blocks'
label?: string
description?: string
templates: {
[key: string]: BlockTemplate
}
}
Option | Description |
---|---|
component | The name of the plugin component. Always 'blocks' . |
name | The path to some value in the data being edited. |
label | A human readable label for the field. Defaults to the name . (Optional) |
description | Description that expands on the purpose of the field or prompts a specific action. (Optional) |
templates | A list of Block templates that define the fields used in the Blocks. |
interface BlockTemplate {
label: string
key: string
fields: Field[]
defaultItem?: object | (() => object)
itemProps?: (
item: object
) => {
key?: string
label?: string
}
}
Option | Description |
---|---|
label | A human readable label for the Block. |
key | Should be unique to optimize the rendering of the list. |
fields | An array of fields that will render as a sub-menu for each group item. The fields should map to editable content. |
defaultItem | A function to provide the block with default data upon being created. (Optional) |
itemProps | A function that generates props for each group item. It takes the item as an argument. (Optional) It returns an object containing,
|
This interfaces only shows the keys unique to the blocks field.
Visit the Field Config docs for a complete list of options.