目的,把下面这段代码打包成一个函数,或一个类.应该怎么做?
// 菜单拖动控制代码
let initMeunLeft = 0; // 菜单初始位置
let initMenuTop = 0;
let menuDOM: HTMLDivElement; // 整个菜单
let menuBar: HTMLDivElement // 菜单上面的 div,点击拖动
let initPointX = 0, initPointY = 0
const mouseDown = _.debounce((event: MouseEvent) => { // 这个函数绑定到 菜单上部,用于移动菜单
console.log('1', event)
initPointX = event.clientX // 鼠标点下的位置
initPointY = event.clientY
menuBar = event.target as HTMLDivElement
menuDOM = menuBar.parentElement as HTMLDivElement
initMeunLeft = menuDOM.offsetLeft
initMenuTop = menuDOM.offsetTop
console.log(initMeunLeft, initMenuTop)
document.addEventListener('mousemove', mouseMove)
document.addEventListener('mouseup', mouseUp)
}, 300, { leading: true, trailing: false })
const mouseMove = _.throttle((event: MouseEvent) => {
const moveWidth = event.clientX - initPointX // 移动的距离
const moveHeight = event.clientY - initPointY //
menuDOM.style.left = initMeunLeft + moveWidth + 'px' // 更新菜单的位置
menuDOM.style.top = initMenuTop + moveHeight + 'px'
// console.log('2', menuDOM)
}, 10, { leading: true, trailing: false })
function mouseUp() {
// console.log('menu关闭监听,鼠标移动')
document.removeEventListener('mousemove', mouseMove)
document.removeEventListener('mouseup', mouseUp)
}
function closeMenu(event: any) {
const currMeun = document.getElementById('curr-meun') as HTMLDivElement
if (currMeun && !currMeun.contains(event.target) || !currMeun) {
// console.log('menu关闭监听,鼠标点击')
emit('update:visible', false)
document.removeEventListener('click', closeMenu)
}
}
// 这个watch 怎么打包进去
watch(() => props.visible, () => {
if (props.visible) {
_.debounce(() => {
// console.log('menu开始监听,鼠标点击')
document.addEventListener('click', closeMenu)
}, 300, { leading: false, trailing: true })()
}
})
// 下面这个 一直执行监听, 当菜单不显示了,这里其实就不用执行,
document.oncontextmenu = function (e) {
closeMenu(e)
}
你要怎么打包? 这段代码不完整吧
到一个函数是不行的,封装成一个组件可以全部包含这些
封装成一个组件可以啊
用mixin
既然是vue3 就封装成hooks吧