react实现拖拽模态框

yizhihongxing

React实现拖拽模态框攻略

1. 概述

在React中实现拖拽模态框,我们需要通过捕捉鼠标事件来实现拖拽功能,同时使用状态(state)来控制模态框的位置。

2. 步骤

2.1 创建拖拽组件

首先,我们需要创建一个拖拽组件,用于包裹模态框组件,以实现拖拽的功能。

import React, { useState, useEffect } from "react";

const DraggableModal = ({ children }) => {
  const [dragging, setDragging] = useState(false);
  const [pos, setPos] = useState({ x: 0, y: 0 });

  useEffect(() => {
    const handleMouseMove = (e) => {
      if (!dragging) return;
      const newX = e.pageX - pos.x;
      const newY = e.pageY - pos.y;
      // 更新位置
      setPos({ x: newX, y: newY });
    };

    const handleMouseUp = () => {
      if (dragging) {
        // 停止拖拽
        setDragging(false);
      }
    };

    document.addEventListener("mousemove", handleMouseMove);
    document.addEventListener("mouseup", handleMouseUp);

    return () => {
      document.removeEventListener("mousemove", handleMouseMove);
      document.removeEventListener("mouseup", handleMouseUp);
    };
  }, [dragging, pos]);

  const handleMouseDown = (e) => {
    // 开始拖拽,记录初始位置与偏移量
    setDragging(true);
    setPos({
      x: e.pageX - pos.x,
      y: e.pageY - pos.y,
    });
  };

  return (
    <div
      style={{ position: "absolute", top: pos.y, left: pos.x }}
      onMouseDown={handleMouseDown}
    >
      {children}
    </div>
  );
};

export default DraggableModal;

2.2 使用拖拽组件

接下来,我们可以使用上述创建的拖拽组件来实现拖拽模态框效果。

import React from "react";
import DraggableModal from "./DraggableModal";

const App = () => {
  return (
    <div>
      <DraggableModal>
        <div
          style={{
            width: "300px",
            height: "200px",
            backgroundColor: "white",
            border: "1px solid gray",
          }}
        >
          模态框内容
        </div>
      </DraggableModal>
    </div>
  );
};

export default App;

3. 示例说明

示例1

在示例1中,我们实现了一个简单的拖拽模态框。用户可以通过拖拽模态框的标题栏来改变模态框的位置,实现拖拽效果。

<DraggableModal>
  <div
    style={{
      width: "300px",
      height: "200px",
      backgroundColor: "white",
      border: "1px solid gray",
    }}
  >
    模态框内容
  </div>
</DraggableModal>

示例2

在示例2中,我们在拖拽模态框的基础上,添加了一个按钮,点击按钮可以打开或关闭模态框。

const App = () => {
  const [modalOpen, setModalOpen] = useState(false);

  const handleToggleModal = () => {
    setModalOpen(!modalOpen);
  };

  return (
    <div>
      <button onClick={handleToggleModal}>
        {modalOpen ? "关闭模态框" : "打开模态框"}
      </button>
      {modalOpen && (
        <DraggableModal>
          <div
            style={{
              width: "300px",
              height: "200px",
              backgroundColor: "white",
              border: "1px solid gray",
            }}
          >
            模态框内容
          </div>
        </DraggableModal>
      )}
    </div>
  );
};

在示例2中,通过useState来管理模态框的打开状态,并通过一个按钮来控制模态框的打开与关闭。当模态框打开时,才呈现拖拽效果。

以上是使用React实现拖拽模态框的完整攻略,希望对你有帮助!

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:react实现拖拽模态框 - Python技术站

(0)
上一篇 2023年6月28日
下一篇 2023年6月28日

相关文章

  • C语言深入分析数组指针和指针数组的应用

    C语言深入分析数组指针和指针数组的应用 数组指针和指针数组是C语言中比较重要的概念。数组指针是指一个指向数组的指针,而指针数组是指一个数组,其中的每个元素都是一个指针。以下将详细讲解这两个概念的应用。 数组指针的应用 声明和初始化 数组指针可以用来访问多维数组中的元素。对于一个二维数组,可以使用数组指针进行访问、初始化和赋值。例如: int arr[2][3…

    other 2023年6月25日
    00
  • JS实现禁止鼠标右键的功能

    实现禁止鼠标右键的功能,可以使用javascript来实现。下面我将详细讲解实现的完整攻略。 方法一:使用oncontextmenu事件 使用oncontextmenu事件可以方便地禁用鼠标右键。具体步骤如下: 在HTML文件中创建一个节点,例如一个div或者body元素,在这个节点上添加oncontextmenu事件属性。示例代码如下: <body …

    other 2023年6月27日
    00
  • 配置IP地址的批处理代码

    配置IP地址的批处理代码攻略 配置IP地址的批处理代码可以帮助你自动化网络配置过程,提高效率。下面是一个详细的攻略,包含了两个示例说明。 步骤1:了解IP地址的基本知识 在开始编写批处理代码之前,你需要了解一些IP地址的基本知识。IP地址由四个数字组成,每个数字的取值范围是0到255。例如,192.168.0.1是一个常见的IP地址。 步骤2:编写批处理代码…

    other 2023年7月30日
    00
  • oracle初始化参数设置

    Oracle初始化参数设置攻略 1. 了解Oracle初始化参数 在Oracle数据库中,初始化参数是数据库实例启动时的配置参数,可以通过设置这些参数来调整数据库实例的性能和行为。这些参数通常存储在参数文件(如SPFILE或PFILE)中,并根据需要修改。 Oracle数据库的所有初始化参数都是以特定的格式“参数名称 = 参数值”设置的。设置格式的具体方式取…

    other 2023年6月20日
    00
  • C语言学习笔记之字符串间的那些事

    下面我将为你详细讲解“C语言学习笔记之字符串间的那些事”的完整攻略。 一、什么是字符串? 字符串是由多个字符组成的连续序列,通常以空字符 ‘\0’ 结尾。在 C 语言中,字符串是使用字符数组来表示的,该数组的最后一个元素为 ‘\0’,即我们所说的字符串“结束符”。 示例一,请看下述代码,实现了定义字符串的基本方法: #include <stdio.h&…

    other 2023年6月20日
    00
  • 详解uniapp的全局变量实现方式

    详解uniapp的全局变量实现方式 在uniapp中,我们可以通过以下几种方式来实现全局变量的使用: 1. 使用Vue的原型链 Vue.js是uniapp的基础框架,它提供了一种简单的方式来实现全局变量。我们可以将需要全局访问的变量挂载到Vue的原型链上,这样在任何组件中都可以通过this关键字来访问这些变量。 示例代码如下: // main.js impo…

    other 2023年7月28日
    00
  • css框架(CSS Frameworks):CSS框架应用

    CSS框架(CSS Frameworks):CSS框架应用攻略 CSS框架是一种预先编写好的CSS代码集合,旨在简化网页开发过程。它们提供了一套可重用的样式和组件,使开发人员能够更快速地构建美观且一致的网页。下面是使用CSS框架的完整攻略,包括两个示例说明。 步骤1:选择合适的CSS框架 选择适合你项目需求的CSS框架是非常重要的。以下是一些流行的CSS框架…

    other 2023年9月5日
    00
  • 微信小程序动态的加载数据实例代码

    items: [], // 初始数据为空数组 page: 1, // 当前页码 pageSize: 3, // 每页加载的数据条数 }, onLoad() { // 渲染初始数据 this.renderData(); }, renderData() { // 获取要加载的数据 const startIndex = (this.data.page – 1) *…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部