我试图将数据传递给自定义vue组件,该组件在tiptap editor中呈现。我可以传递default属性,但是将反应性值分配给它似乎不起作用。
这是tiptap-node-extension.js文件:
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部分:
<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
<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。
这样做是可行的:
src: {
default: '123'
}但这并不是:
...
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
企图:
editor.chain().focus().insertContent('<vue-component/>', {src: state.src}).run()发布于 2022-11-18 11:35:09
首先,我建议创建一个功能构建的扩展,而不是现在的通用VueComponent。如果您在该扩展的基础上进行更多的扩展,那么将有几个扩展在竞争标记。将扩展中设置的所有代码移动到实际扩展,您可以设置任何您想要的标记名。
现在,我认为这里的问题是:insertContent看起来像这样:
insertContent: (value: Content, options?: {
parseOptions?: ParseOptions;
updateSelection?: boolean;
})内容声明为
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类型:
editor.chain().focus().insertContent({type: "vueComponent", attrs:{src: state.src}}).run()在这里,类型是您设置的组件的名称。
希望这是有意义的,关于提示的文档也不错,如果您有进一步的问题,请告诉我https://tiptap.dev/guide/custom-extensions/#attributes。
https://stackoverflow.com/questions/74449637
复制相似问题