react如何拖拽模態框

2021-10-25 03:14:34 字數 2383 閱讀 4290

實際開發中,模態框展現資料會經常出現.但不幸的是有時功能開發完了,ui同學突然提出需求希望模態框能拖拽.本文使用的模態框由 ant design 3.0 的 modal 元件封裝而成,如何在不修改原來**的基礎上實現拖拽呢.最終效果圖如下:

新建檔案modaldrag/index.js,將下面**copy進去

dragobj是具體拖拽的原生js**,後面再看

拖拽乙個元素通常需要傳入兩個引數.乙個是推拽後能移動的區域,對應著上圖中的整個匯出**控制項,控制項的類名為main_class.另外乙個是監聽拖拽的區域,對應著上圖中的頭部,只有當滑鼠在頭部按下時再移動才能拖動**.頭部的類名為title_class.兩個引數都從外部傳入.如果兩個引數都不傳,預設直接監聽child_node並拖拽child_node

import react from 'react';

import reactdom from 'react-dom';

import dragobj from './drag';

//main_class和title_class都是類名

export const draghoc = (innercomponent,main_class,title_class) =>

class extends react.component

init = () => `):child_node, //只拖拽類名為 $ 的div

title_class?child_node.queryselector(`.$`):child_node //當滑鼠按在類名為 $ 的div上時才允許拖拽);}

}, 0);

};componentwillunmount()

}render()

};

如果在實踐中發現拖拽無效,請務必將上面**中的child_node列印出來,觀察是否獲取到了真實的dom以及它內部是否渲染完整.如果沒有渲染完全,說明innercomponent包含非同步渲染的**,要等到渲染完畢後再進行拖拽事件繫結新建檔案modaldrag/drag.js,將下面**copy進去

下面是實現拖拽的原生**.主要負責對dom元素進行事件繫結以及改變位置等

export default class dragobj 

init()

destory()

bindevent()

movestart(e)

moving(e)

this.start_x1 = e.pagex;

this.start_y1 = e.pagey;

this.render();

} moveend(e)

this.state = false;

this.delta_x = this.start_x1 - this.start_x0 + this.delta_x;

this.delta_y = this.start_y1 - this.start_y0 + this.delta_y;

} render() px,$px)`;

}}

引入高階函式draghoc,引入需要增強的模態框元件toastexport

由於筆者在專案中使用 ant design 3.0 中的 modal 元件做模態框,讓其拖拽只需要傳遞類名 「ant-modal-content」 和 「ant-modal-header」.

其他場景需要根據靜態模態框元件的dom結構分析哪一部分是要移動的,哪一部分是監聽拖拽的,將這兩部分的類名作為引數傳入

import  from "./index.js";

import toastexport from "../components/toastexport/index.js";//引入靜態的模態框元件(使用者自已定義的模態框元件)

const toastexportv2 = draghoc(toastexport,"ant-modal-content","ant-modal-header"); //生成了具備拖拽功能的模態框元件

呼叫draghoc函式生成toastexportv2後,接下來就可以頁面上直接使用.如果業務上需要傳遞引數直接加在屬性上

const  = this.props;  //visible控制顯示隱藏模態框

呼叫時需要注意,當visible為true時再渲染toastexportv2,為了防止繫結事件時dom還沒開始渲染.visible為false時,元件銷毀會自動呼叫destory方法解綁已註冊的事件

高階拖拽(帶框拖拽)

右邊判斷div的left 瀏覽器的可視區clientwidth div的寬度,表示物體被拖出右邊 else if l document.documentelement.clientwidth div1.offsetwidth else if t document.documentelement.cl...

模態物件框

今天測試 本功能,用到模態對話方塊 就是彈出ie對話方塊後,必須關閉對話方塊才能操作瀏覽器其它頁面 貼出一些值得注意的地方,以後方便查閱。首先貼乙個window.showmodaldialog使用方法 vreturnvalue window.showmodaldialog surl vargumen...

react 拖拽連線外掛程式 react拖拽功能實現

因專案中有拖拽功能需求,於是乎在github上找到了react beautiful dnd這個react列表拖拽庫幫助我們實現甬道間拖拽,下面介紹一下react beautiful dnd基本的幾個api和實現方法。dragdropcontext 拖拽上下文。可拖拽的內容需包裹在dragdropco...