什么是 Solon-Flow-Bpmn-Designer
Solon-Flow-Bpmn-Designer 是一个基于bpmn重新加工的流程设计器,主要适配于Solon-Flow使用,它基于 Web Component,因此支持 Layui、Vue、React、Angular 等几乎任何前端框架。它适配了 PC Web 端,并提供了 亮色 和 暗色 两个主题。除此之外,它还提供了灵活的配置,开发者可以方便的使用其开发流程设计的应用。


快速开始
React集成
jsx
import React from "react";
import { SolonFlowBpmnDesigner } from "solon-flow-bpmn-designer";
import "solon-flow-bpmn-designer/style.css";
interface SolonFlowDesignerProps {
value: string;
theme?: "light" | "dark";
lang?: "en" | "zh";
type?: "yaml" | "json";
height?: number;
onChange?: (value: string) => void;
}
export interface SolonFlowDesignerRef {
/**
* 属性面板显隐控制
*/
panelShow: () => boolean;
/**
* 清除设计器
*/
clear: () => void;
/**
* 获取值
*/
getValue: () => string | undefined;
}
const SolonFlowDesigner = React.forwardRef<SolonFlowDesignerRef, SolonFlowDesignerProps>((props, ref) => {
const designerRef = React.useRef(null);
const [designer, setDesigner] = React.useState<SolonFlowBpmnDesigner>();
React.useImperativeHandle(ref, () => ({
panelShow: () => designer?.showPanel() || false,
clear: () => designer?.clear(),
getValue: () => designer?.getValue(),
}));
React.useEffect(() => {
if (!!designerRef.current) {
if (designer) return;
const solonFlowBpmnDesigner = new SolonFlowBpmnDesigner({
container: designerRef.current,
height: props.height || 60,
lang: props.lang || 'zh',
theme: props.theme || 'light',
value: props.value,
onChange: (callback) => {
props.onChange?.(callback(props.type || 'yaml'));
},
});
setDesigner(solonFlowBpmnDesigner);
return () => solonFlowBpmnDesigner.destroy();
}
}, []);
React.useEffect(() => {
if (designer) {
designer.changeLocal(props.lang || 'cn');
}
}, [props.lang]);
React.useEffect(() => {
if (designer) {
designer.changeTheme();
}
}, [props.theme]);
return <div ref={designerRef}/>
});
export default SolonFlowDesigner;
Vue3集成
html
<template>
<div ref="designer"></div>
</template>
<script setup lang="ts">
import { onMounted, ref, onUnmounted, watch } from "vue";
import "solon-flow-bpmn-designer/style.css";
import { SolonFlowBpmnDesigner } from "solon-flow-bpmn-designer";
interface SolonFlowDesignerProps {
value: string;
theme?: "light" | "dark";
lang?: "en" | "zh";
type?: "yaml" | "json";
height?: number;
}
interface SolonFlowDesignerRef {
/** 属性面板显隐控制 */
panelShow: () => boolean;
/** 清除设计器 */
clear: () => void;
/** 获取值 */
getValue: () => string | undefined;
}
const props = withDefaults(defineProps<SolonFlowDesignerProps>(), {
theme: "light",
lang: "zh",
type: "yaml",
height: 60,
});
watch(() => props.theme, (newTheme) => {
solonDesigner.value?.changeTheme(newTheme);
});
watch(() => props.lang, (newLang) => {
solonDesigner.value?.changeLocal(newLang);
});
const designer = ref();
const solonDesigner = ref<SolonFlowBpmnDesigner>();
const emit = defineEmits(["change"]);
onMounted(() => {
solonDesigner.value = new SolonFlowBpmnDesigner({
container: designer.value,
height: props.height || 60,
lang: props.lang || 'zh',
theme: props.theme || 'light',
value: props.value,
onChange: (callback) => {
emit("change", callback(props.type))
},
});
});
onUnmounted(() => solonDesigner.value?.destroy())
/**
* ref可调用方法
*/
defineExpose<SolonFlowDesignerRef>({
panelShow: () => solonDesigner.value?.showPanel() || false,
clear: () => solonDesigner.value?.clear(),
getValue: () => solonDesigner.value?.getValue(),
});
</script>
Vue2集成
html
<template>
<div id="designer"></div>
</template>
<script>
import "solon-flow-bpmn-designer/style.css";
import { SolonFlowBpmnDesigner } from "solon-flow-bpmn-designer";
export default {
name: 'SolonFlowDesigner',
props: {
value: {
type: String,
required: true
},
theme: {
type: String,
default: "light"
},
lang: {
type: String,
default: "zh"
},
type: {
type: String,
default: "yaml"
},
height: {
type: Number,
default: 60
},
},
data() {
return {
designer: null,
}
},
mounted() {
this.designer = new SolonFlowBpmnDesigner({
container: '#designer',
height: this.height,
lang: this.lang,
theme: this.theme,
value: this.value,
onChange: (callback) => {
this.$emit("change", callback(this.type))
},
});
},
methods: {
panelShow() {
this.designer?.showPanel();
},
clear() {
this.designer?.clear();
},
getValue() {
return this.designer?.getValue();
}
},
watch: {
lang: {
handler(val) {
if (val && this.designer) {
this.designer.changeLocal(val);
}
},
deep: true,
immediate: true
},
theme: {
handler(val) {
if (val && this.designer) {
this.designer.changeTheme(val);
}
},
deep: true,
immediate: true
},
},
}
</script>