React组件 - 实现侧滑删除

news/2024/7/15 17:31:53 标签: react.js, 前端, 前端框架

实现效果

组件源码

SlideContainer.js
import React, {useRef, useState} from "react";

export const SlideContainer = (props) => {

    const childrenArray = React.Children.toArray(props.children);
    const [left, setLeft] = useState(0);
    const [leftOriginal, setleftOriginal] = useState(0);
    const [run, setRun] = useState(false);
    const touchX = useRef(null);

    const mouseDown = (event) => {
        const x = event.clientX;
        touchX.current = x;
        setRun(true);
        setleftOriginal(left)
    }

    const mouseMove = (event) => {
        if (!run) {
            return;
        }
        const x = event.clientX;
        const move = x - touchX.current;
        if (leftOriginal + move <= -1 * 50 * (window.innerWidth / 100)) { // 移出边界
            return;
        }
        if (leftOriginal + move >= 0) { // 移出边界
            return;
        }
        setLeft(leftOriginal + move);
    }

    const mouseUp = (event) => {
        if (!run) {
            return;
        }
        if (left < -1 * 25 * (window.innerWidth / 100)) {
            setLeft(-1 * 50 * (window.innerWidth / 100));
        } else {
            setLeft(0)
        }
        setRun(false);
    }

    return (
        <div style={{width: '100vw', height: '100px', position: 'relative', overflow: 'hidden'}}
             onMouseDown={mouseDown} onMouseMove={mouseMove} onMouseUp={mouseUp}
        >
            <div style={{width: '150vw', position: 'absolute', display: 'flex', left: left + 'px'}}>
                <div style={{width: '100vw'}}>{childrenArray[0]}</div>
                <div style={{width: '50vw'}}>{childrenArray[1]}</div>
            </div>
        </div>
    )
}
使用样例
import {SlideContainer} from "./component/slide-view/slide-view";

const App = ()=> {
    return (
        <SlideContainer>
            <div>你好中国</div>
            <div>
                <button type='button' style={{width:'25vw'}}>预览</button>
                <button type='button' style={{width:'25vw'}}>删除</button>
            </div>
        </SlideContainer>
    )
}


http://www.niftyadmin.cn/n/5424207.html

相关文章

用miniconda建立PyTorch、Keras、TensorFlow三个环境

一、配置清华镜像conda源 由于网络问题&#xff0c;直接使用conda默认的源下载包可能会非常慢。为了解决这个问题&#xff0c;可以配置国内镜像源来加速包的下载。清华大学TUNA协会提供了一个常用的conda镜像源。下面是如何配置清华镜像源的步骤&#xff1a; 1. 配置清华conda…

C++结构体的前置声明的学习

这样写是可以的&#xff1a; structs.h: #pragma once#include <qstring.h>struct m {int a, b, c;QString d, e, f; };struct m; class QtWidgetsApplication1 : public QMainWindow {Q_OBJECTpublic:QtWidgetsApplication1(QWidget *parent nullptr);~QtWidgetsAppl…

golang将pcm格式音频转为mp3格式

文章目录 前言一、安装ffmpeg二、代码 前言 在使用ffmpeg之前也使用了很多库&#xff0c;但是都没有成功。 https://github.com/viert/go-lame github.com/hajimehoshi/go-mp3 github.com/go-audio/audio/mp3 golang.org/x/mobile/exp/audio/mp3所以本文使用ffmpeg来将pcm文件…

安卓Java面试题 81- 90

81. 简述Android数字签名?Android系统要求所有的应用必须被证书进行数字签名之后才能进行安装。Android系统通过该证书来确认应用的作者,该证书是不需要权威机构认证的,一般情况下应用都是用开发者的自签名证书,该证书是确保应用程序和应用程序作者之间建立信任关系,而不是…

关于SpringSecurity出现Failed to evaluate expression ‘ps.hasAuthority(‘role‘)‘

1. 问题描述 在使用SpringSecurity对接口进行权限校验时&#xff0c;报错java.lang.IllegalArgumentException: Failed to evaluate expression ps.hasAuthority(role)。 2. 解决方案 2.1 查看是否添加注解 对于SpringSecurity对配置类&#xff0c;我们需要添加注解EnableGlo…

JAVA的多线程及并发

1. Java 中实现多线程有几种方法 继承 Thread 类&#xff1b; 实现 Runnable 接口&#xff1b; 实现 Callable 接口通过 FutureTask 包装器来创建 Thread 线程&#xff1b; 使 用 ExecutorService 、 Callable 、 Future 实 现 有 返 回 结 果 的多 线 程 &#xff08; 也 就 …

云原生安全-容器安全

伴随着云计算市场而发展起来的&#xff0c;云基础设施投资的快速增长&#xff0c;无疑为云安全发展提供土壤。随着企业逐渐转向云端部署和容器化应用&#xff0c;云原生安全也成为企业所需要考虑的安全问题。 而在云原生应用和服务平台的构建过程中&#xff0c;容器技术凭借高…

基于springboot+vue的线上教育系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 现在大家的生活方式正在被计算机的发展慢慢改变着&#xff0c;学习方式也逐渐由书本走向荧幕,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变&#xff0c;人们的娱乐方式不仅仅…