useWangEditor

经过 useWangEditor 处理后,返回的 editabletoolbar 分别对应编辑器菜单栏的配置项,不过此时的配置项对象具备了响应式特性,我们可以直接修改 editable/toolbar 对应属性来更新重载编辑器。

如果传入的 editableOptiontoolbarOption 是响应式数据,内部将自动解除与之前的关联,也就意味着经过 useWangEditor 处理后得到的 editabletoolbar 配置对象,即使内容发生变化也不会触发之前的依赖更新!!!

useWangEditor 的类型

/**
 * vue hook,用于实现编辑器配置项的动态绑定
 * @param {Object} editableOption 编辑器主体部分的配置
 * @param {Object} toolbarOption 菜单栏配置
 * @param {Number} reloadDelay 防抖时长,用于重载的延迟控制,默认值:500,单位:毫秒
 */
declare function useWangEditor(
  editableOption: WeEditableOption | null = null,
  toolbarOption: WeToolbarOption | null = null,
  reloadDelay: number
): {
  editable: Required<WeEditableOption>
  toolbar: Required<WeToolbarOption>
  getEditable: {
    (): IDomEditor | undefined
    (timeout: number): Promise<IDomEditor>
  }
  getToolbar: {
    (): Toolbar | undefined
    (timeout: number): Promise<Toolbar>
  }
  clearContent: () => void
  syncContent: () => void
  reloadEditor: () => void
}

动态修改配置

修改 editabletoolbar 的属性即可。

const { editable, toolbar } = useWangEditor()

editable.config.placeholder = '新的 placeholder'

// 切换为只读模式
editable.config.readOnly = true

toolbar.mode = 'simple'

API

clearContent

不仅会清除编辑器内容,还会同步 v-model/v-model:json/v-model:html 数据。

const { clearContent } = useWangEditor()

clearContent()

syncContent

v0.0.7+ 新增

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

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

<template>
  <el-form ref="ruleForm" :model="formData" :rules="formRule">
    <el-form-item label="文章" prop="json">
      <we-editor :toolbar-option="toolbar" :editable-option="editable" v-model:json="formData.json" />
    </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(null)

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

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

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

      // 表单提交
      function submit() {
        // 强制同步 v-model 数据
        syncContent()

        // 表单验证
        ruleForm.value.validate((valid) => {
          if (!valid) return
          console.log({ ...formData })
        })
      }

      return { ruleForm, formData, formRule, editable, toolbar, submit }
    },
  })
</script>
<script lang="ts">
  import { SlateDescendant } from '@wangeditor/editor'
  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>(null) as Ref<FormInstance>

      const formData = reactive({ json: '' as SlateDescendant[] })

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

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

      // 表单提交
      function submit() {
        // 强制同步 v-model 数据
        syncContent()

        // 表单验证
        ruleForm.value.validate((valid) => {
          if (!valid) return
          console.log({ ...formData })
        })
      }

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

getToolbar

获取菜单栏实例

同步模式

当我们不传入参数或传入的不是一个数字时,此时为同步模式。

const { getToolbar } = useWangEditor()

const toolbarInstance = getToolbar()
if (toolbarInstance) {
  // do somthing
} else {
  // do somthing
}
const { getToolbar } = useWangEditor()

const toolbarInstance: Toolbar | undefined = getToolbar()
if (toolbarInstance) {
  // do somthing
} else {
  // do somthing
}

异步模式

v0.0.5+ 新增

当我们传入一个数字时,传入的是异步超时时间。单位:毫秒。

const { getToolbar } = useWangEditor()

getToolbar(3000)
  .then((toolbarInstance) => {
    // do somthing
  })
  .catch((error) => {
    // do somthing
  })
const { getToolbar } = useWangEditor()

getToolbar(3000)
  .then((toolbarInstance: Toolbar) => {
    // do somthing
  })
  .catch((error: Error) => {
    // do somthing
  })

getEditable

获取编辑器实例

同步模式

当我们不传入参数或传入的不是一个数字时,此时为同步模式。

const { getEditable } = useWangEditor()

const editableInstance = getEditable()
if (editableInstance) {
  console.log(editableInstance.children)
} else {
  console.error('编辑器未实例化')
}
const { getEditable } = useWangEditor()

const editableInstance: IDomEditor | undefined = getEditable()
if (editableInstance) {
  console.log(editableInstance.children)
} else {
  console.error('编辑器未实例化')
}

异步模式

v0.0.5+ 新增

当我们传入一个数字时,传入的是异步超时时间。单位:毫秒。

const { getEditable } = useWangEditor()

getEditable(3000)
  .then((editableInstance) => {
    // do somthing
  })
  .catch((error) => {
    // do somthing
  })
const { getEditable } = useWangEditor()

getEditable(3000)
  .then((editableInstance: IDomEditor) => {
    // do somthing
  })
  .catch((error: Error) => {
    // do somthing
  })

reloadEditor

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

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

const { reloadEditor } = useWangEditor()

// 强制重载编辑器
reloadEditor()

会触发重载的配置项

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

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

Last Updated:
Contributors: clinfc