精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

這個17k star的拖拽庫有點料

開發 前端
近期在工作中遇到了一個新的需求,該需求需要實現某個組件的拖拽,面對這個需求的第一個項目肯定是問問度娘和用最大同性交友網站進行搜索,最終皇天不負有心人,讓我找到了這個17k star的React拖拽庫——React DnD。

一、背景

近期在工作中遇到了一個新的需求,該需求需要實現某個組件的拖拽,面對這個需求的第一個項目肯定是問問度娘和用最大同性交友網站進行搜索,最終皇天不負有心人,讓我找到了這個17k star的React拖拽庫——React DnD。

二、簡單使用

1、安裝

npm install react-dnd -S // react-dnd包,其核心包
npm install react-dnd-html5-backend -S // 拖拽的底層實現所需要的庫

2、三個核心點

通過使用React DnD這個庫,我認為里面最有用的部分包含一個組件和兩個Hook API,它們分別是:

  • DndProvider組件
  • useDrag函數
  • useDrop函數

(1)DndProvider組件

如果想讓某一內容使用React DnD的能力,需要將該部分用DndProvider進行包裹,其接收參數如下所示:

  • backend:必填。一個React DnD后端。目前官方文檔有三個,分別為:react-dnd-html5-backend、react-dnd-touch-backend、react-dnd-test-backend,但是常用的還是react-dnd-html5-backend。
  • context:可選的。用于配置后端的后端上下文。這取決于后端實現。
  • options:可選的。用于配置后端的選項對象。這取決于后端實現。

下面來一起看看該組件的簡單使用:

import {DndProvider} from 'react-dnd';
import {HTML5Backend} from 'react-dnd-html5-backend';

function App() {
  return (
    <div className="App">
      <DndProvider backend={HTML5Backend}>
        此處將放拖拽相關內容
      </DndProvider>
    </div>
  );
}

export default App;

(2)useDrag函數

既然知道了整個操縱空間,接下來需要了解的就是從什么位置進行拖拽,該庫提供了useDrag hook API,該元素可以讓一個DOM元素實現拖拽效果。

參數:

spec:創建規范對象的規范對象或函數,其詳細內容如下所示:

type:

必須,是一個字符串或Symbol,只有drop和此值相同才可以進行放置;

item:

必須,用于描述被拖動的數據

previewOptions:

可選的,一個簡單對象,用于描述拖動預覽選項;

options:

可選的,一個簡單對象

end(item, monitor):

可選的,當拖拽停止,該函數被調用;

canDrag(monitor):

可選的,使用它指定當前是否允許拖動;

isDragging(monitor):

可選的,默認情況下,只有啟動拖動操作的拖動源才被視為拖動;

collect:

可選的,監聽功能。

返回值:

返回值是一個數組,數組內容分別為:

collected:一個對象,包含從collect函數收集的屬性,如果collect未定義函數,則返回一個空對象;drag:拖動器的連接器功能,必須附加到DOM的可拖動部分;dragPreview:用于拖動預覽的連接器功能,可以附加到DOM的預覽部分;

與拖動部分建立連接:

通過ref屬性,將drag或dragPreview綁定到拖拽源上。

下面一起來看看useDrag部分的使用

import {useDrag} from 'react-dnd';

const SourceBox = props => {
    const {children} = props;

    /**
     * 返回的參數
     * collected:一個對象,包含從collect函數收集的屬性,如果collect未定義函數,則返回一個空對象
     * drag:拖動器的連接器功能,必須附加到DOM的可拖動部分
     * dragPreview:用于拖動預覽的連接器功能,可以附加到DOM的預覽部分
     */
    const [collected, drag, dragPreview] = useDrag({
        // 只有drop和此值相同才可以進行放置
        type: 'box',
        // 描述要拖動的數據
        item: {
            detail: '我是可以拖動的數據!!!'
        },
        // 拖動停止的手end將會被調用
        end: (item, monitor) => {
            // getDropResult()獲取釋放后的結果
            console.log('monitor.getDropResult():', monitor.getDropResult());
            // source是否已經drop在target
            console.log('monitor.didDrop()', monitor.didDrop());
        },
        // 指定當前是否允許拖動,默認允許
        canDrag: monitor => {
            return true;
        },
        // 監聽功能
        collect: (monitor, props) => {
            return {
                isDragging: monitor.isDragging()
            };
        }
    });
    return (
        <div ref={drag}>
            {children}
        </div>
    );
};

