@custom-wang-element/core
v1.1.0
Published
一个快速定义wangEditor自定义element的库
Downloads
4
Readme
简介
custom-wang-element
是一个快速定义wangEditor
自定义element
的库,外部组件只要实现ICmp
接口,既可以在对应的mvvm框架中接入各自的组件。
安装
custom-wang-element
依赖wangEditor
,需要提前安装wangEditor
,已安装可以跳过
npm install @wangeditor/editor --save
然后安装custom-wang-element
npm install @custom-wang-element/core --save
使用
在初始化wangEditor
前,使用createCustomElement
创建一个module
并在注册:
import { createCustomElement } from "@custom-wang-element/core";
import { Boot } from "@wangeditor/editor";
// 注册一个组件
Boot.registerModule(createCustomElement('countbtn', countBtnCreator))
上面的例子中,'countbtn'
是我们创建自定义元素的tag,需要全局唯一,不可重复注册,countBtnCreator
是一个CmpCreator
函数,CmpCreator
函数是一个ICmp
的构建函数,countBtnCreator
的作用就是构建一个countBtn
组件,提供给wangEditor
使用。代码大致如下,省略具体实现:
function countBtnCreator(options: CmpCreatorOptions): ICmp {
let wrapper = document.createElement("div")
return {
getEl() {
return wrapper
},
update(options) {
},
unmount() {
wrapper = null
}
}
}
注册完组件后,即可在wangEditor
中使用,正常我们是在自定义菜单中插入一个自定义元素:
import { customWangElement } from "@custom-wang-element/core";
import { Boot } from "@wangeditor/editor";
class CountBtnMenu {
constructor() {
this.title = '计数器'
this.tag = 'button'
}
getValue(editor) {
return false
}
isActive(editor) {
return true
}
isDisabled(editor) {
return editor.isDisabled()
};
exec(editor, value) {
// 这里插入我们的自定元素,这里我们提供了customWangElement函数来创建一个SlateElement
editor.insertNode(customWangElement('countbtn', '0'))
};
}
Boot.registerMenu({
key: 'countbtn-menu', // 定义 menu key :要保证唯一、不重复(重要)
factory() {
return new CountBtnMenu() // 把 `YourMenuClass` 替换为你菜单的 class
},
})
在上面代码中,我们在exec
方法中插入一个SlateElement
来添加我们的自定义组件。由于我们的自定义元素的SlateElement
类型是CustomWangElement
,我们提供了customWangElement
来快速创建:
import { customWangElement } from "@custom-wang-element/core";
customWangElement('countbtn', '0')
具体的使用,可以查看案例
内置api和接口类型
createCustomElement
function createCustomElement(tag: string, cmpCreator: CmpCreator, options?: Partial<ElemOption>): CustomElementModule
tag
是wangEditor
的组件名,必须唯一
cmpCreator
是外部组件构造器,返回一个ICmp
对象
options
是自定义初始化wangEditor
组件根节点snabbdom
的vnode参数
只需实现CmpCreator
,即可在其他mvvm框架中,接入其自定义组件。
CmpCreator
type CmpCreator = (options: CmpCreatorOptions) => ICmp
CmpCreatorOptions
export type CmpCreatorOptions = CmpUpdateOptions & {
defaultValue: string,
updateValue: (arg: string) => void
}
CmpUpdateOptions
export type CmpUpdateOptions = {
disabled: boolean
selected: boolean
}
ICmp
interface ICmp {
getEl(): (Element | null)
unmount(): void
update(options: CmpUpdateOptions): void
}
ICmp.getEl
是用户获取插入组件的HTMLElement
节点。
ICmp.unmount
是自定义组件在wangEditor
卸载该节点时的钩子函数。
ICmp.update
是在编辑器disabled
和selected
更新的时候,通知外部组件更新状态的钩子。
ElemOption
import { VNodeData } from 'snabbdom'
type ElemOption = {
tag: string
inline: boolean
props: Record<string, any>,
} & VNodeData
tag
是生成snabbdom
Vnode是的根节点标签,默认是'span'
inline
说明只定义节点是行内元素,而非块元素,默认是true
props
是传入snabbdom
Vnode根节点的props数据,默认是{ contentEditable: false }
VNodeData
请查看snabbdom
文档
customWangElement
创建一个SlateElement
,作用是创建一个createCustomElement
注册后的Slate
节点
function customWangElement(type: string, value: any): CustomWangElement
第一个参数type
是调用createCustomElement
的tag,也就是自定义节点的tag
第二个参数value
是自定义元素的初始数据,所有非string
类型数据,都会被JSON.stringify
处理。null
和undefined
会转成空字符串''
。
其他mvvm框架的绑定
虽然custom-wang-element
提供了抽象的接口,可以自行接入其他mvvm框架中,但是需要自己实现CmpCreator
,确实有点麻烦,这里我们提供了如下框架的版本的CmpCreator
绑定: