react 滑动删除组件
import React from "react";
import "./style.less";
class SlideItem extends React.Component {
constructor(props) {
super(props);
this.state = {};
}
componentDidMount() {}
handleTouchStart = e => {
this.startX = e.touches[0].pageX;
this.startY = e.touches[0].pageY;
}
handleTouchMove = e => {
// 若想阻止冒泡且最外层盒子为scrollView,不可用e.stopPropogagation(),否则页面卡死
this.currentX = e.touches[0].pageX;
this.moveX = this.currentX - this.startX;
this.moveY = e.touches[0].pageY - this.startY;
// 纵向移动时return
if (Math.abs(this.moveY) > Math.abs(this.moveX)) {
return;
}
// 滑动超过一定距离时,才触发
if (Math.abs(this.moveX) < 10) {
return;
}
const distance = this.moveX >= 0 ? 0 : -70;
this.setState({
moveStyle: {
transform:`translateX(${distance}px)`
}
});
}
render() {
let { moveStyle } = this.state;
return (
<React.Fragment>
<div className="slide-item-wrap">
<div className="slide-item-children"
style={moveStyle}
onTouchStart={this.handleTouchStart}
onTouchMove={this.handleTouchMove}
>
{
this.props.children
}
</div>
<div
className="delete-btn"
onClick={() => this.props.onDelete()}
>
删除
</div>
</div>
</React.Fragment>
);
}
}
export default SlideItem;
样式:
.slide-item-wrap {
width: 345px;
height: 86px;
background: #FFFFFF;
border-radius: 5px;
position: relative;
overflow: hidden;
margin-bottom: 12px;
.slide-item-children {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 2;
transition: transform 0.3s ease;
}
.delete-btn {
position: absolute;
top: 0;
right: 0;
width: 70px;
height: 100%;
background: #FC5A45;
z-index: 1;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
color: #FFFFFF;
border-radius: 0 5px 5px 0;
}
}
https://segmentfault.com/a/1190000019654209?utm_source=tag-newest

浙公网安备 33010602011771号