有没有办法在 react-web 应用程序 中添加 长按 事件? 我有地址列表。在长按任何地址时,我想触发事件以删除该地址,然后是一个确认框。 原文由 Binit Ghetiya 发布,翻译遵循 CC BY-SA 4.0 许可协议
我创建了一个带有 钩子 的代码框来处理长按和点击。基本上,在鼠标按下、触摸开始事件时,会使用 setTimeout 创建一个计时器。当提供的时间过去时,它会触发长按。在鼠标抬起、鼠标离开、触摸结束等时,计时器被清除。 useLongPress.js import { useCallback, useRef, useState } from "react"; const useLongPress = ( onLongPress, onClick, { shouldPreventDefault = true, delay = 300 } = {} ) => { const [longPressTriggered, setLongPressTriggered] = useState(false); const timeout = useRef(); const target = useRef(); const start = useCallback( event => { if (shouldPreventDefault && event.target) { event.target.addEventListener("touchend", preventDefault, { passive: false }); target.current = event.target; } timeout.current = setTimeout(() => { onLongPress(event); setLongPressTriggered(true); }, delay); }, [onLongPress, delay, shouldPreventDefault] ); const clear = useCallback( (event, shouldTriggerClick = true) => { timeout.current && clearTimeout(timeout.current); shouldTriggerClick && !longPressTriggered && onClick(); setLongPressTriggered(false); if (shouldPreventDefault && target.current) { target.current.removeEventListener("touchend", preventDefault); } }, [shouldPreventDefault, onClick, longPressTriggered] ); return { onMouseDown: e => start(e), onTouchStart: e => start(e), onMouseUp: e => clear(e), onMouseLeave: e => clear(e, false), onTouchEnd: e => clear(e) }; }; const isTouchEvent = event => { return "touches" in event; }; const preventDefault = event => { if (!isTouchEvent(event)) return; if (event.touches.length < 2 && event.preventDefault) { event.preventDefault(); } }; export default useLongPress; 要使用挂钩, App.js import useLongPress from "./useLongPress"; export default function App() { const onLongPress = () => { console.log('longpress is triggered'); }; const onClick = () => { console.log('click is triggered') } const defaultOptions = { shouldPreventDefault: true, delay: 500, }; const longPressEvent = useLongPress(onLongPress, onClick, defaultOptions); return ( <div className="App"> <button {...longPressEvent}>use Loooong Press</button> </div> ); } 类组件的旧答案: 您可以使用 MouseDown、MouseUp、TouchStart、TouchEnd 事件来控制可以充当长按事件的计时器。查看下面的代码 class App extends Component { constructor() { super() this.handleButtonPress = this.handleButtonPress.bind(this) this.handleButtonRelease = this.handleButtonRelease.bind(this) } handleButtonPress () { this.buttonPressTimer = setTimeout(() => alert('long press activated'), 1500); } handleButtonRelease () { clearTimeout(this.buttonPressTimer); } render() { return ( <div onTouchStart={this.handleButtonPress} onTouchEnd={this.handleButtonRelease} onMouseDown={this.handleButtonPress} onMouseUp={this.handleButtonRelease} onMouseLeave={this.handleButtonRelease}> Button </div> ); } } 原文由 sudo bangbang 发布,翻译遵循 CC BY-SA 4.0 许可协议
我创建了一个带有 钩子 的代码框来处理长按和点击。基本上,在鼠标按下、触摸开始事件时,会使用
setTimeout
创建一个计时器。当提供的时间过去时,它会触发长按。在鼠标抬起、鼠标离开、触摸结束等时,计时器被清除。useLongPress.js
要使用挂钩,
App.js
类组件的旧答案:
您可以使用 MouseDown、MouseUp、TouchStart、TouchEnd 事件来控制可以充当长按事件的计时器。查看下面的代码