• 基于vue的tiptap编辑器插件(二)


    配置

            如标题所见,这一篇我们讲配置,也是官方guide的第一节内容。我会按照文档的guide顺序,根据我自己的理解方式,一点点解读其内容,所以如果你不着急,我建议你看第一手资料;如果你的时间比较紧迫,需要快速上手,可以来看我的这篇专栏。

    配置编辑器

            在上一篇介绍中,我们可以看到,目前的编辑器非常简陋,我们如何给它添加一些功能呢?

            假设我们要增加一个可以让输入框中的文字变成标题(heading)的功能。那么,首先,我们要通过npm添加一个新的功能包@tiptap/extension-heading,并在Tiptap.vue中导入该包;在构造editor的过程中,给它传入一个配置对象,代码如下:

    1. import Heading from '@tiptap/extension-heading';
    2. //...
    3. mounted() {
    4. this.editor = new Editor({
    5. content: '

      I’m running Tiptap with Vue.js. 🎉

      '
      ,
    6. extensions: [
    7. Heading
    8. ],
    9. })
    10. }
    11. //...

            为什么我把StarterKit这个工具包给去掉了呢,因为实际上,StarterKit这个包包含了大部分常用的工具如heading,paragraph,text等,当我们在extensions配置项中同时引入StarterKit和Heading时,vue会报一个重复扩展的警告,不信的同学可以试试。

            如果这个时候你启动了项目,你会发现,界面上没有出现新东西,是不是扩展没有生效呢?实际上,如果控制台没报错的话,tiptap已经加入这个扩展了,之所以看不到是因为,你没有触发更改标题格式的事件,怎么触发呢?连个按钮都没有。不要着急,随着之后的深入学习,你会知道如何通过按钮去触发。现在我们先安心把配置相关的了解下。

            扩展也是可以被配置的,可以通过.configure()方法并传入一个配置项进行设置。如上述的Heading,我们将其改为如下形式,就可以禁用掉默认的4,5,6大小的标题,只用1,2,3大小。

    1. Heading.configure({
    2. levels: [1, 2, 3],
    3. }),

            刚才说过,StarterKit包包含了大部分常用的工具,所以可以只引入StarterKit扩展,并对单个功能进行设置

    1. import StarterKit from '@tiptap/starter-kit'
    2. new Editor({
    3. extensions: StarterKit.configure({
    4. heading: {
    5. levels: [1, 2, 3],
    6. },
    7. }),
    8. })

            当你不想指定StarterKit中的某个功能时(也就是说,你想让StarterKit包中所有的扩展按默认模式载入到Tiptap中),可以如下设置:

    1. import StarterKit from '@tiptap/starter-kit'
    2. new Editor({
    3. extensions: [
    4. StarterKit.configure({
    5. history: false,
    6. }),
    7. ],
    8. })

            另外,这一节提到了几个概念,分别是node,mark和extension。在后文中,会经常提及这些概念,所以我认为有必要在这里做一些简单的解释。

            node:如果你把文档看做是一颗树,那么你可以认为node就是这棵树中的一种内容类型。比如标题(heading),段落(paragraph),文本(text),代码块(code block)等等。

            mark:可以将一种或多种mark添加到指定的node上。比如往一段文字(node)上添加加粗效果(mark)。

            extension:extension赋予tiptap一些能力,比如heading,color等等。它们不能添加到模式中,但可以添加功能或更改编辑器的行为。

    创建菜单

            这是guide第二节内容,这里我们就能学会如何通过按钮来使用扩展了。tiptap提供了一系列API来触发命令和激活状态。下面,我们将在Tiptap.vue中添加一个button,并通过触发命令来使得加粗生效。

    1. <template>
    2. <div>
    3. <button @click="editor.chain().focus().toggleBold().run()">加粗button>
    4. <editor-content :editor="editor" />
    5. div>
    6. template>

            在构造editor时,我们让starterkit内部所有扩展生效,即

    1. this.editor = new Editor({
    2. content: '

      I’m running Tiptap with Vue.js. 🎉

      '
      ,
    3. extensions: [
    4. StarterKit.configure({
    5. history:false
    6. })
    7. ],
    8. })

            不出意外,可以看到在选中一段文本后单击加粗按钮,选中的文本就会被加粗。click事件触发的那段代码是什么意思呢?官方是这样解释的:

    • editor是tiptap的一个实例
    • chain()方法告诉editor你想要执行链式调用
    • focus()方法会重置焦点到editor上
    • toggleBold()方法会使被选中的文本加粗,或者如果被选中的文本已经被加粗,则会撤销加粗效果
    • 执行链式调用

    既然我们已经知道了如何用按钮控制文本的加粗,那么,在配置那一节中的内容,就知道解决的思路了。我通过查询了Heading扩展的API,只需要将链式调用改为:

    editor.chain().focus().toggleHeading({level:1}).run(); 即可

    总结

            从目前来看,使用tiptap并不是一件方便的事情,你需要自己去写相应的按钮,并给其绑定回调函数。怎么说呢,tiptap更像是一把双刃剑把,它能高度自定义化,但同样需要开发者花费时间精力去搞明白如何去自定义。

  • 相关阅读:
    PyTorch中的CUDA操作
    游戏笔记本电脑可以进行 3D 建模和渲染吗?有哪些优势与缺点?
    行为感知系统
    攻击异常丨处理突破GS保护
    深度学习之基于YoloV5的火灾检测系统
    如何搭建Linux环境
    知名药企集中签约阿里健康,数字化健康服务成进博会热议话题
    【Elasticsearch教程7】Mapping字段类型之boolean
    新增文章出现bug怎么定位是前端问题还是后端问题
    报道 | 国内外运筹优化会议精选
  • 原文地址:https://blog.csdn.net/hlz_12345/article/details/126522466