Commit ada722c1a044cf5ec12a27e4c79e0145725893a7

Authored by ly525
1 parent 7585b8e7

perf(contextmenu) hide contextmenu when mouse leave outside

front-end/h5/src/components/core/editor/canvas/edit.js
1 1 import { mapState, mapActions } from 'vuex'
2 2 import Shape from '../../support/shape'
  3 +import { contains } from '../../../../utils/dom-helper'
3 4  
4 5 const contextmenuOptions = [
5 6 {
... ... @@ -231,9 +232,24 @@ export default {
231 232 {
232 233 this.contextmenuPos.length
233 234 ? <a-menu
  235 + ref="contextmenu"
234 236 onSelect={({ item, key, selectedKeys }) => {
235 237 this.elementManager({ type: key })
236 238 }}
  239 + // refrence: https://github.com/vueComponent/ant-design-vue/blob/master/components/vc-trigger/Trigger.jsx#L205
  240 + onMouseleave={(e) => {
  241 + const contextmenu = this.$refs.contextmenu
  242 + if (
  243 + e &&
  244 + e.relatedTarget &&
  245 + contextmenu &&
  246 + contextmenu.$el &&
  247 + contains(e.relatedTarget, contextmenu.$el)
  248 + ) {
  249 + return
  250 + }
  251 + this.hideContextMenu()
  252 + }}
237 253 style={{
238 254 left: this.contextmenuPos[0] + 'px',
239 255 top: this.contextmenuPos[1] + 'px',
... ... @@ -242,7 +258,13 @@ export default {
242 258 zIndex: 999
243 259 }}
244 260 >
245   - { contextmenuOptions.map(option => <a-menu-item key={option.value} data-command={option.value}>{this.$t(option.i18nLabel)}</a-menu-item>) }
  261 + { contextmenuOptions.map(option => (
  262 + <a-menu-item
  263 + key={option.value}
  264 + data-command={option.value}
  265 + >{this.$t(option.i18nLabel)}</a-menu-item>
  266 + ))
  267 + }
246 268 </a-menu>
247 269 : null
248 270 }
... ...
front-end/h5/src/utils/dom-helper.js 0 → 100644
  1 +export function contains (root, n) {
  2 + let node = n
  3 + while (node) {
  4 + if (node === root) {
  5 + return true
  6 + }
  7 + node = node.parentNode
  8 + }
  9 +
  10 + return false
  11 +}
... ...