深入浅出 Quill 系列之实践篇1:如何将龙插入到编辑器中?

引言

这是深入浅出 Quill 系列的第5篇。

之前在掘金看到一篇文章:《产品经理:你能不能用div给我画条龙? 》

于是突发奇想:

能否把这条龙插入到富文本编辑器中呢?

1 在富文本编辑器中插入自定义内容

之前给大家分享了如何在 Quill 中插入自定义的内容,我们一起来回顾下:

  • 第一步:自定义工具栏按钮
  • 第二步:自定义 Blot 内容
  • 第三步:在 Quill 注册自定义 Blot
  • 第四步:调用 Quill 的 API 插入自定义内容

我们试着按照这个步骤来将龙插入到编辑器中。

2 第一步:自定义工具栏按钮

这个非常简单:

ts 复制代码
    const TOOLBAR_CONFIG = [
      [{ header: ['1', '2', '3', false] }],
      ['bold', 'italic', 'underline', 'link'],
      [{ list: 'ordered' }, { list: 'bullet' }],
      ['clean'],
      ['card', 'divider', 'emoji', 'file', 'tag'],
      ['dragon'], // 新增的
    ];

自定义工具栏按钮图标:

ts 复制代码
    const dragonIcon = `<svg>...</svg>`;
    const icons = Quill.import('ui/icons');
    icons.dragon = dragonIcon;

增加工具栏按钮事件:

ts 复制代码
    const quill = new Quill('#editor', {
      theme: 'snow',
      modules: {
        toolbar: {
          container: TOOLBAR_CONFIG,
          handlers: {
            ...
            // 增加一个空的事件
            dragon(value): void {
              console.log('dragon~~');
            },
          },
        }
      },
    });

3 第二步:自定义 Blot 内容(核心)

之前的分享提到:

Quill 中的 Blot 就是一个普通的 ES6 Class

因此我们需要编写一个类。

dragon.ts

ts 复制代码
    import Quill from 'quill';

    const BlockEmbed = Quill.import('blots/block/embed');

    class DragonBlot extends BlockEmbed {
      static blotName = 'dragon';
      static tagName = 'canvas';

      static create(value): any {
        const node = super.create(value);
        const { id, width, height } = value;

        node.setAttribute('id', id || DragonBlot.blotName);
        if (width !== undefined) {
          node.setAttribute('width', width);
        }
        if (height !== undefined) {
          node.setAttribute('height', height);
        }

        // 绘制龙的逻辑,参考大帅老师的文章:https://juejin.cn/post/6963476650356916254
        new Dragon(node);
        
        return node;
      }
    }

    export default DragonBlot;

3.1 绘制龙

绘制龙的逻辑参考大帅老师的文章,这里就不贴代码了,大帅老师的文章里有源码,直接拿来用就可以:

产品经理:你能不能用div给我画条龙?

需要注意的是大帅老师文章里的龙图片背景不是纯黑的,需要换一张纯黑的图片。

4 第三步:在 Quill 注册自定义 Blot

有了 DragonBlot,还需要将其注册到 Quill 中才能使用:

ts 复制代码
    import DragonBlot from './formats/dragon';
    Quill.register('formats/dragon', DragonBlot);

5 第四步:调用 Quill 的 API 插入自定义内容

最后一步,见证奇迹的时刻到了!

ts 复制代码
    const quill = new Quill('#editor', {
      theme: 'snow',
      modules: {
        toolbar: {
          container: TOOLBAR_CONFIG,
          handlers: {
            ...
            dragon(value): void {
              console.log('dragon~~');
              const index = this.quill.getSelection().index;
              // 插入自定义内容
              this.quill.insertEmbed(index, 'dragon', {
                id: 'canvas-dragon',
              });
            },
          },
        }
      },
    });

效果图:

总结

本文是一个 Quill 的综合案例,从自定义工具栏按钮,到自定义 Blot 编辑器内容格式,再到调用 Quill 实例的 insertEmbed 方法,完成在富文本编辑器中插入由 Canvas 绘制的龙这种复杂的自定义内容。

下一期我会带大家在富文本编辑器中插入贪吃蛇游戏,巩固在 Quill 中自定义内容的知识,大家也可以提前思考下如何实现。

相关推荐
ujainu17 分钟前
CANN仓库中的AIGC性能极限挑战:昇腾软件栈如何榨干每一瓦算力
人工智能·开源
wenzhangli719 分钟前
ooderA2UI BridgeCode 深度解析:从设计原理到 Trae Solo Skill 实践
java·开发语言·人工智能·开源
skywalk816334 分钟前
快速安装一个本地开源邮件系统postfix+dovecot @Ubuntu22.40
开源·邮箱·postfix·dovecot
saber_andlibert1 小时前
TCMalloc底层实现
java·前端·网络
逍遥德1 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
猫头虎1 小时前
2026年AI产业13大趋势预测:Vibe Coding创作者经济元年到来,占冰强专家解读AIGC未来图景
人工智能·开源·prompt·aigc·ai编程·远程工作·agi
chian-ocean1 小时前
智能多模态助手实战:基于 `ops-transformer` 与开源 LLM 构建 LLaVA 风格推理引擎
深度学习·开源·transformer
冻感糕人~1 小时前
【珍藏必备】ReAct框架实战指南:从零开始构建AI智能体,让大模型学会思考与行动
java·前端·人工智能·react.js·大模型·就业·大模型学习
程序员agions1 小时前
2026年,“配置工程师“终于死绝了
前端·程序人生
alice--小文子1 小时前
cursor-mcp工具使用
java·服务器·前端