mldong-flow-designer-plus
Version:
本项目包含了作者为B站课堂视频[《工作流设计器开发最佳实践》](https://www.bilibili.com/cheese/play/ss24484)的过程源码。教程中开发的组件也可用于实际生产环境中。以下是和使用文档和课程章节说明。 ## 实战项目 [演示地址](https://flow-pro.mldong.com/)
81 lines (80 loc) • 2.29 kB
text/typescript
import { HtmlResize } from "@logicflow/extension";
import { createApp, h } from "vue";
import VueNode from './VueNode.vue'
class CustomVueModel extends HtmlResize.model {
setAttributes(): void {
this.text.editable = false
}
}
class CustomVueView extends HtmlResize.view {
app: any;
vnode: any;
isMounted: boolean = false;
constructor(props: any) {
super(props)
this.vnode = h(VueNode, {
model: props.model,
isHovered: props.model.isHovered,
isSelected: props.model.isSelected
});
// const _this = this;
// this.app = createApp({
// render() {
// return _this.vnode
// }
// })
this.app = createApp({
render: () => this.vnode
})
}
shouldUpdate(): boolean {
const data = {
...this.props.model.getProperties(),
isSelected: this.props.model.isSelected,
isHovered: this.props.model.isHovered,
// id: this.props.model.id,
// __textValue__: this.props.model.text.value
}
if (this.preProperties && this.preProperties === JSON.stringify(data)) return false
this.preProperties = JSON.stringify(data)
return true
}
setHtml(rootEl: HTMLElement) {
if(!this.isMounted) {
rootEl.innerHTML = '';
const el: HTMLElement = document.createElement('div');
el.style.width = '100%';
el.style.height = '100%';
el.style.background = 'red';
rootEl.appendChild(el)
this.app.mount(el)
this.isMounted = true;
} else {
// 更新组件数据
this.vnode.component.props.isHovered = this.props.model.isHovered
this.vnode.component.props.isSelected = this.props.model.isSelected
this.vnode.component.props.model = {
// ...this.props.model,
isHovered: this.props.model.isHovered,
isSelected: this.props.model.isSelected,
graphModel: this.props.model.graphModel,
data: {
id: this.props.model.id,
type: this.props.model.type,
x: this.props.model.x,
y: this.props.model.y,
text: this.props.model.text,
properties: this.props.model.properties
}
}
}
}
getText(): ''{
return ''
}
}
export default {
type: "custom-vue",
view: CustomVueView,
model: CustomVueModel
}