Tiptap: commands v-slot is not defined

Created on 19 Jun 2019  路  6Comments  路  Source: ueberdosis/tiptap

console throws me:
Property or method "commands" is not defined on the instance but referenced during render.

my component is :

<template>
   <div>
      <div class="row">
         <div class="col-md-8">
            <div class="md-form">
               <div class="editor">
                  <editor-menu-bar :editor="editor" v-slot="{ commands, isActive }">
                     <div class="menubar">

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.bold() }"
                        @click="commands.bold"
                     >
                        <icon name="bold" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.italic() }"
                        @click="commands.italic"
                     >
                        <icon name="italic" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.strike() }"
                        @click="commands.strike"
                     >
                        <icon name="strike" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.underline() }"
                        @click="commands.underline"
                     >
                        <icon name="underline" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.code() }"
                        @click="commands.code"
                     >
                        <icon name="code" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.paragraph() }"
                        @click="commands.paragraph"
                     >
                        <icon name="paragraph" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.heading({ level: 1 }) }"
                        @click="commands.heading({ level: 1 })"
                     >
                        H1
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.heading({ level: 2 }) }"
                        @click="commands.heading({ level: 2 })"
                     >
                        H2
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.heading({ level: 3 }) }"
                        @click="commands.heading({ level: 3 })"
                     >
                        H3
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.bullet_list() }"
                        @click="commands.bullet_list"
                     >
                        <icon name="ul" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.ordered_list() }"
                        @click="commands.ordered_list"
                     >
                        <icon name="ol" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.blockquote() }"
                        @click="commands.blockquote"
                     >
                        <icon name="quote" />
                     </button>

                     <button
                        class="menubar__button"
                        :class="{ 'is-active': isActive.code_block() }"
                        @click="commands.code_block"
                     >
                        <icon name="code" />
                     </button>

                     <button
                        class="menubar__button"
                        @click="commands.horizontal_rule"
                     >
                        <icon name="hr" />
                     </button>

                     <button
                        class="menubar__button"
                        @click="commands.undo"
                     >
                        <icon name="undo" />
                     </button>

                     <button
                        class="menubar__button"
                        @click="commands.redo"
                     >
                        <icon name="redo" />
                     </button>

                     </div>
                  </editor-menu-bar>

                  <editor-content class="editor__content" :editor="editor" />
               </div>
            </div>
         </div>
      </div>
   </div>
</template>

<script>
import Icon from '../components/icon'
import { Editor, EditorContent, EditorMenuBar } from 'tiptap'
import {
  Blockquote,
  CodeBlock,
  HardBreak,
  Heading,
  HorizontalRule,
  OrderedList,
  BulletList,
  ListItem,
  TodoItem,
  TodoList,
  Bold,
  Code,
  Italic,
  Link,
  Strike,
  Underline,
  History,
} from 'tiptap-extensions'

export default {
   components: {
      EditorContent,
      EditorMenuBar,
      Icon,
   },
   data(){
      return{
         editor:new Editor({
            extensions: [
               new Blockquote(),
               new BulletList(),
               new CodeBlock(),
               new HardBreak(),
               new Heading({ levels: [1, 2, 3] }),
               new HorizontalRule(),
               new ListItem(),
               new OrderedList(),
               new TodoItem(),
               new TodoList(),
               new Link(),
               new Bold(),
               new Code(),
               new Italic(),
               new Strike(),
               new Underline(),
               new History(),
            ],
            content: `
               <h2>
                  Napi拧te n臎co o sob臎.
               </h2>
            `,
         }),
      }
   },
   methods:{ },
   beforeDestroy() {
      this.editor.destroy()
   },
}
</script>


bug need repro

Most helpful comment

So, i faced this problem also, i used code snippet for simple menu:

<template>
<div>
    <editor-menu-bar :editor="editor" v-slot="{ commands, isActive }">
        <button :class="{ 'is-active': isActive.bold() }" @click="commands.bold">
          Bold
        </button>
    </editor-menu-bar>
    <editor-content :editor="editor" />
  </div>
</template>

and i got a ton of errors because variables from v-slot directive (commands, isActive) was not defined,
also i got error that pointed to the root of the problem:
this.$scopedSlots.default() is not a function(or something like that) points to node_modules/tiptap/dist/tiptap.esm.js:1500.
and then with some help from google i changed my template to:

<template>
  <div>
    <editor-menu-bar :editor="editor">
      <div slot-scope="{ commands, isActive }">
        <button :class="{ 'is-active': isActive.bold() }" @click="commands.bold">
          Bold
        </button>
      </div>
    </editor-menu-bar>
    <editor-content :editor="editor" />
  </div>
</template>

and it works fine for now.
Sorry that i have no time to create codesandbox, but i hope this will help someone.

All 6 comments

please provide a codesandbox.

So, i faced this problem also, i used code snippet for simple menu:

<template>
<div>
    <editor-menu-bar :editor="editor" v-slot="{ commands, isActive }">
        <button :class="{ 'is-active': isActive.bold() }" @click="commands.bold">
          Bold
        </button>
    </editor-menu-bar>
    <editor-content :editor="editor" />
  </div>
</template>

and i got a ton of errors because variables from v-slot directive (commands, isActive) was not defined,
also i got error that pointed to the root of the problem:
this.$scopedSlots.default() is not a function(or something like that) points to node_modules/tiptap/dist/tiptap.esm.js:1500.
and then with some help from google i changed my template to:

<template>
  <div>
    <editor-menu-bar :editor="editor">
      <div slot-scope="{ commands, isActive }">
        <button :class="{ 'is-active': isActive.bold() }" @click="commands.bold">
          Bold
        </button>
      </div>
    </editor-menu-bar>
    <editor-content :editor="editor" />
  </div>
</template>

and it works fine for now.
Sorry that i have no time to create codesandbox, but i hope this will help someone.

@okaminouta, thank you very much!

I am also running into this error.

I had the same issue...fixed upgrading vue, vue-loader and vue-template-compiler

"vue": "^2.6.10",
"vue-loader": "<15.0.0",
"vue-template-compiler": "^2.6.10"
<editor-menu-bar
    :editor="editor"
    v-slot="{ commands, isActive }"
>
    <div class="menubar">
        <button
            class="menubar__button"
            :class="{ 'is-active': isActive.bold() }"
            @click="commands.bold"
        >
            B
        </button>
    </div>
</editor-menu-bar>
<editor-content :editor="editor" />

Thanks for sharing!

Was this page helpful?
0 / 5 - 0 ratings

Related issues

bernhardh picture bernhardh  路  3Comments

git-mischa picture git-mischa  路  3Comments

asseti6 picture asseti6  路  3Comments

winterdedavid picture winterdedavid  路  3Comments

santicros picture santicros  路  3Comments