React 实现拖放功能

介绍

        本篇文章将会使用react实现简单拖放功能。

样例

布局拖放

LayoutResize.js

import React, {useState} from "react";
import { Button } from "antd";
import "./LayoutResize.css";

export const LayoutResize = () => {
    const [state,setState] = useState({
        dragging: false,
        startPageX: 0,
        siderWidth: 150,
    })

    // 鼠标点击事件
    const handleMouseDown = evt => {

        setState({
            ...state,
            dragging: true,
            startPageX: evt.pageX,
        });
    };

    // 鼠标抬起事件
    const handleMouseUp = () => {

        setState({
            ...state,
            dragging: false,
        });
    };

    // 鼠标移动事件
    const handleMouseMove = evt => {

        if (!state.dragging){ // 没有拖拽直接返回
            return;
        }
        console.log('move')
        let siderWidth = state.siderWidth + evt.pageX - state.startPageX;
        if (siderWidth < 20 || siderWidth > 300) {
            return;
        }
        setState({
            ...state,
            siderWidth,
            startPageX: evt.pageX,
        });
    };
        const pxWidth = `${state.siderWidth}px`;
        return (
            <div className="app-layout-resize" style={
  { paddingLeft: pxWidth }}>
                <div className="header">Header</div>
                <div className="sider" style={
  { width: pxWidth }}>
                    Sider
                </div>
                <div className="content" style={
  { left: pxWidth }}>
                    Content
                </div>
                <div className="footer" style={
  { left: pxWidth }}>
                    Footer
                </div>
                <div
                    className="sider-resizer"
                    style={
  { left: pxWidth }}
                    onMouseDown={handleMouseDown}
                    onMouseMove={handleMouseMove}
                    onMouseUp={handleMouseUp}
                />
            </div>
        );

}

        LayOutResize组件是一个实现侧边栏拖放功能得布局组件。组件由左侧的sider,右侧的header,content,header,以及透明的sider-resizer。

        sider-resizer做到可以滑动,基于onMouseDown,onMouseMove,onMouseup方法实现,动态修改左侧sider的大小来实现。

LayoutResize.css

.app-layout-resize {
    width: 500px;
    height: 400px;
    position: relative;
    background-color: #eee;
    text-align: center;
    padding-left: 150px;
    line-height: 60px;
}

.app-layout-resize .header {
    border-bottom: 2px solid #fff;
}
.app-layout-resize .content {
    position: absolute;
    bottom: 60px;
    top: 60px;
    left: 0;
    right: 0;
}
.app-layout-resize .sider {
    width: 150px;
    position: absolute;
    border-right: 2px solid #fff;
    top: 0;
    left: 0;
    bottom: 0;
}
.app-layout-resize .footer {
    border-top: 2px solid #fff;
    bottom: 0;
    left: 150px;
    right: 0;
    position: absolute;
}

.app-layout-resize .sider-resizer {
    position: absolute;
    left: 148px;
    width: 6px;
    top: 0;
    bottom: 0;
    cursor: col-resize;
}


实现效果

相关推荐

  1. React实践

    2024-01-07 10:20:02       72 阅读
  2. React实践

    2024-01-07 10:20:02       66 阅读
  3. React实践

    2024-01-07 10:20:02       53 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-07 10:20:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-07 10:20:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-07 10:20:02       87 阅读
  4. Python语言-面向对象

    2024-01-07 10:20:02       96 阅读

热门阅读

  1. GoLang vs Python

    2024-01-07 10:20:02       62 阅读
  2. 在vscode中写C# 教程

    2024-01-07 10:20:02       55 阅读
  3. 【js逆向】爬虫之进程,线程,协程

    2024-01-07 10:20:02       55 阅读
  4. 【笔记】Mac M1上miniforge3与tushare的安装

    2024-01-07 10:20:02       79 阅读
  5. Nodejs搭配axios下载图片

    2024-01-07 10:20:02       64 阅读
  6. SQL优化:条件提升

    2024-01-07 10:20:02       75 阅读
  7. Linux 进程管理

    2024-01-07 10:20:02       46 阅读
  8. K8S学习指南(62)-K8S源代码走读之Kube-Scheduler

    2024-01-07 10:20:02       71 阅读
  9. 纯虚函数和抽象类(C++)

    2024-01-07 10:20:02       62 阅读