AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

這個(gè)17k star的拖拽庫(kù)有點(diǎn)料

來(lái)源: 責(zé)編: 時(shí)間:2023-12-21 17:11:52 250觀看
導(dǎo)讀一、背景近期在工作中遇到了一個(gè)新的需求,該需求需要實(shí)現(xiàn)某個(gè)組件的拖拽,面對(duì)這個(gè)需求的第一個(gè)項(xiàng)目肯定是問(wèn)問(wèn)度娘和用最大同性交友網(wǎng)站進(jìn)行搜索,最終皇天不負(fù)有心人,讓我找到了這個(gè)17k star的React拖拽庫(kù)——React DnD。

O3728資訊網(wǎng)——每日最新資訊28at.com

一、背景

近期在工作中遇到了一個(gè)新的需求,該需求需要實(shí)現(xiàn)某個(gè)組件的拖拽,面對(duì)這個(gè)需求的第一個(gè)項(xiàng)目肯定是問(wèn)問(wèn)度娘和用最大同性交友網(wǎng)站進(jìn)行搜索,最終皇天不負(fù)有心人,讓我找到了這個(gè)17k star的React拖拽庫(kù)——React DnD。O3728資訊網(wǎng)——每日最新資訊28at.com

二、簡(jiǎn)單使用

1、安裝

npm install react-dnd -S // react-dnd包,其核心包npm install react-dnd-html5-backend -S // 拖拽的底層實(shí)現(xiàn)所需要的庫(kù)

2、三個(gè)核心點(diǎn)

通過(guò)使用React DnD這個(gè)庫(kù),我認(rèn)為里面最有用的部分包含一個(gè)組件和兩個(gè)Hook API,它們分別是:O3728資訊網(wǎng)——每日最新資訊28at.com

  • DndProvider組件
  • useDrag函數(shù)
  • useDrop函數(shù)

(1)DndProvider組件

如果想讓某一內(nèi)容使用React DnD的能力,需要將該部分用DndProvider進(jìn)行包裹,其接收參數(shù)如下所示:O3728資訊網(wǎng)——每日最新資訊28at.com

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

下面來(lái)一起看看該組件的簡(jiǎn)單使用:O3728資訊網(wǎng)——每日最新資訊28at.com

import {DndProvider} from 'react-dnd';import {HTML5Backend} from 'react-dnd-html5-backend';function App() {  return (    <div className="App">      <DndProvider backend={HTML5Backend}>        此處將放拖拽相關(guān)內(nèi)容      </DndProvider>    </div>  );}export default App;

(2)useDrag函數(shù)

既然知道了整個(gè)操縱空間,接下來(lái)需要了解的就是從什么位置進(jìn)行拖拽,該庫(kù)提供了useDrag hook API,該元素可以讓一個(gè)DOM元素實(shí)現(xiàn)拖拽效果。O3728資訊網(wǎng)——每日最新資訊28at.com

參數(shù):O3728資訊網(wǎng)——每日最新資訊28at.com

spec:創(chuàng)建規(guī)范對(duì)象的規(guī)范對(duì)象或函數(shù),其詳細(xì)內(nèi)容如下所示:O3728資訊網(wǎng)——每日最新資訊28at.com

type:O3728資訊網(wǎng)——每日最新資訊28at.com

必須,是一個(gè)字符串或Symbol,只有drop和此值相同才可以進(jìn)行放置;O3728資訊網(wǎng)——每日最新資訊28at.com

item:O3728資訊網(wǎng)——每日最新資訊28at.com

必須,用于描述被拖動(dòng)的數(shù)據(jù)O3728資訊網(wǎng)——每日最新資訊28at.com

previewOptions:O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,一個(gè)簡(jiǎn)單對(duì)象,用于描述拖動(dòng)預(yù)覽選項(xiàng);O3728資訊網(wǎng)——每日最新資訊28at.com

options:O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,一個(gè)簡(jiǎn)單對(duì)象O3728資訊網(wǎng)——每日最新資訊28at.com

end(item, monitor):O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,當(dāng)拖拽停止,該函數(shù)被調(diào)用;O3728資訊網(wǎng)——每日最新資訊28at.com

