首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在TipTap中将数据传递给自定义Vue扩展?

如何在TipTap中将数据传递给自定义Vue扩展?
EN

Stack Overflow用户
提问于 2022-11-15 17:10:01
回答 1查看 66关注 0票数 0

我试图将数据传递给自定义vue组件,该组件在tiptap editor中呈现。我可以传递default属性,但是将反应性值分配给它似乎不起作用。

这是tiptap-node-extension.js文件:

代码语言:javascript
复制
import {Node, mergeAttributes} from '@tiptap/core'
import {VueNodeViewRenderer} from '@tiptap/vue-3'
import Component from '@/views/components/vue-component.vue'

export default Node.create({
    parseHTML() {
        return [{ tag: 'vue-component' }]
    },
    renderHTML({ HTMLAttributes }) {
        return ['vue-component', mergeAttributes(HTMLAttributes)]
    },
    addNodeView() {
        return VueNodeViewRenderer(Component)
    },
})

script setup组件的editor部分:

代码语言:javascript
复制
<script setup>
import {useEditor, EditorContent, BubbleMenu} from '@tiptap/vue-3'
import StarterKit from '@tiptap/starter-kit'
import {Underline} from "@tiptap/extension-underline";
import {TextAlign} from "@tiptap/extension-text-align";
import {Link} from "@tiptap/extension-link";
import VueComponent from '@/js/tiptap-node-extension.js'


const editor = useEditor({
    extensions: [
        StarterKit,
        TextAlign.configure({ types: ['heading', 'paragraph'] }),
        Underline,
        Link,
        VueComponent.extend({
                name: 'vueComponent',
                group: 'block',
                draggable: true,
                addAttributes() {
                    return {
                        src: {
                            default: '123',
                        }
                    }
                },
            }
        ),
    ],
    content: props.modelValue,
    onUpdate: ({ editor }) => {
        emit('update:modelValue', editor.getHTML())
    },
    editable: props.locked ? false : store.admin
})

const sendDataToExtension = async (editor, event) => {
    // Triggered upon event

    ...

    state.src = '123'
    editor.chain().focus().insertContent('<vue-component/>').run()
}
</script>

vue component

代码语言:javascript
复制
<script setup>
import {NodeViewWrapper} from '@tiptap/vue-3'

const props = defineProps({
    node: {
        type: Object,
        required: true
    },
    updateAttributes: {
        type: Function,
        required: true,
    }
})

</script>


<template>
  <node-view-wrapper class="vue-component" data-drag-handle="">
    <p>{{ node.attrs.src }}</p>
  </node-view-wrapper>
</template>

default of src通过了,但是当我尝试分配一个反应性对象(在挂载editor组件之后创建),它最终是undefined

这样做是可行的:

代码语言:javascript
复制
src: {
    default: '123'
}

但这并不是:

代码语言:javascript
复制
...

src: {
    default: state.src
}

...

const sendDataToExtension = async (editor, event) => {
    // triggered upon event

    ...

    state.src = '123'
    editor.chain().focus().insertContent('<vue-component/>').run()

}

如何将数据发送到安装vue component后创建的editor

企图:

代码语言:javascript
复制
editor.chain().focus().insertContent('<vue-component/>', {src: state.src}).run()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-18 11:35:09

首先,我建议创建一个功能构建的扩展,而不是现在的通用VueComponent。如果您在该扩展的基础上进行更多的扩展,那么将有几个扩展在竞争标记。将扩展中设置的所有代码移动到实际扩展,您可以设置任何您想要的标记名。

现在,我认为这里的问题是:insertContent看起来像这样:

代码语言:javascript
复制
insertContent: (value: Content, options?: {
    parseOptions?: ParseOptions;
    updateSelection?: boolean;
})

内容声明为

代码语言:javascript
复制
export declare type Content = HTMLContent | JSONContent | JSONContent[] | null;
export declare type HTMLContent = string;
export declare type JSONContent = {
    type?: string;
    attrs?: Record<string, any>;
    content?: JSONContent[];
    marks?: {
        type: string;
        attrs?: Record<string, any>;
        [key: string]: any;
    }[];
    text?: string;
    [key: string]: any;
};

在您的示例中,您必须将src属性添加到html字符串中,但是我建议在您的示例中使用JSONContent类型:

代码语言:javascript
复制
editor.chain().focus().insertContent({type: "vueComponent", attrs:{src: state.src}}).run()

在这里,类型是您设置的组件的名称。

希望这是有意义的,关于提示的文档也不错,如果您有进一步的问题,请告诉我https://tiptap.dev/guide/custom-extensions/#attributes

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74449637

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档