Vue2 富文本编辑器 vue-quill-editor 的汉化使用,不可编辑,去除 p 标签最后封装组件使用。
一、下载
npm install vue-quill-editor –save // 或者 yarn add vue-quill-editor –save
二、使用,在 demo.vue 文件中:
<template> <div > <!-- 富文本不可以编辑--通过 disabled='true'控制 --> <!-- <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" :disabled='true'> </quill-editor> --> <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)" > </quill-editor> <!-- 移除标签-通过 v-html --> <!-- <div v-html="content">{{content}}</div> --> </div> </template> <script> // require styles 引入样式 import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' import 'quill/dist/quill.bubble.css' import { quillEditor } from 'vue-quill-editor' // 工具栏配置 const toolbarOptions = [ ['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线 -----['bold', 'italic', 'underline', 'strike'] ['blockquote', 'code-block'], // 引用 代码块-----['blockquote', 'code-block'] [{ header: 1 }, { header: 2 }], // 1、2 级标题-----[{ header: 1 }, { header: 2 }] [{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表-----[{ list: 'ordered' }, { list: 'bullet' }] [{ script: 'sub' }, { script: 'super' }], // 上标/下标-----[{ script: 'sub' }, { script: 'super' }] [{ indent: '-1' }, { indent: '+1' }], // 缩进-----[{ indent: '-1' }, { indent: '+1' }] [{ direction: 'rtl' }], // 文本方向-----[{'direction': 'rtl'}] [{ size: ['small', false, 'large', 'huge'] }], // 字体大小-----[{ size: ['small', false, 'large', 'huge'] }] [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题-----[{ header: [1, 2, 3, 4, 5, 6, false] }] [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色-----[{ color: [] }, { background: [] }] [{ font: [] }], // 字体种类-----[{ font: [] }] [{ align: [] }], // 对齐方式-----[{ align: [] }] ['clean'], // 清除文本格式-----['clean'] ['link', 'image', 'video'] // 链接、图片、视频-----['link', 'image', 'video'] ] export default { components: { quillEditor }, data() { return { // isEditor: false, content: '', editorOption: { placeholder: '请输入文本...', theme: 'snow', readyOnly: false, // 3.0.6 版本通过此设置不能达到控制是否为只读模式,可以通过给组件添加 属性 :disabled='true' 或 :disabled='false' <quill-editor :disabled='true'></quill-editor> modules: { toolbar: { container: toolbarOptions } } } } }, methods: { onEditorBlur() { // 失去焦点事件 // this.content = this.delHtmlTag(this.content) //调用移除标签函数 console.log(this.content) }, onEditorFocus() { // 获得焦点事件 }, onEditorChange() { // 内容改变事件 }, // 移除文本内容中的 HTML (p)标签 // delHtmlTag(str) { // return str.replace(/<[^>]+>/g, '') // } } } </script> <style> /*注意- <style lang='scss' scoped> 汉化会失效 */ /*设置富文本框外部盒子大小,控制富文本框的大小 */ /* .edit_container{ height: 500px; width: 500px; background-color: red; } */ /*汉化配置-开始*/ /* 设置文本框大小 */ .editor { line-height: normal !important; /* width: 300px; */ /* width: 100%; */ height: 100px; } .ql-snow .ql-tooltip[data-mode="link"]::before { content: "请输入链接地址:"; } .ql-snow .ql-tooltip.ql-editing a.ql-action::after { border-right: 0px; content: "保存"; padding-right: 0px; } .ql-snow .ql-tooltip[data-mode="video"]::before { content: "请输入视频地址:"; } .ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-item::before { content: "14px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { content: "10px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { content: "18px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { content: "32px"; } .ql-snow .ql-picker.ql-header .ql-picker-label::before, .ql-snow .ql-picker.ql-header .ql-picker-item::before { content: "文本"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { content: "标题 1"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { content: "标题 2"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { content: "标题 3"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { content: "标题 4"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { content: "标题 5"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { content: "标题 6"; } .ql-snow .ql-picker.ql-font .ql-picker-label::before, .ql-snow .ql-picker.ql-font .ql-picker-item::before { content: "标准字体"; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { content: "衬线字体"; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { content: "等宽字体"; } /*汉化配置-结束*/ </style>
以上已经可以正常使用了,当然我们也可以再封装成组件使用,新建组件 quillEditor.vue。
<template> <div > <!-- 富文本不可以编辑--通过 disabled='true'控制 --> <quill-editor v-model="content" ref="myQuillEditor" @blur="onEditorBlur($event)" @focus="onEditorFocus($event)" @change="onEditorChange($event)" :options="editorOption" :disabled="isEditor" > </quill-editor> <!-- <quill-editor v-model="content" ref="myQuillEditor" :options="editorOption" > </quill-editor> --> </div> </template> <script> // require styles 引入样式 import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' import 'quill/dist/quill.bubble.css' import { quillEditor } from 'vue-quill-editor' // 工具栏配置 const toolbarOptions = [ ['bold', 'italic', 'underline', 'strike'], // 加粗 斜体 下划线 删除线 -----['bold', 'italic', 'underline', 'strike'] ['blockquote', 'code-block'], // 引用 代码块-----['blockquote', 'code-block'] [{ header: 1 }, { header: 2 }], // 1、2 级标题-----[{ header: 1 }, { header: 2 }] [{ list: 'ordered' }, { list: 'bullet' }], // 有序、无序列表-----[{ list: 'ordered' }, { list: 'bullet' }] // [{ script: 'sub' }, { script: 'super' }], // 上标/下标-----[{ script: 'sub' }, { script: 'super' }] // [{ indent: '-1' }, { indent: '+1' }], // 缩进-----[{ indent: '-1' }, { indent: '+1' }] [{ direction: 'rtl' }], // 文本方向-----[{'direction': 'rtl'}] [{ size: ['small', false, 'large', 'huge'] }], // 字体大小-----[{ size: ['small', false, 'large', 'huge'] }] [{ header: [1, 2, 3, 4, 5, 6, false] }], // 标题-----[{ header: [1, 2, 3, 4, 5, 6, false] }] [{ color: [] }, { background: [] }], // 字体颜色、字体背景颜色-----[{ color: [] }, { background: [] }] [{ font: [] }], // 字体种类-----[{ font: [] }] [{ align: [] }], // 对齐方式-----[{ align: [] }] ['clean'], // 清除文本格式-----['clean'] ['link', 'image', 'video'] // 链接、图片、视频-----['link', 'image', 'video'] ] export default { props: { quillEditorText: { type: String, default: '' }, isEditor: { type: Boolean, default: false } }, watch: { quillEditorText() { this.content = this.quillEditorText } }, data() { return { // isEditor: false, // content: '我是已经输入的内容,啦啦啦啦....', content: '', editorOption: { placeholder: '请输入文本...', theme: 'snow', readyOnly: false, // 3.0.6 版本通过此设置不能达到控制是否为只读模式,可以通过给组件添加 属性 :disabled='true' 或 :disabled='false' <quill-editor :disabled='true'></quill-editor> modules: { toolbar: { container: toolbarOptions } } } } }, components: { quillEditor }, methods: { onEditorBlur() { // 失去焦点事件 // this.content = this.delHtmlTag(this.content) // this.$emit('editorContent', this.content) // console.log(this.content) }, onEditorFocus() { // 获得焦点事件 }, onEditorChange() { // 内容改变事件 } // // 移除文本内容中的 HTML (p)标签 // delHtmlTag(str) { // return str.replace(/<[^>]+>/g, '') // } } } </script> <style> /*注意- <style lang='scss' scoped> 汉化会失效 */ /*设置富文本框外部盒子大小,控制富文本框的大小 */ .edit_container { height: 249px; /* background-color: red; */ } /*汉化配置-开始*/ /* 设置文本框大小 */ .editor { line-height: normal !important; height: 200px; /* 控制输入内容框的高度 -(头部菜单栏的高度是 49px 此高度是外层盒子高度-49px 得到)*/ } .ql-snow .ql-tooltip[data-mode="link"]::before { content: "请输入链接地址:"; } .ql-snow .ql-tooltip.ql-editing a.ql-action::after { border-right: 0px; content: "保存"; padding-right: 0px; } .ql-snow .ql-tooltip[data-mode="video"]::before { content: "请输入视频地址:"; } .ql-snow .ql-picker.ql-size .ql-picker-label::before, .ql-snow .ql-picker.ql-size .ql-picker-item::before { content: "14px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="small"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="small"]::before { content: "10px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="large"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="large"]::before { content: "18px"; } .ql-snow .ql-picker.ql-size .ql-picker-label[data-value="huge"]::before, .ql-snow .ql-picker.ql-size .ql-picker-item[data-value="huge"]::before { content: "32px"; } .ql-snow .ql-picker.ql-header .ql-picker-label::before, .ql-snow .ql-picker.ql-header .ql-picker-item::before { content: "文本"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="1"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="1"]::before { content: "标题 1"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="2"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="2"]::before { content: "标题 2"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="3"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="3"]::before { content: "标题 3"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="4"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="4"]::before { content: "标题 4"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="5"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="5"]::before { content: "标题 5"; } .ql-snow .ql-picker.ql-header .ql-picker-label[data-value="6"]::before, .ql-snow .ql-picker.ql-header .ql-picker-item[data-value="6"]::before { content: "标题 6"; } .ql-snow .ql-picker.ql-font .ql-picker-label::before, .ql-snow .ql-picker.ql-font .ql-picker-item::before { content: "标准字体"; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="serif"]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="serif"]::before { content: "衬线字体"; } .ql-snow .ql-picker.ql-font .ql-picker-label[data-value="monospace"]::before, .ql-snow .ql-picker.ql-font .ql-picker-item[data-value="monospace"]::before { content: "等宽字体"; } /*汉化配置-结束*/ </style>
导入需要引入的组件-fuwenben.vue:
<template> <div > <el-form ref="form" :model="form" label-width="80px"> <el-form-item label="活动形式"> <el-input type="textarea" v-model="form.desc"></el-input> </el-form-item> <el-form-item label="上传正文"> <!-- 父传子 --> <!-- <QuillEditor v-model="form.editorText" :quillEditorText="quillEditorText" :isEditor="isEditor" ></QuillEditor> --> <!-- 子传父 --> <QuillEditor v-model="form.editorText" :isEditor="isEditor" @editorContent="getEditorContent" ></QuillEditor> </el-form-item> <el-form-item label="活动名称"> <el-input v-model="form.name"></el-input> </el-form-item> <el-form-item> <el-button type="primary" @click="onSubmit">给富文本添加内容</el-button> <el-button>取消</el-button> </el-form-item> </el-form> </div> </template> <script> import QuillEditor from './quillEditor.vue' export default { components: { QuillEditor }, data() { return { // quillEditorText: '', // 富文本内容 父传子时释放开 isEditor: false, // 控制富文本是否可以编辑 true 为不可以编辑, false 为可以编辑 form: { desc: '', editorText: '', name: '' } } }, mounted() { // this.editorFn() }, methods: { onSubmit() { }, getEditorContent(val) { // this.delHtmlTag(val) // this.form.editorText = this.delHtmlTag(val) this.form.editorText = val console.log('富文本', this.form.editorText) // alert(this.form.editorText) } // 移除文本内容中的 HTML (p)标签 // delHtmlTag(str) { // return str.replace(/<[^>]+>/g, '') // } } } </script> <style lang="scss" scoped> </style>