useWangEditor

初始化一个菜单栏与编辑区相关联的配置项。

declare function useWangEditor(
  option?: Partial<WeOptions<false>> | null,
  formField?: WeFormFieldInit
): {
  opts: WeOptions
  instance: WeInstance
  handle: InjectionKey<WeInjectContent>
  clearContent: () => void
  syncContent: () => void
  reloadEditor: () => void
}

opts

具有响应式特性的编辑器配置项,可直接修改配置项去动态配置编辑器。

const { opts } = useWangEditor()

// 设置编辑器的菜单栏模式
opts.toolbar.mode = 'simple'

// 修改编辑器的编辑区模式
opts.editable.mode = 'simple'

会触发重载的配置项

  • 菜单栏
    • WeToolbarOption 的所有属性
  • 编辑器
    • WeEditableOption.mode
    • WeEditableOption.config.customPaste
    • WeEditableOption.config.decorate
    • WeEditableOption.config.hoverbarKeys
    • WeEditableOption.config.maxLength
    • WeEditableOption.config.EXTEND_CONF
    • WeEditableOption.config.MENU_CONF

WeEditableOption 的其它配置项虽不会触发重载,但是支持动态配置。

instance

菜单栏和编辑区的实例。

import { Toolbar, IDomEditor } from '@wangeditor/editor'

declare type WeInstance = {
  /**
   * 菜单栏实例
   */
  toolbar: Toolbar | null
  /**
   * 编辑区实例
   */
  editable: IDomEditor | null
}

handle

provide/inject 句柄,WeToolbarWeEditable 组件内部将通过此句柄拿取配置进行初始化,这也是 WeToolbarWeEditable 进行关联的唯一凭证。

clearContent

清除编辑器内容并同步 v-model:json/v-model:html 数据。

const { clearContent } = useWangEditor()

clearContent()

syncContent

由于组件内部对 v-model 的数据更新做了防抖处理(防抖时长由 WeEditableOption.delay 控制)。当 delay 的数值稍大,我们在输入内容后快速点击提交表单,那么此时 v-model 的数据将不是最新的,这将得不偿失。因此我们可以在表单提交前执行 syncContent 来强制更新 v-model 数据,防止数据丢失。

element-plus 为例,在调用 ElForm.validate 方法前执行 syncContent 方法,即可避免数据丢失。

<template>
  <el-form ref="ruleForm" label-position="top" :model="formData" :rules="formRule">
    <el-form-item label="文章" prop="json">
      <we-editor :handle="handle" v-model:json.string="formData.json" v-model:html="formData.html" />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submit">提交表单</el-button>
    </el-form-item>
  </el-form>
</template>
<script>
  import { defineComponent, reactive, Ref, ref } from 'vue'
  import { useWangEditor } from 'wangeditor5-for-vue3'

  export default defineComponent({
    setup() {
      const ruleForm = ref()

      const formData = reactive({ json: '', html: '' })

      const formRule = {
        json: [{ required: true, message: '内容不能为空', trigger: 'change' }]
      }

      const { handle, syncContent } = useWangEditor({
        editable: {
          delay: 5000,
          config: {
            placeholder: '无操作 5s 后才会同步表单数据,表单提交前使用 syncContent API 强制同步数据,确保数据不被丢失'
          }
        }
      })

      // 表单提交
      function submit() {
        syncContent()
        ruleForm.value.validate((valid) => {
          console.log({ valid, ...formData })
        })
      }

      return { ruleForm, formData, formRule, handle, submit }
    }
  })
</script>
<script lang="ts">
  import { FormInstance, FormRules } from 'element-plus'
  import { defineComponent, reactive, Ref, ref } from 'vue'
  import { useWangEditor } from 'wangeditor5-for-vue3'

  export default defineComponent({
    setup() {
      const ruleForm = ref<any>() as Ref<FormInstance>

      const formData = reactive({ json: '', html: '' })

      const formRule: FormRules = {
        json: [{ required: true, message: '内容不能为空', trigger: 'change' }]
      }

      const { handle, syncContent } = useWangEditor({
        editable: {
          delay: 5000,
          config: {
            placeholder: '无操作 5s 后才会同步表单数据,表单提交前使用 syncContent API 强制同步数据,确保数据不被丢失'
          }
        }
      })

      // 表单提交
      function submit() {
        syncContent()
        ruleForm.value.validate((valid) => {
          console.log({ valid, ...formData })
        })
      }

      return { ruleForm, formData, formRule, handle, submit }
    }
  })
</script>

reloadEditor

重载编辑器(销毁并重新创建)。

重载分为编辑器重载和菜单栏重载,编辑器重载会自动触发菜单栏重载,而菜单栏重载却不会触发编辑器重载。

const { reloadEditor } = useWangEditor()

// 强制重载编辑器
reloadEditor()
Last Updated:
Contributors: clinfc