# 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 的属性即可。

import { useWangEditor } from 'wangeditor5-for-vue2'
export default {
  data() {
    return {
      ...useWangEditor(),
    }
  },
  mounted() {
    this.editable.config.placeholder = '新的 placeholder'

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

    this.toolbar.mode = 'simple'
  },
}

# API - clearContent

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

const { clearContent } = useWangEditor()

clearContent()

# API - syncContent

v0.0.6+ 新增

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

element-ui 为例,在调用 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"
        :json.sync="formData.json"
        :html.sync="formData.html"
      />
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="submit">提交表单</el-button>
    </el-form-item>
  </el-form>
</template>

<script>
  import { useWangEditor } from 'wangeditor5-for-vue2'
  import UPrism from '../components/u-prism.vue'

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

      return {
        editable,
        toolbar,
        syncContent,
        formData: {
          json: '',
          html: '',
        },
        formRule: {
          json: [{ required: true, message: '内容不能为空', trigger: 'change' }],
        },
      }
    },
    methods: {
      // 提交表单
      submit() {
        // 强制同步 v-model 数据
        this.syncContent()

        // 表单验证
        this.$refs.ruleForm.validate((valid) => {
          if (!valid) return
          console.log({ ...this.formData })
        })
      },
    },
  }
</script>

# API - getToolbar

获取菜单栏实例

# 同步模式

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

const { getToolbar } = useWangEditor()

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

# 异步模式

v0.0.4+ 新增

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

const { getToolbar } = useWangEditor()

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

# API - getEditable

获取编辑器实例

# 同步模式

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

const { getEditable } = useWangEditor()

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

# 异步模式

v0.0.4+ 新增

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

const { getEditable } = useWangEditor()

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

# API - 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 的其它配置项虽不会触发重载,但是支持动态配置