1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
| import Hammer from 'hammerjs'
const getTypeof = value => Object.prototype.toString.call(value).slice(0, -1).split(' ')[1];
const signInHammer = (el, key, cb, options = {}) => { const hammer = new Hammer(el); hammer.on(key, cb); const eventHandlerMap = { setSwipe () { hammer.get('swipe').set({ direction: Hammer.DIRECTION_VERTICAL, ...options }) }, setPinch () { hammer.get('pinch').set({ enable: true, ...options }) }, setRotate () { hammer.get('rotate').set({ enable: true, ...options }) }, setPan () { hammer.get('pan').set({ direction: Hammer.DIRECTION_ALL, ...options }) } }
if (key === 'swipeup' || key === 'swipedown') return eventHandlerMap.setSwipe() if (key === 'pinch') return eventHandlerMap.setPinch() if (key === 'rotate') return eventHandlerMap.setRotate() if (key === 'pan') return eventHandlerMap.setPan() hammer.get(key)?.set(options) }
const hammer = { bind(el, binding, vNode) { const eventMap = binding.value; const vueInstance = vNode.context; for (const key in eventMap) { const value = eventMap[key]; const valueTypeof = getTypeof(value) const handler = { String: (value, options) => { if (!(value in vueInstance)) throw new Error('不存在当前名称事件:' + value) signInHammer(el, key, vueInstance[value], options) }, Function: (value, options) => signInHammer(el, key, value, options), Object: () => { if (!('handler' in value)) throw new Error('未指定处理事件!') const handlerType = getTypeof(value.handler) if (handlerType in handler) handler[handlerType](value.handler, value.options) } } if (valueTypeof in handler) handler[valueTypeof](value) else throw new Error('hammer指令配置类型错误!') } } }
export default hammer
|