React swipe and touch event handler component & hook
React hooks have been released 🎉
v5 now includes the useSwipeable
hook that provides the same great functionality as <Swipeable>
.
The component is still included and migration to v5 is straightforward. Please see the migration doc for more details including more info on the simplified api.
$ npm install react-swipeable
Use React-hooks or a Component and set your swipe(d) handlers.
import { useSwipeable, Swipeable } from 'react-swipeable'
const handlers = useSwipeable({ onSwiped: (eventData) => eventHandler, ...config })
return (<div {...handlers}> You can swipe here </div>)
Hook use requires react >= 16.8.0.
<Swipeable onSwiped={(eventData) => eventHandler} {...config} >
You can swipe here!
</Swipeable>
The Component <Swipeable>
uses a <div>
by default under the hood to attach event handlers to.
{
onSwiped, // Fired after any swipe
onSwipedLeft, // Fired after LEFT swipe
onSwipedRight, // Fired after RIGHT swipe
onSwipedUp, // Fired after UP swipe
onSwipedDown, // Fired after DOWN swipe
onSwiping, // Fired during any swipe
}
All Event Handlers are called with the below event data.
{
event, // source event
deltaX, // x offset (current.x - initial.x)
deltaY, // y offset (current.y - initial.y)
absX, // absolute deltaX
absY, // absolute deltaY
velocity, // √(absX^2 + absY^2) / time
dir, // direction of swipe (Left|Right|Up|Down)
}
{
delta: 10, // min distance(px) before a swipe starts
preventDefaultTouchmoveEvent: false, // preventDefault on touchmove, *See Details*
trackTouch: true, // track touch input
trackMouse: false, // track mouse input
rotationAngle: 0, // set a rotation angle
touchHandlerOption: { // overwrite touch handler 3rd argument
passive: true|false // defaults opposite of preventDefaultTouchmoveEvent *See Details*
},
}
{
nodeName: 'div', // internal component dom node
innerRef // access internal component dom node
}
None of the props/config options are required.
preventDefaultTouchmoveEvent
prevents the browser's touchmove event. Use this to stop the browser from scrolling while a user swipes.
e.preventDefault()
is only called when:preventDefaultTouchmoveEvent: true
trackTouch: true
- the users current swipe has an associated
onSwiping
oronSwiped
handler/prop
- if
preventDefaultTouchmoveEvent: true
thentouchHandlerOption
defaults to{ passive: false }
- if
preventDefaultTouchmoveEvent: false
thentouchHandlerOption
defaults to{ passive: true }
Example:
- If a user is swiping right with
<Swipable onSwipedRight={this.userSwipedRight} preventDefaultTouchmoveEvent={true} >
thene.preventDefault()
will be called, but if the user was swiping left thene.preventDefault()
would not be called.
Please experiment with the example to test preventDefaultTouchmoveEvent
.
If you need to support older browsers that do not have support for {passive: false}
addEventListener
3rd argument, we recommend using detect-passive-events package to determine the touchHandlerOption
prop value.
Initial set up, with node 10+
, run npm install
.
Make changes/updates to the src/index.js
file.
Please add tests if PR adds/changes functionality.
Build, run, and test examples locally:
npm run start:examples
After the server starts you can then view the examples page with your changes at http://localhost:3000
.
You can now make updates/changes to src/index.js
and webpack will rebuild, then reload the page so you can test your changes!
MIT