canDrag(monitor):O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,使用它指定當(dāng)前是否允許拖動(dòng);O3728資訊網(wǎng)——每日最新資訊28at.com

isDragging(monitor):O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,默認(rèn)情況下,只有啟動(dòng)拖動(dòng)操作的拖動(dòng)源才被視為拖動(dòng);O3728資訊網(wǎng)——每日最新資訊28at.com

collect:O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,監(jiān)聽(tīng)功能。O3728資訊網(wǎng)——每日最新資訊28at.com

返回值:O3728資訊網(wǎng)——每日最新資訊28at.com

返回值是一個(gè)數(shù)組,數(shù)組內(nèi)容分別為:O3728資訊網(wǎng)——每日最新資訊28at.com

collected:一個(gè)對(duì)象,包含從collect函數(shù)收集的屬性,如果collect未定義函數(shù),則返回一個(gè)空對(duì)象;drag:拖動(dòng)器的連接器功能,必須附加到DOM的可拖動(dòng)部分;dragPreview:用于拖動(dòng)預(yù)覽的連接器功能,可以附加到DOM的預(yù)覽部分;O3728資訊網(wǎng)——每日最新資訊28at.com

與拖動(dòng)部分建立連接:O3728資訊網(wǎng)——每日最新資訊28at.com

通過(guò)ref屬性,將drag或dragPreview綁定到拖拽源上。O3728資訊網(wǎng)——每日最新資訊28at.com

下面一起來(lái)看看useDrag部分的使用O3728資訊網(wǎng)——每日最新資訊28at.com

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

(3)useDrop函數(shù)

為了將內(nèi)容放置到目標(biāo)位置,提供了useDrop函數(shù),如下所示:O3728資訊網(wǎng)——每日最新資訊28at.com

參數(shù):O3728資訊網(wǎng)——每日最新資訊28at.com

spec:創(chuàng)建規(guī)范對(duì)象的規(guī)范對(duì)象或函數(shù),其詳細(xì)內(nèi)容如下所示:O3728資訊網(wǎng)——每日最新資訊28at.com

accept:O3728資訊網(wǎng)——每日最新資訊28at.com

必須,一個(gè)字符串,此放置目標(biāo)將僅對(duì)于指定類(lèi)型的拖動(dòng)源產(chǎn)生的項(xiàng)目作出反應(yīng)。O3728資訊網(wǎng)——每日最新資訊28at.com

options:O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,一個(gè)普通的對(duì)象。O3728資訊網(wǎng)——每日最新資訊28at.com

drop(item,monitor):O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,當(dāng)兼容項(xiàng)目放在目標(biāo)時(shí)被調(diào)用。O3728資訊網(wǎng)——每日最新資訊28at.com

hover(item,monitor):O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,將項(xiàng)目懸停在組件時(shí)調(diào)用。O3728資訊網(wǎng)——每日最新資訊28at.com

canDrop(item,monitor):O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,用它來(lái)指定放置目標(biāo)是否接受該拖拽內(nèi)容。O3728資訊網(wǎng)——每日最新資訊28at.com

collect:O3728資訊網(wǎng)——每日最新資訊28at.com

可選的,監(jiān)聽(tīng)功能。O3728資訊網(wǎng)——每日最新資訊28at.com

返回值:O3728資訊網(wǎng)——每日最新資訊28at.com

返回值是一個(gè)數(shù)組,數(shù)組內(nèi)容分別為:O3728資訊網(wǎng)——每日最新資訊28at.com

collected:一個(gè)對(duì)象,包含從collect函數(shù)收集的屬性,如果collect未定義函數(shù),則返回一個(gè)空對(duì)象;drop:一個(gè)用于放置目標(biāo)的連接器函數(shù),必須附加到DOM的放置部分;O3728資訊網(wǎng)——每日最新資訊28at.com

與放置部分建立連接:O3728資訊網(wǎng)——每日最新資訊28at.com

通過(guò)ref屬性,將drop與放置部分建立連接。O3728資訊網(wǎng)——每日最新資訊28at.com

下面一起來(lái)看看useDrop部分的使用O3728資訊網(wǎng)——每日最新資訊28at.com

