hejianhao
2025-04-16 dab2d210ca06c1faa514c6388fbd5de1ab355360
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
<template>
    <quill-editor
        v-model="content"
        ref="myQuillEditor"
        :options="editorOption"
        @blur="onEditorBlur($event)"
        @focus="onEditorFocus($event)"
        @change="onEditorChange($event)"
        @ready="onEditorReady($event)">
    </quill-editor>
</template>
<script>
import { quillEditor } from 'vue-quill-editor'
import Quill from 'quill'
import 'quill/dist/quill.core.css'
import 'quill/dist/quill.snow.css'
import 'quill/dist/quill.bubble.css'
 
// 源码中是import直接倒入,这里要用Quill.import引入
const Link = Quill.import('formats/link')
// 自定义a链接
class FileBlot extends Link {
    // 继承Link Blot
    static create (value) {
        let node
        if (value && !value.href) {
            // 适应原本的Link Blot
            node = super.create(value)
        } else {
            // 自定义Link Blot
            node = super.create(value.href)
            node.href = value.href
            node.innerText = value.innerText
            // node.setAttribute('download', value.innerText);  // 左键点击即下载
        }
        return node
    }
}
FileBlot.blotName = 'link' // 这里不用改,如果需要也可以保留原来的,这里用个新的blot
FileBlot.tagName = 'A'
Quill.register(FileBlot) // 注册link
 
export default {
    name: 'RichText',
    components: {
        quillEditor
    },
    data () {
        return {
            content: '',
            editorOption: {
                modules: {
                    toolbar: [
                        ['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线
                        ['blockquote', 'code-block'], // 引用  代码块
                        [{ header: 1 }, { header: 2 }], // 1、2 级标题
                        [{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表
                        [{ script: 'sub' }, { script: 'super' }], // 上标/下标
                        [{ indent: '-1' }, { indent: '+1' }], // 缩进
                        [{ direction: 'rtl' }], // 文本方向
                        [{ size: ['12', '14', '16', '18', '20', '22', '24', '28', '32', '36'] }], // 字体大小
                        [{ header: [1, 2, 3, 4, 5, 6] }], // 标题
                        [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色
                        [{ align: [] }], // 对齐方式
                        ['clean'], // 清除文本格式
                        ['link', 'image', 'video'] // 链接、图片、视频
                    ]
                },
                placeholder: '请输入正文'
            }
        }
    },
    mounted () {
        const quill = this.$refs.myQuillEditor.quill // 获取富文本实例
        const range = quill.getSelection(true) // 获取光标所在位置
        const linkText = 'https://www.baidu.com/' // 连接
        const content = '百度一下' // 内容
        quill.insertEmbed(range.index, 'link', { href: linkText, innerText: content }, 'api')
        quill.setSelection(range.index + linkText.length) // 调整光标到最后
    },
    methods: {
        // 失去焦点事件
        onEditorBlur (quill) {
            console.log('editor blur!', quill)
        },
        // 获得焦点事件
        onEditorFocus (quill) {
            console.log('editor focus!', quill)
        },
        // 准备富文本编辑器
        onEditorReady (quill) {
            console.log('editor ready!', quill)
        },
        // 内容改变事件
        onEditorChange ({ quill, html, text }) {
            console.log('editor change!', quill, html, text)
        }
    }
}
</script>