vue-qill-editor自定义工具栏

1,001 阅读2分钟

vue-quill-editor自定义工具栏,因为我的业务是自定义按钮默认是禁用状态的,只有当选中文字的时候才可以使用。
下面这个是自定义按钮的使用,没有禁用功能啥的

<quill-editor
  ref="myQuillEditor"
  v-model="baseForm.programStoryOutline"
  :options="editorOption"
  style="height: 102vh; overflow-y: hidden"
  @change="onEditorChange($event)"
></quill-editor>
editorOption: {
        // 占位配置
        placeholder: '',
        modules: {
          toolbar:{
            container: [
              ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
              [{ header: 1 }, { header: 2 }], // 标题
              [{ list: 'ordered' }, { list: 'bullet' }], // 列表
              [{ indent: '-1' }, { indent: '+1' }], // 缩进
              [{ color: [] }, { background: [] }], // 字体颜色,字体背景颜色
              [{ align: [] }], // 对齐方式
              ['clean'], // 清除文本格式
              ['addMark'] // 自定义按钮名称
            ],
            handlers: {
              shadeBox: null,
              quill: undefined,
              addMark: this.addMark();
            }
          }
        }
      },
      mounted() {
    this.initButton(); // 初始化按钮
    initButton() {
      const sourceEditorButton = document.querySelector('.ql-addMark');
      sourceEditorButton.style.cssText = "width:78px;";
      sourceEditorButton.innerText="添加标注";
    },
  },
  // 点击按钮执行的方法
  addMark() {
    alert('添加标注方法')
  }, 

这个是基于业务需求写的,默认是禁用状态

<quill-editor
  ref="myQuillEditor"
  v-model="baseForm.programStoryOutline"
  :options="editorOption"
  style="height: 102vh; overflow-y: hidden"
  @change="onEditorChange($event)"
></quill-editor>

      isTextSelected: false, // 是否有文本被选中
      editorOption: {
        // 占位配置
        placeholder: '',
        modules: {
          toolbar:{
            container: [
              ['bold', 'italic', 'underline', 'strike'], //加粗,斜体,下划线,删除线
              [{ header: 1 }, { header: 2 }], // 标题
              [{ list: 'ordered' }, { list: 'bullet' }], // 列表
              [{ indent: '-1' }, { indent: '+1' }], // 缩进
              [{ color: [] }, { background: [] }], // 字体颜色,字体背景颜色
              [{ align: [] }], // 对齐方式
              ['clean'], // 清除文本格式
              ['addMark'] // 自定义按钮名称
            ],
            handlers: {
              shadeBox: null,
              quill: undefined,
              addMark: () => {
                if (this.isTextSelected) {
                // 这块是由于业务需要,是只有选中文本之后才能点击,所以就加了个判断 不需要的话,可以直接写 addMark: this.addMark();
                  this.addMark();
                }
              }
            }
          }
        }
      },
mounted() {
    this.initButton(); // 初始化按钮
    document.addEventListener('selectionchange', this.checkSelection); // 根据自己业务需求去写就行,如果不用去禁用按钮的话,可以不用写
  },
  //自定义按钮内容初始化
    initButton() {
      const sourceEditorButton = document.querySelector('.ql-addMark');
      sourceEditorButton.style.cssText = "width:78px;cursor: not-allowed;";
      sourceEditorButton.innerText="添加标注";
      sourceEditorButton.classList.add('disabled-hover'); // 添加禁用悬停类名
      sourceEditorButton.setAttribute('disabled', true); // 禁用按钮
      this.checkSelection(); // 初始检查是否有文本被选中
    },
    checkSelection() {
      const range = this.$refs.myQuillEditor.quill.getSelection();
      this.isTextSelected = range && range.length > 0;
      const sourceEditorButton = document.querySelector('.ql-addMark');
      if (this.isTextSelected) {
        sourceEditorButton.style.cursor = 'pointer';
        sourceEditorButton.removeAttribute('disabled'); // 启用按钮
      } else {
        sourceEditorButton.style.cursor = 'not-allowed';
        sourceEditorButton.setAttribute('disabled', true); // 禁用按钮
      }
    },
