react long press event

前端 未结 9 1185
一个人的身影
一个人的身影 2020-12-13 02:01

Is there a way to add long press event in react-web application?

I have list of addresses. On long press on any address, I want to

9条回答
  •  一个人的身影
    2020-12-13 02:31

    Here's a component that provides onClick and onHold events - adapt as needed...

    CodeSandbox: https://codesandbox.io/s/hold-press-event-r8q9w

    Usage:

    import React from 'react'
    import Holdable from './holdable'
    
    function App() {
    
      function onClick(evt) {
        alert('click ' + evt.currentTarget.id)
      }
    
      function onHold(evt) {
        alert('hold ' + evt.currentTarget.id)
      }
    
      const ids = 'Label1,Label2,Label3'.split(',')
    
      return (
        
    {ids.map(id => ( {id} ))}
    ) }

    holdable.jsx:

    import React from 'react'
    
    const holdTime = 500 // ms
    const holdDistance = 3**2 // pixels squared
    
    export default function Holdable({id, onClick, onHold, children}) {
    
      const [timer, setTimer] = React.useState(null)
      const [pos, setPos] = React.useState([0,0])
    
      function onPointerDown(evt) {
        setPos([evt.clientX, evt.clientY]) // save position for later
        const event = { ...evt } // convert synthetic event to real object
        const timeoutId = window.setTimeout(timesup.bind(null, event), holdTime)
        setTimer(timeoutId)
      }
    
      function onPointerUp(evt) {
        if (timer) {
          window.clearTimeout(timer)
          setTimer(null)
          onClick(evt)
        }
      }
    
      function onPointerMove(evt) {
        // cancel hold operation if moved too much
        if (timer) {
          const d = (evt.clientX - pos[0])**2 + (evt.clientY - pos[1])**2
          if (d > holdDistance) {
            setTimer(null)  
            window.clearTimeout(timer)
          }
        }
      }
    
      function timesup(evt) {
        setTimer(null)
        onHold(evt)
      }
    
      return (
        
    {children}
    ) }

    Note: this doesn't work with Safari yet - pointer events are coming in v13 though - https://caniuse.com/#feat=pointer

提交回复
热议问题