export default SourceBox;

(3)useDrop函數

為了將內容放置到目標位置,提供了useDrop函數,如下所示:

參數:

spec:創建規范對象的規范對象或函數,其詳細內容如下所示:

accept:

必須,一個字符串,此放置目標將僅對于指定類型的拖動源產生的項目作出反應。

options:

可選的,一個普通的對象。

drop(item,monitor):

可選的,當兼容項目放在目標時被調用。

hover(item,monitor):

可選的,將項目懸停在組件時調用。

canDrop(item,monitor):

可選的,用它來指定放置目標是否接受該拖拽內容。

collect:

可選的,監聽功能。

返回值:

返回值是一個數組,數組內容分別為:

collected:一個對象,包含從collect函數收集的屬性,如果collect未定義函數,則返回一個空對象;drop:一個用于放置目標的連接器函數,必須附加到DOM的放置部分;

與放置部分建立連接:

通過ref屬性,將drop與放置部分建立連接。

下面一起來看看useDrop部分的使用

import {useDrop} from "react-dnd";

const TargetBox = () => {
    const [collected, drop] = useDrop({
        //  此放置目標將僅對于指定類型的拖動源產生的項目作出反應
        accept: 'box',
        // 當兼容項目放在目標時調用
        drop: (item, monitor) => {
            console.log('我已經被放到目標!!!')
        },
        // 監聽功能
        collect: monitor => {
            return {
                // 是否重疊
                isOver: monitor.isOver(),
                // 是否可以放置
                canDrop: monitor.canDrop(),
                item: monitor.getItem(),
                didDrop: monitor.didDrop()
            };
        }
    });

    return (
        <div ref={drop}>
            <div className="targetBox">
                這是放置的區塊
            </div>
        </div>
    );
};

export default TargetBox;

3、monitor詳細內容

useDrag和useDrop上掛載了很多選項,這些選項中很多存在monitor對象,該對象上掛載了很多方法,下面就簡要概述幾個主要方法,如下所示:

drag上的monitor上的方法:

drop上的monitor上的方法:

三、效果圖

拖拽前:

拖拽中:

拖拽中拖拽的內容跟隨鼠標移動。

拖拽后:

拖拽釋放鼠標后,一些內容被打印出來,打印的結果是先輸出drop中的內容再輸出end中的內容,所以我們想做一些處理最后在SourceBox中進行處理,如果在drop中改變React相關的數據會報錯。

四、學習感悟

這個庫的資料千篇一律,在使用過程中遇到了一些坑,接下來與各位老鐵分享一下這些坑,防止后續深陷其中。

  • end方法的調用時機晚于drop的調用時機,所以只有在end中做釋放后的數據處理才能保證系統的正確性,如果在drop中就更新state或React redux中數據,會引發錯誤;
  • item數據是從Drag到Drop之間的橋梁,在drag中定義的item數據可以通過monitor.getItem()獲取;
  • drop回調的返回值是從Drop到Drag之間的橋梁,在end中可以通過monitor.getDropResult()其返回值;
  • 一些掛載在monitor上的位置函數并不一定適用于所有的場景,需要引入DOM相關的位置操作。
責任編輯:姜華 來源: 前端點線面
相關推薦

2022-01-10 06:52:59

拖拽庫項目搜索

2025-06-17 15:28:03

智能體AI開源

2020-12-14 05:57:01

clipboard.Selection execCommand

2024-08-26 09:36:06

2022-02-10 20:09:24

Dubbo源碼Provider

2021-11-26 05:19:52

AI初創公司人工智能

2022-07-07 10:46:51

數據處理

2014-09-17 14:05:14

2022-02-28 16:19:17

數據孤島

2019-04-24 09:25:14

Python編程語言代碼

2020-12-31 10:47:03

開發Vuejs技術

2013-09-16 11:04:23

大數據大數據發展

2020-11-02 14:49:46

GitHub Java圖片

2021-03-09 08:00:13

設計秒殺TPS

2013-09-17 10:04:36

大數據西大荒

