react实现拖拽模态框

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日

相关文章

  • 在android中ScrollView嵌套ScrollView解决方案

    在Android中,ScrollView是一个常用的滚动视图容器,用于在屏幕上显示超出屏幕范围的内容。然而,ScrollView本身不支持嵌套,即在一个ScrollView中再嵌套一个ScrollView会导致滚动冲突的问题。本攻略将介绍如何解决在Android中嵌套ScrollView的问题。 解决方案一:使用NestedScrollView Androi…

    other 2023年7月28日
    00
  • 苹果iOS 13.3/iPadOS 13.3开发者预览版Beta2推送 iOS13.3 beta2更新内容汇总

    苹果iOS 13.3/iPadOS 13.3开发者预览版Beta2推送 iOS13.3 beta2更新内容汇总 简介 本次推送的是苹果iOS 13.3/iPadOS 13.3开发者预览版Beta2,是一次针对开发者的测试版本。本文将对iOS13.3 beta2的更新内容和使用方法进行详细的介绍。 更新内容 修复了iCloud Backup的问题 在iOS 1…

    other 2023年6月26日
    00
  • 学习使用Bootstrap页面排版样式

    学习使用Bootstrap页面排版样式攻略 Bootstrap是一个流行的前端开发框架,它提供了一套强大的页面排版样式,可以帮助开发者快速构建美观且响应式的网页。下面是学习使用Bootstrap页面排版样式的完整攻略。 步骤一:引入Bootstrap 首先,你需要在你的HTML文件中引入Bootstrap。你可以通过以下方式引入: <!DOCTYPE …

    other 2023年8月18日
    00
  • 如何修改Vue打包后文件的接口地址配置的方法

    修改Vue打包后文件的接口地址配置有以下几个步骤: 打开项目根目录下的vue.config.js文件,如果没有就新建一个。这个文件是用来配置Vue打包的一些参数的,我们需要在里面写入我们的配置内容。 在vue.config.js文件中进行配置,具体配置如下: module.exports = { devServer: { proxy: { // 配置代理 ‘…

    other 2023年6月25日
    00
  • 苹果 macOS 14 开发者预览版 Beta 2 今日发布(附更新内容汇总)

    苹果 macOS 14 开发者预览版 Beta 2 今日发布(附更新内容汇总) 简介 苹果公司在今天发布了 macOS 14 开发者预览版 Beta 2,新版系统主要针对开发者测试和体验,同时也包含了一些新功能和更新。在本文中,我们将向大家介绍这个版本的更新内容和特点,以及在更新过程中需要注意的问题和注意事项。 更新内容 新增软件功能:新增了“图书馆”功能,…

    other 2023年6月26日
    00
  • feign参数过多导致调用失败的解决方案

    当使用Feign调用服务端接口时,由于参数过多而导致调用失败的情况比较常见。在此提供以下解决方案: 方案一:POST请求 通过将请求方式由GET改为POST,可以解决参数过多导致调用失败的问题。 示例代码: @FeignClient(name = "sample") public interface SampleFeignClient {…

    other 2023年6月27日
    00
  • Python单例模式实例详解

    Python单例模式实例详解 单例模式是一种常见的设计模式之一,它保证一个类有且只有一个实例,并且提供了一个全局访问点。Python中可以用多种方式实现单例模式,比如使用模块、装饰器、元类等。接下来我们分别介绍这三种方式的实现方法,并给出示例说明。 使用模块实现单例模式 Python中的模块天生就是单例的,因为导入一个模块时,模块只会被加载一次并且一直可用。…

    other 2023年6月27日
    00
  • office 2016官网下载地址 office2016破解版下载

    Office 2016官网下载地址及破解版下载攻略 1. Office 2016官网下载地址 要下载Office 2016的官方版本,可以按照以下步骤进行: 打开浏览器,访问Microsoft官方网站:https://www.microsoft.com。 在网站的搜索栏中输入\”Office 2016\”,然后按下回车键。 在搜索结果中,找到并点击\”Off…

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