我尝试使用React创建滑动事件。我不想使用任何外部组件或jquery。
css类似于:
.outter{
position:relative;
width: 100%;
height: 150px;
background-color: blue;
}
.inner{
position: absolute;
width: 1000%;
left: 50px;
}
.child{
float: left;
margin-right: 15px;
}
在反应组件中,我尝试做类似的事情:
class Test extends React.Component {
constructor(props){
super(props);
this.state = {
left: 0
}
}
handleSwipe(){
this.setState({left: -350})
}
render(){
return(
<div className="outter">
<div className="inner" style={{left: this.state.left}} onSwipe={this.handleSwipe.bind(this)}>
<div className="child"><img src="http://placehold.it/350x150" /></div>
<div className="child"><img src="http://placehold.it/350x150" /></div>
<div className="child"><img src="http://placehold.it/350x150" /></div>
<div className="child"><img src="http://placehold.it/350x150" /></div>
</div>
</div>
)
}
}
React.render(<Test />, document.getElementById('container'));
如何识别滑动事件?
如果我在我的示例中而不是onSwipe
添加onClick
它可以正常工作,但是如何制作滑动效果呢?
这是jsfiddle。
答案 0 :(得分:22)
您可以向React组件添加onTouch
个事件处理程序:
onTouchStart={touchStartEvent => this.handleTouchStart(touchStartEvent)}
onTouchMove={touchMoveEvent => this.handleTouchMove(touchMoveEvent)}
onTouchEnd={() => this.handleTouchEnd()}
您可能还想为鼠标事件添加事件处理程序以实现跨平台兼容性:
onMouseDown={mouseDownEvent => this.handleMouseDown(mouseDownEvent)}
onMouseMove={mouseMoveEvent => this.handleMouseMove(mouseMoveEvent)}
onMouseUp={() => this.handleMouseUp()}
onMouseLeave={() => this.handleMouseLeave()}
您有正确的想法在事件处理程序中更新状态的left
属性,但如果您希望滑动功能感觉自然,您需要跟踪指针的位置(不管它)使用事件的left
属性更新clientX
,即可获得鼠标或触控功能。
要执行此操作,您需要存储第一次触摸的位置,并将left
设置为等于触摸位置的更改。为了增加真实感,您还可以跟踪触摸的速度,并在触摸完成后继续为组件设置动画。
这是我用来轻扫以从列表中删除项目的快速脏代码:
答案 1 :(得分:2)
我在上面使用了很好的解决方案作为构建所需内容的基础。也许有人需要这样的东西。想法是在滑动效果时左右移动我的自定义滑块。 如果您希望它更敏感,请调整150到75。
const [touchStart, setTouchStart] = React.useState(0);
const [touchEnd, setTouchEnd] = React.useState(0);
function handleTouchStart(e) {
setTouchStart(e.targetTouches[0].clientX);
}
function handleTouchMove(e) {
setTouchEnd(e.targetTouches[0].clientX);
}
function handleTouchEnd() {
if (touchStart - touchEnd > 150) {
// do your stuff here for left swipe
moveSliderRight();
}
if (touchStart - touchEnd < -150) {
// do your stuff here for right swipe
moveSliderLeft();
}
}
答案 2 :(得分:-1)
只是发现了一个可能有用的DOM事件。将.ontouchend添加到HTML标记中,以检测源自该标记的任何滑动事件。