2013-01-06 12:57:23

2022-07-18 15:48:43

數據庫開源工具

2025-04-29 08:14:14

2022-07-27 09:00:26

前端拖拽排序庫

2020-08-26 08:09:21

廁所物聯網IOT
點贊
收藏

51CTO技術棧公眾號

强制高潮抽搐sm调教高h| 亚洲国产成人精品无码区99| 亚洲怡红院av| 国一区二区在线观看| 精品亚洲一区二区| 在线看的黄色网址| xxxx视频在线| 国产日韩精品视频一区| 亚洲综合小说区| 手机在线看片1024| 欧美久久一级| 在线观看日韩av| 四虎成人免费视频| 69堂精品视频在线播放| 亚洲一卡二卡三卡四卡五卡| 日韩av电影免费播放| 国产chinasex对白videos麻豆| 国产精品呻吟| 九九九久久久久久| 美国黄色特级片| 美国成人xxx| 欧美二区乱c少妇| 99久久久无码国产精品6| 超碰在线观看免费| 欧美精彩视频一区二区三区| 精品国产aⅴ麻豆| 国产三级第一页| 日韩电影免费在线| 欧美最顶级丰满的aⅴ艳星| 一级黄色录像视频| 欧美激情偷拍自拍| 亚洲天堂免费观看| 鲁大师私人影院在线观看| 精品一区二区三区亚洲| 欧美三级电影一区| 欧美黄色免费影院| av资源新版天堂在线| 亚洲欧美另类小说视频| 亚欧精品在线| 伦理片一区二区三区| 成人av在线观| 肥熟一91porny丨九色丨| 国产精品毛片一区视频播 | 国产一级不卡视频| 国产黄色在线网站| 亚洲日穴在线视频| 中文字幕中文字幕99| av在线电影网| 国产精品三级电影| 亚洲欧洲一区二区在线观看| 成人午夜影视| 国产精品久久看| 椎名由奈jux491在线播放| 国产福利第一视频在线播放| 久久久精品蜜桃| 日本一区二区三区视频在线播放| 噜噜噜在线观看播放视频| 久久久久国产精品厨房| 日韩欧美一区二区视频在线播放| 男生女生差差差的视频在线观看| 久久久精品天堂| 日本免费高清一区二区| 超碰免费97在线观看| 国产精品视频yy9299一区| 亚洲国产欧美不卡在线观看 | 北条麻妃69av| 国产精品迅雷| 欧美三级韩国三级日本三斤| 亚洲色图偷拍视频| silk一区二区三区精品视频| 精品国产凹凸成av人网站| 国产国语性生话播放| 精品国产一区二区三区| 中文字幕一区日韩电影| 国精品无码一区二区三区| 国产精品草草| 欧美整片在线观看| 亚洲综合一区中| 国产凹凸在线观看一区二区| 精品国产一区二区三区四区精华 | 精品久久国产视频| 成人免费视频视频| 欧美污视频久久久| 麻豆传媒在线观看| 午夜视频一区在线观看| 日批视频在线免费看| 欧美a视频在线| 亚洲成人aaa| 国产aaaaaaaaa| 国产精品www994| 国产国产精品人在线视| 国产又粗又猛又爽又黄91| 99精品在线观看视频| 天天久久人人| 成人av影院在线观看| 在线视频一区二区三区| 日本中文字幕有码| 精品高清久久| 久久久久久av| 亚洲无码精品在线播放| 不卡的av电影在线观看| 伊人情人网综合| 欧美gv在线观看| 91精品婷婷国产综合久久性色| av电影在线播放| 成人嫩草影院| 羞羞色国产精品| 91在线视频国产| 久久美女艺术照精彩视频福利播放| 永久免费在线看片视频| 日韩免费va| 欧美va亚洲va在线观看蝴蝶网| 天天躁日日躁aaaxxⅹ| 欧美另类视频| 国产日韩欧美一二三区| 深夜福利免费在线观看| 一区二区三区不卡在线观看| 丝袜制服一区二区三区| 特黄特色欧美大片| 久久久久久综合网天天| 国产手机视频在线| 邪恶网站在线观看| 米奇777四色精品人人爽| 精品久久久久久国产91| 在线观看免费av网址| 日韩电影在线观看完整免费观看| y97精品国产97久久久久久| 女人十八岁毛片| 国产成人午夜电影网| 在线国产伦理一区| 成人自拍视频网| 亚洲性69xxxbbb| 国产精品一区二区三区四| 国产成人精品免费| av中文字幕av| 素人啪啪色综合| 国产一区二区久久精品| 免费av网站在线| 91污片在线观看| 国产中文字幕二区| 超碰一区二区三区| 高清欧美性猛交xxxx| 精品人妻一区二区三区三区四区 | 日本黄色免费片| 免费在线欧美视频| 亚洲国产日韩综合一区| 国产一区二区色噜噜| 国产一区二区三区丝袜| 波多野结衣电车痴汉| 久久久久国色av免费看影院| 日本成年人网址| 中文字幕av一区二区三区人| 欧洲精品久久久| 蜜芽tv福利在线视频| 91激情五月电影| 国产福利在线导航| 精品午夜一区二区三区在线观看| 一区二区在线观看网站| 国产精品日韩精品在线播放 | 日韩影视精品| 免费高清视频在线一区| 少妇av一区二区三区| 国产精品久久久久久久久久久久久久久久 | 国产一区二区三区色淫影院| 9765激情中文在线| 亚洲精品狠狠操| 久久精品五月天| 成人免费在线视频| 国产a√精品区二区三区四区| 精品91在线| 久久一区二区精品| 欧美色999| 久久中文字幕视频| 噜噜噜久久,亚洲精品国产品| 欧美日韩精品在线播放| 久久亚洲AV无码专区成人国产| 蜜臀a∨国产成人精品| youjizz.com亚洲| 中文字幕亚洲在线观看| 奇米四色中文综合久久| 91在线不卡| 欧美成人a视频| 日韩综合在线观看| 亚洲猫色日本管| 一区二区免费在线观看视频| 日韩不卡在线观看日韩不卡视频| 男人草女人视频| 欧美调教在线| 国产日韩欧美自拍| 黄毛片在线观看| 日韩中文字幕第一页| 亚洲av无码国产综合专区| 色偷偷一区二区三区| 成人免费黄色小视频| 92精品国产成人观看免费| 日韩一区二区三区不卡视频| 亚洲网站啪啪| 亚洲欧洲精品一区| 欧美黄色影院| 成人久久久久久久| 日韩av中字| 欧美丰满老妇厨房牲生活| 超碰在线国产| 日韩电影中文 亚洲精品乱码 | 日韩免费在线观看| 亚洲av无码不卡| 亚洲国产精品人人做人人爽| 欧美日韩中文字幕视频| 成人午夜激情影院| 男女污污视频网站| 久久九九免费| 精品国产av无码一区二区三区| 清纯唯美亚洲综合一区| 99久久综合狠狠综合久久止| 亚洲欧美在线成人| 欧美亚洲在线视频| 美女91在线| 久久精品久久久久久| 激情福利在线| 亚洲精品99久久久久中文字幕| 97人人爽人人爽人人爽| 91国产免费观看| 日本免费观看视| 亚洲综合一二区| 五月天色婷婷丁香| 欧美激情在线看| 亚洲精品成人无码熟妇在线| 国产成人免费视频一区| www.51色.com| 久草在线在线精品观看| 天堂网在线免费观看| 久久精品动漫| 青青青在线播放| 午夜一区二区三区不卡视频| 黄色成人在线看| 精品69视频一区二区三区Q| 亚洲中文字幕无码一区二区三区 | www.射射射| 国产精品草草| 国产精品久久久久久久乖乖| 欧美日本一区| www.18av.com| 综合视频在线| 成人国产在线看| 欧美午夜电影在线观看| 青青在线免费观看| 99精品国产一区二区青青牛奶| 国产一级爱c视频| av成人激情| 久草青青在线观看| 天堂久久一区二区三区| www.涩涩涩| 久久超碰97人人做人人爱| 亚洲一区精品视频在线观看| 国产一区二区不卡| 亚洲成人av免费观看| 福利91精品一区二区三区| 少妇搡bbbb搡bbb搡打电话| 国产精品夜夜嗨| 精品人妻二区中文字幕| 99精品视频在线免费观看| 精品无码在线视频| 久久久久久免费网| 在线观看日本黄色| 亚洲人成7777| 久久久久久久伊人| 欧美性生交大片免费| 成人免费视频国产免费| 欧美日韩国产色站一区二区三区| 国产精品久久久久久免费免熟| 日韩视频免费观看高清完整版在线观看 | av免费在线视| 日本久久久久久久久| 全球最大av网站久久| 亚洲综合国产精品| 日韩精品导航| 先锋影音日韩| 午夜日韩在线| 日韩欧美在线播放视频| 毛片一区二区三区| 91九色蝌蚪porny| 久久久高清一区二区三区| 天天色影综合网| 婷婷久久综合九色国产成人 | 日韩高清在线不卡| 在线免费黄色网| 99综合电影在线视频| 大胸美女被爆操| 亚洲综合色网站| 欧美三级网站在线观看| 日韩欧美精品三级| 国产专区在线| 欧美高清视频在线播放| 欧美日韩五码| 亚洲一区二区三区777| 亚洲制服欧美另类| 91看片淫黄大片91| 三级久久三级久久久| 麻豆传媒在线看| 国产亚洲欧美激情| 日本熟妇成熟毛茸茸| 欧美日韩黄色影视| 五月天丁香视频| 久久亚洲国产成人| 日韩一区二区三区免费| 高清免费日韩| 一区二区三区在线电影| 国产免费视频传媒| 成人国产精品免费网站| 欧美色视频一区二区三区在线观看| 性久久久久久久久久久久| 97超碰人人草| 国产午夜精品免费一区二区三区| 欧美精品videosex| 成人激情免费在线| 精品国产91| 国产精品无码av在线播放| 国产酒店精品激情| 国产午夜精品福利视频| 狠狠躁天天躁日日躁欧美| 精品人妻一区二区三区日产乱码| 自拍偷拍亚洲区| 成人在线网站| 免费久久99精品国产自| 亚洲精品偷拍| 美国黄色一级视频| 亚洲激情图片qvod| 国产免费叼嘿网站免费| 色偷偷88888欧美精品久久久| 超碰aⅴ人人做人人爽欧美| 国产一区二区在线网站| 午夜日韩激情| 日本黄色大片在线观看| 亚洲精品国产a| av观看在线免费| 久久国产精品网站| 日韩精品一区国产| 国产精品一二三在线观看| 精品一区二区三区视频在线观看 | 日韩在线理论| 超碰超碰在线观看| 中文字幕va一区二区三区| 久久精品国产亚洲av麻豆蜜芽| 国产手机视频精品| 自拍网站在线观看| 日本精品一区二区三区不卡无字幕| 亚洲一区观看| 欧美特级黄色录像| 欧美在线free| 午夜激情视频在线| 91在线看www| 欧美一区国产在线| 成年人性生活视频| 亚洲国产cao| 亚洲欧洲成人在线| 热久久免费视频精品| av亚洲免费| 蜜臀一区二区三区精品免费视频 | 亚洲视频777| 福利一区二区三区视频在线观看| 亚洲欧美丝袜| 国产精品综合久久| 国产第一页第二页| 国产午夜精品理论片a级探花| 精品网站在线| 国产奶头好大揉着好爽视频| 国产·精品毛片| 91av在线免费视频| 亚洲色图美腿丝袜| 91精品麻豆| 欧美日韩福利在线| 久久久国产一区二区三区四区小说 | bestiality新另类大全| 懂色av一区二区三区在线播放| 亚洲精品乱码| 免费观看a级片| 欧美一级艳片视频免费观看| 成年人在线网站| 日本在线高清视频一区| 国产一区二区三区观看| 国产一区二区三区影院| 在线观看日韩专区| 97se亚洲国产一区二区三区| 一本久道综合色婷婷五月| 国产精品传媒视频| 日韩在线视频免费| 国产精品视频资源| 亚洲激情影院| 999久久久国产| 亚洲黄一区二区| 经典三级一区二区| 中文精品无码中文字幕无码专区 | 国产福利一区在线| 色屁屁影院www国产高清麻豆| 日韩在线免费av| 久久久伦理片| 一级做a免费视频| 一本一道波多野结衣一区二区| 精品麻豆一区二区三区 | 美女被爆操网站|