directives/longPress.js
export default {mounted(el, binding) {const {pressHandler,releaseHandler} =typeof binding.value === 'object' ?binding.value : {pressHandler: binding.value};if (typeof pressHandler !== 'function') {console.log('pressHandler====', pressHandler);console.error('v-longpress requires a press handler function');return;}let pressTimer = null;const rate = 25; const start = () => {pressTimer = setInterval(() => {pressHandler();}, rate);};const stop = () => {if (pressTimer) {clearInterval(pressTimer);pressTimer = null;if (typeof releaseHandler === 'function') {releaseHandler();}}};el._longPressStart = start;el._longPressStop = stop;el.addEventListener('touchstart', start);el.addEventListener('touchend', stop);el.addEventListener('touchcancel', stop);},unmounted(el) {el.removeEventListener('touchstart', el._longPressStart);el.removeEventListener('touchend', el._longPressStop);el.removeEventListener('touchcancel', el._longPressStop);el._longPressStop();}
};
main.js
import {createSSRApp
} from 'vue'
import longPress from '@/directives/longPress';
import {createPinia
} from 'pinia'
export function createApp() {const app = createSSRApp(App)app.directive('longpress', longPress); const pinia = createPinia()app.use(pinia)return {app}
}
组件使用
<view class="btn up" v-longpress="{pressHandler: ()=>{handleLongPress('up')},releaseHandler: ()=>{handleRelease('up')}
}"></view>
function handleLongPress(type) {console.log('长按触发一直触发')
}function handleRelease() {console.log("松开触发一次")
}