enableButton() {
      const sourceEditorButton = document.querySelector('.ql-addMark');
      sourceEditorButton.style.cursor = 'pointer';
      sourceEditorButton.removeAttribute('disabled'); // 启用按钮
      sourceEditorButton.classList.remove('disabled-hover'); // 移除禁用悬停类名
    },
    disableButton() {
      const sourceEditorButton = document.querySelector('.ql-addMark');
      sourceEditorButton.style.cursor = 'not-allowed';
      sourceEditorButton.setAttribute('disabled', true); // 禁用按钮
      sourceEditorButton.classList.add('disabled-hover'); // 添加禁用悬停类名
    },
        addMark() {
      // 需要拿到选中的文字
      const quill = this.$refs.myQuillEditor.quill;
      let range = quill.getSelection()
      let text = quill.getText(range.index, range.length); // 选中的文字
      if (range && range.length > 0) {
        console.log('添加标注按钮被点击,且已选中文本');
        this.dialogVisible = true
        this.markTitle = '新增标注'
        this.markForm = {
          keyword: '', // 关键词
          suggest: '', // 建议词
          problemDescription: '', // 问题描述
          inPoint: '', // 关键词索引开始位置
          outPoint: '' // 关键词的索引结束位置
        }
        console.log('选中数据', range, text)
        this.markForm.keyword = text;
        this.markForm.inPoint = range.index
        this.markForm.outPoint = range.index + range.length
        // 在这里实现添加标注的逻辑
      } else {
        this.initButton()
      }
    },

// 如果是需要用到禁用按钮的话,样式需要自己改一下,因为编辑器工具栏本身有hover的那个颜色,导致禁用的时候,也会有那个hover,
/* 禁用状态下的按钮样式 */
::v-deep(.ql-snow.ql-toolbar button[disabled],
.ql-snow .ql-toolbar button[disabled]) {
  //pointer-events: none !important; /* 禁用鼠标事件 */
  //opacity: 0.5 !important; /* 可选:降低按钮透明度以表示禁用状态 */
}

/* 覆盖 hover 和 focus 状态的样式 */
::v-deep(
.ql-snow.ql-toolbar button[disabled]:hover,
.ql-snow .ql-toolbar button[disabled]:hover,
.ql-snow.ql-toolbar button[disabled]:focus,
.ql-snow .ql-toolbar button[disabled]:focus
)
 {
  color: #c0c4cc !important; /* 保持原始颜色 */
  background-color: transparent !important; /* 保持原始背景色 */
}

/* 覆盖 active 状态的样式 */
::v-deep(
.ql-snow.ql-toolbar button[disabled].ql-active,
.ql-snow .ql-toolbar button[disabled].ql-active
)
 {
  color: #c0c4cc !important; /* 保持原始颜色 */
}

/* 覆盖 picker label 和 item 的 hover 和 selected 状态的样式 */
::v-deep(
.ql-snow.ql-toolbar .ql-picker-label[disabled]:hover,
.ql-snow .ql-toolbar .ql-picker-label[disabled]:hover,
.ql-snow.ql-toolbar .ql-picker-label[disabled].ql-active,
.ql-snow .ql-toolbar .ql-picker-label[disabled].ql-active,
.ql-snow.ql-toolbar .ql-picker-item[disabled]:hover,
.ql-snow .ql-toolbar .ql-picker-item[disabled]:hover,
.ql-snow.ql-toolbar .ql-picker-item[disabled].ql-selected,
.ql-snow .ql-toolbar .ql-picker-item[disabled].ql-selected
)
 {
  color: #c0c4cc !important; /* 保持原始颜色 */
  background-color: transparent !important; /* 保持原始背景色 */
}