import {useDrop} from "react-dnd";const TargetBox = () => {    const [collected, drop] = useDrop({        //  此放置目標(biāo)將僅對(duì)于指定類(lèi)型的拖動(dòng)源產(chǎn)生的項(xiàng)目作出反應(yīng)        accept: 'box',        // 當(dāng)兼容項(xiàng)目放在目標(biāo)時(shí)調(diào)用        drop: (item, monitor) => {            console.log('我已經(jīng)被放到目標(biāo)!!!')        },        // 監(jiān)聽(tīng)功能        collect: monitor => {            return {                // 是否重疊                isOver: monitor.isOver(),                // 是否可以放置                canDrop: monitor.canDrop(),                item: monitor.getItem(),                didDrop: monitor.didDrop()            };        }    });    return (        <div ref={drop}>            <div className="targetBox">                這是放置的區(qū)塊            </div>        </div>    );};export default TargetBox;

3、monitor詳細(xì)內(nèi)容

useDrag和useDrop上掛載了很多選項(xiàng),這些選項(xiàng)中很多存在monitor對(duì)象,該對(duì)象上掛載了很多方法,下面就簡(jiǎn)要概述幾個(gè)主要方法,如下所示:O3728資訊網(wǎng)——每日最新資訊28at.com

drag上的monitor上的方法:O3728資訊網(wǎng)——每日最新資訊28at.com

O3728資訊網(wǎng)——每日最新資訊28at.com

drop上的monitor上的方法:O3728資訊網(wǎng)——每日最新資訊28at.com

O3728資訊網(wǎng)——每日最新資訊28at.com

三、效果圖

拖拽前:O3728資訊網(wǎng)——每日最新資訊28at.com

O3728資訊網(wǎng)——每日最新資訊28at.com

拖拽中:O3728資訊網(wǎng)——每日最新資訊28at.com

拖拽中拖拽的內(nèi)容跟隨鼠標(biāo)移動(dòng)。O3728資訊網(wǎng)——每日最新資訊28at.com

O3728資訊網(wǎng)——每日最新資訊28at.com

拖拽后:O3728資訊網(wǎng)——每日最新資訊28at.com

拖拽釋放鼠標(biāo)后,一些內(nèi)容被打印出來(lái),打印的結(jié)果是先輸出drop中的內(nèi)容再輸出end中的內(nèi)容,所以我們想做一些處理最后在SourceBox中進(jìn)行處理,如果在drop中改變React相關(guān)的數(shù)據(jù)會(huì)報(bào)錯(cuò)。O3728資訊網(wǎng)——每日最新資訊28at.com

O3728資訊網(wǎng)——每日最新資訊28at.com

四、學(xué)習(xí)感悟

這個(gè)庫(kù)的資料千篇一律,在使用過(guò)程中遇到了一些坑,接下來(lái)與各位老鐵分享一下這些坑,防止后續(xù)深陷其中。O3728資訊網(wǎng)——每日最新資訊28at.com

  • end方法的調(diào)用時(shí)機(jī)晚于drop的調(diào)用時(shí)機(jī),所以只有在end中做釋放后的數(shù)據(jù)處理才能保證系統(tǒng)的正確性,如果在drop中就更新state或React redux中數(shù)據(jù),會(huì)引發(fā)錯(cuò)誤;
  • item數(shù)據(jù)是從Drag到Drop之間的橋梁,在drag中定義的item數(shù)據(jù)可以通過(guò)monitor.getItem()獲取;
  • drop回調(diào)的返回值是從Drop到Drag之間的橋梁,在end中可以通過(guò)monitor.getDropResult()其返回值;
  • 一些掛載在monitor上的位置函數(shù)并不一定適用于所有的場(chǎng)景,需要引入DOM相關(guān)的位置操作。

本文鏈接:http://www.tebozhan.com/showinfo-26-51254-0.html這個(gè)17k star的拖拽庫(kù)有點(diǎn)料

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: FileProvider共享文件和訪問(wèn)文件的內(nèi)容提供者

下一篇: 一文搞懂 Java8 reduce操作

標(biāo)簽:
  • 熱門(mén)焦點(diǎn)
  • 中興AX5400Pro+上手體驗(yàn):再升級(jí) 雙2.5G網(wǎng)口+USB 3.0這次全都有

    2021年11月的時(shí)候,中興先后發(fā)布了兩款路由器產(chǎn)品,中興AX5400和中興AX5400 Pro,從產(chǎn)品命名上就不難看出這是隸屬于同一系列的,但在外觀設(shè)計(jì)上這兩款產(chǎn)品可以說(shuō)是完全沒(méi)一點(diǎn)關(guān)系
  • 5月安卓手機(jī)好評(píng)榜:魅族20 Pro奪冠

    性能榜和性?xún)r(jià)比榜之后,我們來(lái)看最后的安卓手機(jī)好評(píng)榜,數(shù)據(jù)來(lái)源安兔兔評(píng)測(cè),收集時(shí)間2023年5月1日至5月31日,僅限國(guó)內(nèi)市場(chǎng)。第一名:魅族20 Pro好評(píng)率:97.50%不得不感慨魅族老品牌還
  • 5月iOS設(shè)備好評(píng)榜:iPhone 14僅排第43?

    來(lái)到新的一月,安兔兔的各個(gè)榜單又重新匯總了數(shù)據(jù),像安卓陣營(yíng)的榜單都有著比較大的變動(dòng),不過(guò)iOS由于設(shè)備的更新?lián)Q代并沒(méi)有那么快,所以相對(duì)來(lái)說(shuō)變化并不大,特別是iOS好評(píng)榜,老款設(shè)
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買(mǎi)Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來(lái)官方優(yōu)惠,到手價(jià)12999元,比發(fā)布價(jià)便宜了7000元,在大屏電視市場(chǎng)開(kāi)卷。據(jù)了解,Redmi MAX 100
  • 零售大模型“干中學(xué)”,攀爬數(shù)字化珠峰

    文/侯煜編輯/cc來(lái)源/華爾街科技眼對(duì)于絕大多數(shù)登山愛(ài)好者而言,攀爬珠穆朗瑪峰可謂終極目標(biāo)。攀登珠峰的商業(yè)路線有兩條,一是尼泊爾境內(nèi)的南坡路線,一是中國(guó)境內(nèi)的北坡路線。相
  • 2023年,我眼中的字節(jié)跳動(dòng)

    此時(shí)此刻(2023年7月),字節(jié)跳動(dòng)從未上市,也從未公布過(guò)任何官方的上市計(jì)劃;但是這并不妨礙它成為中國(guó)最受關(guān)注的互聯(lián)網(wǎng)公司之一。從2016-17年的抖音強(qiáng)勢(shì)崛起,到2018年的&ldquo;頭騰
  • 當(dāng)家的盒馬,加速謀生

    來(lái)源 | 價(jià)值星球Planet作者 | 歸去來(lái)自己&ldquo;當(dāng)家&rdquo;的盒馬,開(kāi)始加速謀生了。據(jù)盒馬官微消息,盒馬計(jì)劃今年開(kāi)放生鮮供應(yīng)鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 三星電子Q2營(yíng)收60萬(wàn)億韓元 存儲(chǔ)業(yè)務(wù)營(yíng)收同比仍下滑超過(guò)50%

    7月27日消息,據(jù)外媒報(bào)道,從三星電子所發(fā)布的財(cái)報(bào)來(lái)看,他們主要利潤(rùn)來(lái)源的存儲(chǔ)芯片業(yè)務(wù)在今年二季度仍不樂(lè)觀,營(yíng)收同比仍在大幅下滑,所在的設(shè)備解決方案
  • 中關(guān)村論壇11月25日開(kāi)幕,15位諾獎(jiǎng)級(jí)大咖將發(fā)表演講

    11月18日,記者從2022中關(guān)村論壇新聞發(fā)布會(huì)上獲悉,中關(guān)村論壇將于11月25至30日在京舉行。本屆中關(guān)村論壇由科學(xué)技術(shù)部、國(guó)家發(fā)展改革委、工業(yè)和信息化部、國(guó)務(wù)
Top