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 import { mapState, mapActions } from 'vuex' 1 import { mapState, mapActions } from 'vuex'
2 import Shape from '../../support/shape' 2 import Shape from '../../support/shape'
  3 +import { contains } from '../../../../utils/dom-helper'
3 4
4 const contextmenuOptions = [ 5 const contextmenuOptions = [
5 { 6 {
@@ -231,9 +232,24 @@ export default { @@ -231,9 +232,24 @@ export default {
231 { 232 {
232 this.contextmenuPos.length 233 this.contextmenuPos.length
233 ? <a-menu 234 ? <a-menu
  235 + ref="contextmenu"
234 onSelect={({ item, key, selectedKeys }) => { 236 onSelect={({ item, key, selectedKeys }) => {
235 this.elementManager({ type: key }) 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 style={{ 253 style={{
238 left: this.contextmenuPos[0] + 'px', 254 left: this.contextmenuPos[0] + 'px',
239 top: this.contextmenuPos[1] + 'px', 255 top: this.contextmenuPos[1] + 'px',
@@ -242,7 +258,13 @@ export default { @@ -242,7 +258,13 @@ export default {
242 zIndex: 999 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 </a-menu> 268 </a-menu>
247 : null 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 +}