记录使用vue-quill-editor时验证必填遇到的问题

vue-quill-editor的使用过程许多博主都写得很详细在这里就不赘述了.主要记录一下我在验证时遇到的问题.先上代码

<el-form :rules="rules" :model="publicityForm">
    <el-form-item label="文章内容" prop="text">
            <quill-editor
              v-model="publicityForm.text"
              :options="publicityForm.editorOption"
              ref="myQuillEditor"
              style="height: 500px;"
            >
            </quill-editor>
     </el-form-item>
</el-form>

export default {
    data() {
       return {
            rules: {
                 text: [
                   { required: true, message: '必填' },
                   { max: 200, message: '请输入200位以内的字符' }
                        ]
            }
       } 
    }
} 

上述实行验证没有问题,但是它有一个问题就是假如我没有填内容就提交表单会弹出提示必填的文字,此时我再在文本框中填写内容,按照预期此时内容已不为空,必填提示文字应当消失.但是提示文字却没有消失,依然显示必填.显然文本框中的值没有被实时进行验证.后来研究了一下quill-editor的事件,添加了change事件,在change事件里面触发验证问题终于得到解决.完整代码如下:

<el-form :rules="rules" :model="publicityForm" ref="publicityForm">
    <el-form-item label="文章内容" prop="text">
            <quill-editor
              v-model="publicityForm.text"
              :options="publicityForm.editorOption"
              ref="myQuillEditor"
              style="height: 500px;"
              @change="changeQuillEditor"
            >
            </quill-editor>
     </el-form-item>
</el-form>

export default {
    data() {
       return {
            rules: {
                 text: [
                   { required: true, message: '必填' },
                   { max: 200, message: '请输入200位以内的字符' }
                        ]
            }
       } 
    },
   methods: {
       changeQuillEditor() {
           this.$refs['publicityForm'].validateField('text');
       }
    } 
} 
<think>在ElementUI的el-form中嵌入富文本编辑器(如Quill、TinyMCE等)需要注意表单验证和值绑定的问题。我们将以Quill编辑器为例,展示如何在el-form中嵌入并实现双向绑定和表单验证。步骤:1.安装并引入Quill2.在el-form-item中放置Quill编辑器3.实现双向绑定(使用v-model或:value+@change)4.处理表单验证(由于Quill是Element原生组件,需要手动触发验证)注意:ElementUI默认的表单验证规则对自定义组件可能直接生效,我们需要在内容变化手动触发验证。示例代码(Vue.js+ElementUI):</think>### 在 Element UI 的 el-form 中嵌入富文本编辑器 在 Element UI 的表单使用富文本编辑器(如 Quill、TinyMCE 或 wangeditor,需要解决两个核心问题: 1. **双向绑定**:将编辑器的内容与表单数据同步 2. **表单验证**:实现富文本内容的验证逻辑 以下是完整的实现方案(以 Quill 编辑器为例): #### 1. 安装依赖 ```bash npm install vue-quill-editor quill ``` #### 2. 创建自定义表单组件 ```vue <template> <el-form-item :prop="prop" :label="label" :rules="rules"> <quill-editor v-model="content" :options="editorOptions" @change="handleChange" /> <div v-if="error" class="el-form-item__error">{{ error }}</div> </el-form-item> </template> <script> import { quillEditor } from 'vue-quill-editor' import 'quill/dist/quill.core.css' import 'quill/dist/quill.snow.css' export default { name: 'RichTextEditor', components: { quillEditor }, props: { value: String, // 双向绑定的值 prop: String, // 表单字段名 label: String, // 标签文本 rules: Array, // 验证规则 minLength: { // 最小长度限制 type: Number, default: 0 } }, data() { return { content: this.value, error: '', editorOptions: { modules: { toolbar: [ ['bold', 'italic', 'underline', 'strike'], ['blockquote', 'code-block'], [{ 'list': 'ordered'}, { 'list': 'bullet' }], [{ 'header': [1, 2, 3, 4, 5, 6, false] }], ['link', 'image'], ['clean'] ] }, placeholder: '请输入内容...', theme: 'snow' } } }, watch: { value(newVal) { if (newVal !== this.content) { this.content = newVal } } }, methods: { handleChange(content) { this.content = content.html this.$emit('input', this.content) // 触发验证 this.validate() }, // 自定义验证方法 validate() { if (this.rules) { // 移除HTML标签后的纯文本长度 const textLength = this.content.replace(/<[^>]*>/g, '').length if (textLength < this.minLength) { this.error = `内容长度能少于${this.minLength}个字符` return false } // 执行其他验证规则 for (const rule of this.rules) { if (rule.required && !textLength) { this.error = rule.message || '内容能为空' return false } } this.error = '' return true } return true } } } </script> <style scoped> /* 调整编辑器高度 */ .ql-container { min-height: 200px; } </style> ``` #### 3. 在 el-form 中使用组件 ```vue <template> <el-form :model="form" :rules="formRules" ref="articleForm" label-width="100px"> <!-- 标题字段 --> <el-form-item label="文章标题" prop="title"> <el-input v-model="form.title" /> </el-form-item> <!-- 富文本编辑器 --> <rich-text-editor label="文章内容" prop="content" v-model="form.content" :rules="contentRules" :min-length="50" /> <el-form-item> <el-button type="primary" @click="submitForm">提交</el-button> </el-form-item> </el-form> </template> <script> import RichTextEditor from './RichTextEditor.vue' export default { components: { RichTextEditor }, data() { return { form: { title: '', content: '' }, formRules: { title: [ { required: true, message: '标题能为空', trigger: 'blur' } ] }, // 内容验证规则 contentRules: [ { required: true, message: '内容能为空' } ] } }, methods: { submitForm() { this.$refs.articleForm.validate(valid => { if (valid) { // 提交表单逻辑 console.log('提交数据:', this.form) } else { console.log('表单验证失败') } }) } } } </script> ``` ### 关键实现说明 1. **双向绑定机制**: - 使用 `v-model` 实现父子组件双向绑定 - 通过 `watch` 监听外部值变化 - 使用 `@change` 事件同步编辑器内容 2. **表单验证方案**: - 自定义 `validate()` 方法处理富文本验证 - 使用正则 `/<[^>]*>/g` 去除 HTML 标签获取纯文本 - 支持最小长度验证必填验证 - 错误信息通过插槽显示在编辑器下方 3. **样式优化**: - 设置编辑器最小高度 - 使用 Quill 的 Snow 主题 - 自定义工具栏配置 4. **集成注意事项**: - 将编辑器封装为独立组件便于复用 - 通过 `prop` 属性关联表单验证字段 -表单提交自动触发验证链 ### 其他编辑器替代方案 1. **TinyMCE**: ```bash npm install @tinymce/tinymce-vue ``` 2. **wangEditor**: ```bash npm install wangeditor ``` 3. **Element UI 原生方案**(简单内容): ```vue <el-form-item prop="content"> <el-input type="textarea" v-model="form.content" :autosize="{ minRows: 6 }" /> </el-form-item> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值