You've already forked template-MP
142 lines
3.5 KiB
JavaScript
142 lines
3.5 KiB
JavaScript
/**
|
|
* 自定义指令入口文件
|
|
*/
|
|
|
|
// 防止重复点击指令
|
|
export const preventReClick = {
|
|
mounted(el, binding) {
|
|
el.addEventListener('click', () => {
|
|
if (el.disabled) return
|
|
el.disabled = true
|
|
setTimeout(() => {
|
|
el.disabled = false
|
|
}, binding.value || 1000)
|
|
})
|
|
},
|
|
}
|
|
|
|
// 长按指令
|
|
export const longPress = {
|
|
mounted(el, binding) {
|
|
let timer = null
|
|
let startTime = 0
|
|
const handler = binding.value
|
|
const duration = binding.arg || 1000
|
|
|
|
// 取消定时器
|
|
const cancel = () => {
|
|
if (timer) {
|
|
clearTimeout(timer)
|
|
timer = null
|
|
}
|
|
}
|
|
|
|
// 开始计时
|
|
const start = () => {
|
|
startTime = Date.now()
|
|
timer = setTimeout(() => {
|
|
handler(el)
|
|
}, duration)
|
|
}
|
|
|
|
// 绑定事件
|
|
el.addEventListener('touchstart', start)
|
|
el.addEventListener('touchend', cancel)
|
|
el.addEventListener('touchcancel', cancel)
|
|
},
|
|
}
|
|
|
|
// 权限控制指令
|
|
export const permission = {
|
|
mounted(el, binding) {
|
|
const { value } = binding
|
|
const permissions = uni.getStorageSync('permissions') || []
|
|
|
|
if (value && !permissions.includes(value)) {
|
|
// 隐藏元素
|
|
el.style.display = 'none'
|
|
el.__vue__ && (el.__vue__.isDisplay = false)
|
|
}
|
|
},
|
|
updated(el, binding) {
|
|
const { value } = binding
|
|
const permissions = uni.getStorageSync('permissions') || []
|
|
|
|
if (value && !permissions.includes(value)) {
|
|
// 隐藏元素
|
|
el.style.display = 'none'
|
|
el.__vue__ && (el.__vue__.isDisplay = false)
|
|
} else {
|
|
// 显示元素
|
|
el.style.display = ''
|
|
el.__vue__ && (el.__vue__.isDisplay = true)
|
|
}
|
|
},
|
|
}
|
|
|
|
// 拖拽指令
|
|
export const drag = {
|
|
mounted(el) {
|
|
let startX = 0
|
|
let startY = 0
|
|
let initialX = 0
|
|
let initialY = 0
|
|
let isDragging = false
|
|
|
|
// 获取元素初始位置
|
|
const getInitialPosition = () => {
|
|
const rect = el.getBoundingClientRect()
|
|
initialX = rect.left
|
|
initialY = rect.top
|
|
}
|
|
|
|
// 鼠标按下事件
|
|
const handleMouseDown = e => {
|
|
isDragging = true
|
|
startX = e.clientX
|
|
startY = e.clientY
|
|
getInitialPosition()
|
|
el.style.position = 'absolute'
|
|
el.style.left = initialX + 'px'
|
|
el.style.top = initialY + 'px'
|
|
el.style.zIndex = 9999
|
|
}
|
|
|
|
// 鼠标移动事件
|
|
const handleMouseMove = e => {
|
|
if (!isDragging) return
|
|
const dx = e.clientX - startX
|
|
const dy = e.clientY - startY
|
|
el.style.left = initialX + dx + 'px'
|
|
el.style.top = initialY + dy + 'px'
|
|
}
|
|
|
|
// 鼠标松开事件
|
|
const handleMouseUp = () => {
|
|
isDragging = false
|
|
}
|
|
|
|
// 绑定事件
|
|
el.addEventListener('mousedown', handleMouseDown)
|
|
document.addEventListener('mousemove', handleMouseMove)
|
|
document.addEventListener('mouseup', handleMouseUp)
|
|
|
|
// 在元素上存储事件处理函数,以便在指令解绑时移除
|
|
el._dragHandlers = {
|
|
handleMouseDown,
|
|
handleMouseMove,
|
|
handleMouseUp,
|
|
}
|
|
},
|
|
unmounted(el) {
|
|
// 移除事件监听器
|
|
if (el._dragHandlers) {
|
|
const { handleMouseDown, handleMouseMove, handleMouseUp } = el._dragHandlers
|
|
el.removeEventListener('mousedown', handleMouseDown)
|
|
document.removeEventListener('mousemove', handleMouseMove)
|
|
document.removeEventListener('mouseup', handleMouseUp)
|
|
delete el._dragHandlers
|
|
}
|
|
},
|
|
}
|