gpt4 book ai didi

reactjs - react 长按事件

转载 作者:行者123 更新时间:2023-12-03 13:02:47 27 4
gpt4 key购买 nike

有没有办法在react-web应用程序中添加长按事件?

我有地址列表。长按任何地址时,我想触发事件来删除该地址,然后出现确认框。

最佳答案

我创建了一个 codesandbox带有一个钩子(Hook)来处理长按和点击。基本上,在按下鼠标、触摸启动事件时,会使用 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;

要使用钩子(Hook),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>
);
}
}

关于reactjs - react 长按事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48048957/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com