- Supports The Official Notion API
- Supports notion-api-worker to render unsupported blocks of the Official API created by @splitbee
- Fast
- Customizable
npm install vue-notion-render --savein src/index.js file import the component and use Vue.component method.
import Vue from "vue"
import VueNotionRender from "vue-notion-render"
Vue.component('VueNotionRender', VueNotionRender)in order to use it with Nuxt.js create a Nuxt plugin.
-
in
/pluginsdirectory create a filevue-notion-render.jsimport VueNotionRender from 'vue-notion-render' import Vue from 'vue' Vue.component('VueNotionRender', VueNotionRender)
-
Register the plugin by adding the file in
nuxt.config.jsplugins arrayplugins: ['~/plugins/vue-notion-render.js']
if you don't want to register the component globally you can use it locally in your component.
<script>
import VueNotionRender from "vue-notion-render"
...
export default {
components: {
VueNotionRender,
},
...
</script>This package doesn't handle the communication with the API, therefore to learn more about the official API check out the official documentation.
Currently the Official API doesn't support all Notion blocks, a temporary solution is to use notion-api-worker a serverless wrapper for the private Notion API.
- Use the /v1/page/:id to retrieve page blocks
- Make sure to pass :unofficial="true" prop
<template>
<vue-notion-render :unofficial="true" :data="data" />
</template>
<script>
...js
export default {
...
data() {
return {
data: {}
};
},
async created() {
try {
const data = await fetch("https://beta.notiontoblog.workers.dev/v1/page/f36a63918d1246909206813dcec928ea")
this.data = await data.json()
}catch(err){
console.log(err)
}
}
};
</script>https://developers.notion.com/reference/get-block-children
- Retrieve block children and pass the results array to data
- Make sure to pass :unofficial="false" prop
<template>
<vue-notion-render :unofficial="false" :data="data" />
</template>
<script>
...
export default {
...
data() {
return {
data: []
};
},
async created() {
// Retrieve block children and pass the results array to data
// https://developers.notion.com/reference/get-block-children
}
};
</script>| Block Type | Supported | Notion-API-Worker | Official API | Note |
|---|---|---|---|---|
| paragraph | β | β | β | |
| Headings | β | β | β | |
| To-do | β | β | β | |
| Lists | β | β | β | |
| Toggle | β | β | β | |
| Quote | β | β | β | |
| Colors | β | β | β | |
| Highlight | β | β | β | |
| Divider | β | β | β | |
| Callout | β | β | β | |
| Emojis | β | β | β | |
| Inline Equation | β | β | β | |
| Block Equation | β | β | β | |
| Code | β | β | β | |
| Bookmark | β | β | β | |
| Embeds | β | β | β | Spotify, Twitter, Maps, Figma, Pdf, Codepen, TypeForm, Replit, Youtube, Whimsical, Drive |
| Layout | β | β | β | |
| Video | β | β | β | embed |
| Audio | β | β | β | embed |
| File | β | β | β | embed |
| Table | β | β | β | soon |
| Board | β | β | β | soon |
vue-notion-render let you use customized components to render some blocks, to do that
Vue.js in main.js file register the components
import Vue from "vue";
import Component1 from "../components/component1.vue";
import Component2 from "../components/component2.vue";
Vue.component("Component1", Component1);
Vue.component("Component2", Component2);Nuxt.js
1.create a plugin in /plugins directory and name it components.js
import Vue from "vue";
import Component1 from "../components/component1.vue";
import Component2 from "../components/component2.vue";
Vue.component("Component1", Component1);
Vue.component("Component2", Component2);2- Register the plugin by adding the file inΒ nuxt.config.jsΒ plugins array
plugins: ['~/plugins/components.js']You need to create an array of objects that contains blockId and componentName like this
data() {
return {
customBlocks: [
{
blockId: "fe30b1ce-84a7-47b3-abe1-b3448b989115",
componentName: "Component1"
},
{
blockId: "305fed49-f7e8-412f-80a1-b32e2bbd5a01",
componentName: "Component2"
}
]
};
},You need to pass the customized block array to custom prop
<VueNotionRender :unofficial="true" :data="blocks" :custom="customBlocks" />to have the block data you need to accept block prop in your component
<script>
export default {
props: {
block: Object,
},
};
</script>Created By @yudax