предисловие
В: Что такое bpmn.js?
"
bpmn.jsЭто набор инструментов рендеринга BPMN2.0 и средство веб-моделирования, которое позволяет выполнять функцию рисования блок-схем во внешнем интерфейсе.
В: Почему я пишу эту серию учебников? 🤔️
"
Из-за потребностей бизнеса компании его необходимо использовать в проектеbpmn.js
, Однако из-заbpmn.js
Разработчики игры зарубежные друзья,поэтому отечественных методических материалов мало и нет подробных документов.Поэтому много способов использования и много ям приходится искать самому.Поразмыслив,решил написать серию учебные материалы об этом. чтобы помочь большеbpmn.js
Пользователи или разработчики, которые ищут хороший способ рисовать блок-схемы, в то же время для них это еще и своего рода консолидация.
Поскольку это серия статей, она может часто обновляться.Пожалуйста, простите меня, если вы случайно смахнули его, и это не то, что вам нужно😊.
Не просите похвалы👍 не просите сердца❤️ Я просто надеюсь, что смогу вам немного помочь.
Изменить, удалить стафорты узла
Несмотря на то, что много знаний о том, как создавать и визуализировать элементы, было сказано ранее, фактическое использование определенно не ограничивается созданиемTask
,Event
на этих узлах.
Вам также может понадобиться создать:Нить(bpmn:SequenceFlow
), шлюз (ExclusiveGateway
),Деятельность(Activities
)и так далее для других типов узлов.
даже ты хочешьcontextPad
Определите функцию для удаления и редактирования узлов в .
Поэтому в этой главе мы в основном обсудим их.
Читая, вы узнаете:
contextPad
функция удаления включена
Давайте вернемся к случаю из предыдущей главы.Ха, проект остается предыдущим проектом.LinDaiDai/bpmn-vue-custom
Функция, которую вы хотите достичь:contextPad
Добавьте функцию удаления (добавьте сюда небольшую корзину):
И когда вы нажмете на нее, вы можете удалить текущий узел...
давайте откроемCustomContextPad.js
файл илиCustomContextPadProvider.js
файл, затем вgetContextPadEntries
Добавьте в метод следующий код:
// CustomContextPad.js
getContextPadEntries(element) {
const { modeling } = this // modeling需要利用CustomContextPad.$inject注册进来
function removeElement(e) { // 点击的时候实现删除功能
modeling.removeElements([element])
}
function deleteElement() { // 创建垃圾桶
return {
group: 'edit',
className: 'icon-custom icon-custom-delete',
title: translate('删除'),
action: {
click: removeElement
}
}
}
return {
'append.lindaidai-task': {...},
'delete': deleteElement() // 返回值加上删除的功能
}
}
Видно, что основные моменты следующие:
- Буду
modeling
Введен, потому что использовать егоremoveElements
метод; - Определите функцию для рисования корзины
- записывать
className
Для достижения функции изменения стиля по умолчанию
ОК👌, не забудь добавитьapp.css
Добавьте стиль корзины:
/* app.css*/
.icon-custom-delete {
background-image: url('https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/delete.png');
}
.djs-context-pad .icon-custom-delete.entry:hover {
background: url('https://hexo-blog-1256114407.cos.ap-shenzhen-fsi.myqcloud.com/delete.png') center no-repeat!important;
background-size: cover!important;
}
(настроитьmodeler
серединаCustomContextPadProvider.js
Также написано?
Это реализовано в данном удалении.
contextPad
функция редактирования включена
На самом деле упомянутая здесь функция редактирования относится кcontextPad
Установите значок редактирования, и при нажатии на него может появиться всплывающее окно, или справа появится пользовательскоеproperties-panel
, а затем здесь может отображаться некоторая информация об узле.
Причина этого:
- То, что вы ожидаете, может не отображаться справа при нажатии на узел
properties-panel
, но будетproperties-panel
Как ящик скрыт справа, нажмитеcontextPad
Одна из икон выходит справа. - нажмите
contextPad
Один из значков получает информацию об узле текущего узла, а затем выполняет другие пользовательские операции.
Получите информацию об узле, щелкнув маленький значок
Как показано выше, сначала реализуйте эту функцию: щелкните значок редактирования, чтобы распечатать информацию об узле.
На самом деле это тоже очень просто.lindaidi-task
а такжеdelete
После этого, я полагаю, вы также усвоили некоторые правила.
В любом случае, какую иконку создать, перейдите наgetContextPadEntries
Возвращаемое значение может быть добавлено:
// CustomContextPad.js
getContextPadEntries(element) {
function clickElement(e) {
console.log(element)
}
function editElement() { // 创建编辑图标
return {
group: 'edit',
className: 'icon-custom icon-custom-edit',
title: translate('编辑'),
action: {
click: clickElement
}
}
}
return {
'append.lindaidai-task': {...},
'edit': editElement(), // 返回值加上编辑功能
'delete': deleteElement() // 返回值加上删除的功能
}
}
тогда не забудьтеapp.css
плюс.icon-custom-edit
style, код здесь размещаться не будет.
Передать информацию об узле
На самом деле мы обнаружим, что легко получить информацию об узле, щелкнув маленький значок, но какCustomContextPad.js
Информация на странице передается, то есть как мы можем получить эту информацию на странице?
Например, я хочу добиться:Щелкните маленький значок редактирования, упомянутый выше 👆, после чего появится всплывающее окно с соответствующей информацией об узле.:
(из-за того, что не вводилUI
компонент, поэтому я написал несколько стилей наугад)
Ха-ха😄, способов на самом деле много:
- Фронтенд локальное хранилище
localStorage
-
vue
изvuex
-
react
изredux
Все вышеперечисленные методы могут...
Поскольку проект используетvue
разработан, поэтому здесь я продемонстрирую использованиеvuex
взаимодействовать 😄.
Сначала установите его в наш проектvuex
:
$ npm i vuex --save-D
затем вsrc
Создать каталогstore
папку для его хранения и не забудьтеmain.js
Цитировать с:
// main.js
import store from './store'
...
new Vue({
...
store,
render: h => h(App),
}).$mount('#app')
впусти насstore
создатьbpmn
модуль, специально используемый для определенияbpmn
Связанное хранилище, затем определите в нем:
-
nodeInfo<Object>
: Используется для хранения информации о выбранном в данный момент узле. -
nodeVisible<Boolean>
: используется для определения того, показывает ли всплывающее окно скрытые переменные.
// store/modules/bpmn.js
const bpmn = {
state: {
nodeVisible: false,
nodeInfo: {}
},
mutations: {
TOGGLENODEVISIBLE: (state, visible) => {
state.nodeVisible = visible
},
SETNODEINFO: (state, info) => {
state.nodeInfo = info
}
},
actions: {}
}
export default bpmn
Определив их, мы можемCustomContextPadProvider.js
внутреннийclickElement
Сделал статью:
// CustomContextPadProvider.js
import store from '../../../store' // 引入store
function clickElement(e) {
console.log(element)
store.commit('SETNODEINFO', element) // 存储节点信息
store.commit('TOGGLENODEVISIBLE', true)
}
из-заCustomContextPadProvider.js
а такжеCustomContextPad.js
Подход тот же, здесь я буду использоватьCustomContextPadProvider.js
Объясните случай.
Благодаря вышеуказанным шагам эти два значения уже могут быть сохранены вstore
Хорошо, давайте просто посмотрим, как вызвать их на странице.
давайте откроемcustom-modeler.vue
файл, добавьте внутри небольшое всплывающее окно:
<template>
<div class="modal" v-if="bpmnNodeVisible" @click="close">
<div class="modal-content">
<div class="modal-ctx">
<div class="modal-item">
节点id: {{ bpmnNodeInfo.id }}
</div>
<div class="modal-item">
节点type: {{ bpmnNodeInfo.type }}
</div>
</div>
</div>
</div>
</template>
Стиль всплывающего окна написан небрежно, и вы можете увидеть его в коде проекта, поэтому я не буду его здесь публиковать.
Затем отредактируйте соответствующийjs
Код:
<script>
import { mapState, mapMutations } from 'vuex'
export default {
... // 这个省略号是省略代码
methods: { // 方法
...mapMutations(['TOGGLENODEVISIBLE']), // 这个省略号是解构
close () {
this.TOGGLENODEVISIBLE(false)
}
},
computed: { // 计算属性
...mapState({ // 解构
bpmnNodeInfo: state => state.bpmn.nodeInfo,
bpmnNodeVisible: state => state.bpmn.nodeVisible
})
}
}
</script>
После выполнения вышеуказанных шагов мы реализовали щелчокcontextPad
Значок редактирования в , появится небольшое всплывающее окно с информацией об узле. Щелкните тень, чтобы закрыть небольшое всплывающее окно. Конечно, вы также можете очистить его, когда оно закрыто.store
Информация узела InnodeInfo
, не делайте эти операции здесь.
Наконец, давайте разберем ключевые шаги вперед:
- Цитировать
vuex
передавать данные между компонентами; - Щелкнув значок редактирования, сохраните информацию об узле в
store
середина; - Когда страница будет использоваться, используйте
vue
Вычисляемые свойства могут слушатьstate
Принцип изменения для обновления вашегоUI
(то есть появляется всплывающее окно)
(Я начал с попытки использовать самый простойlocalStorage
добиться, а позже нашлиcomputed
не может отслеживать его изменения, что приводит кlocalStorage
серединаnodeVisible
Хотя он изменился,bpmnNodeVisible
Все еще нет.Поэтому позже переключился наvuex
)
послесловие
На самом деле, эта глава в основном предназначена для того, чтобы донести до всех мысль о том, какcontextPad
В сочетании с вашей страницей в объяснении упоминается только простейший случай небольшого всплывающего окна, и у вас могут быть более сложные требования и сложные взаимодействия в реальной разработке.
Но я также очень рад предоставить вам такое решение, и я также могу сказать, что оно может дать вам немного вдохновения😊...
Потому что я исследуюbpmn.js
На тот момент ни от кого не было указаний, пришлось самому проверять официальное дело и ломать голову, так что я понял беду этого дела... Хахаха😂, слишком много, на этом глава остановится. .
В приведенных выше 👆 случаях используется один и тот же проект🦐
Git-адрес кейса проекта:LinDaiDai/bpmn-vue-customЕсли вам это нравится, пожалуйста, дайтеStar
🌟 Да, спасибо😊
Полный каталог серии можно найти здесь:"Самый подробный учебник по bpmn.js во всей сети"
Рекомендации по сериалу:
"Самый подробный учебник по bpmn.js во всей сети - основы"
"Самый подробный учебный материал по bpmn.js во всей сети - http запрос"
"Самый подробный учебный материал по bpmn.js во всей сети - мероприятия"
"Самый подробный учебник по bpmn.js во всей сети - рендерер"
"Самый подробный учебник по bpmn.js во всей сети - contextPad"