useDraggable
和useDroppable
之類的鉤子。並且不會強迫您重新建構應用程式或建立額外的包裝 DOM 節點。@dnd-kit/sortable
,它是建構在@dnd-kit/core
之上的薄層。未來會有更多預設。 若要了解如何開始使用dnd kit ,請造訪官方文件網站。您將找到深入的 API 文件、提示和指南,幫助您建立拖放介面。
dnd 套件的核心庫公開了兩個主要概念:
使用useDraggable
和useDroppable
鉤子增強現有元件,或將兩者結合起來創建可以拖放的元件。
使用<DndContext>
提供者處理事件並自訂可拖曳元素和可放置區域的行為。配置感測器以處理不同的輸入方法。
使用<DragOverlay>
元件呈現可拖曳的覆蓋層,該覆蓋層從正常文件流中刪除並相對於視口定位。
查看我們的快速入門指南以了解如何開始。
可擴充性是dnd kit的核心。它的構建是精益且可擴展的。它附帶了我們相信大多數人大部分時間都會想要的功能,並提供了擴展點來在@dnd-kit/core
之上構建其餘部分。
dnd 套件可擴充性等級的一個主要範例是可排序預設,它是使用@dnd-kit/core
公開的擴充點建構的。
dnd 套件的主要擴充點是:
建立可存取的拖放介面很困難; dnd 套件有許多合理的預設值和起點,可協助您讓拖放介面易於存取:
aria
屬性的合理預設值請查看我們的輔助使用指南,以詳細了解如何幫助為螢幕閱讀器提供更好的體驗。
與大多數拖放庫不同, dnd 套件故意沒有建立在 HTML5 拖放 API 之上。這是一個經過深思熟慮的架構決策,確實會帶來一些權衡,您在決定使用它之前應該意識到這一點,但對於大多數應用程式來說,我們認為利大於弊。
HTML5 拖放 API 有一些嚴重的限制。它不支援觸控裝置或使用鍵盤拖曳項目,這意味著建立在其之上的庫需要公開完全不同的實作來支援這些輸入方法。它也不支援常見用例,例如鎖定拖曳到特定軸或容器的邊界、自訂碰撞偵測策略,甚至自訂拖曳專案的預覽。
雖然其中一些問題有解決方法,但這些解決方法通常會增加程式碼庫的複雜性和庫的整體套件大小,並導致滑鼠、觸控和鍵盤層之間的不一致,因為它們由完全不同的實作提供支援。
不使用 HTML5 拖放 API 的主要缺點是您將無法從桌面或視窗之間拖曳。如果您想到的拖放用例涉及此類功能,那麼您肯定會想要使用基於 HTML 5 拖放 API 建置的程式庫。我們強烈建議您查看react-dnd,以了解具有本機 HTML 5 拖放後端的 React 程式庫。
dnd 套件可讓您建立拖放介面,而無需在每次項目需要移動位置時變更 DOM。
這是可能的,因為當啟動拖曳操作時, dnd 套件會延遲計算並儲存可放置容器的初始位置和佈局。這些位置將傳遞到使用useDraggable
和useDroppable
的元件,以便您可以在拖曳操作正在進行時計算專案的新位置,並使用不會觸發重繪的高效能 CSS 屬性將它們移動到新位置,例如translate3d
和scale
。有關如何實現這一點的範例,請查看@dnd-kit/sortable
庫所公開的排序策略的實作。
這並不是說在拖曳時不能移動 DOM 中項目的位置,這是受支援的,有時是不可避免的。在某些情況下,除非將項目移至 DOM 中,否則無法事先知道項目的新位置和佈局。只需要知道,拖曳時對 DOM 進行的此類突變成本要高得多,並且會導致重新繪製,因此如果可能的話,更喜歡使用translate3d
和scale
來計算新位置。
dnd 套件還對所有感測器的啟動器事件使用 SyntheticEvent 偵聽器,這比手動向每個單獨的可拖曳節點添加事件偵聽器提高了效能。
@dnd-kit
儲存庫中工作@dnd-kit/core
@dnd-kit/accessibility
@dnd-kit/sortable
@dnd-kit/modifiers
@dnd-kit/utilities
您需要在根目錄中安裝所有相依性。由於@dnd-kit
是一個使用 Lerna 和 Yarn 工作區的 monorepo,因此不支援 npm CLI(僅支援yarn)。
yarn install
這將在每個專案中安裝所有依賴項,建立它們,並透過 Lerna 符號連結它們
在一個終端機中,並行運行yarn start
:
yarn start
這會將每個套件建置到<packages>/<package>/dist
並在監視模式下執行項目,因此您在<packages>/<package>/src
中儲存的任何編輯都會導致重建到<packages>/<package>/dist
。結果將串流傳輸到終端。
yarn start:storybook
執行故事書 開啟 http://localhost:6006 以在瀏覽器中查看它。
您可以在由 Parcel 供電的遊樂場中玩本地包。
yarn start:playground
這將在localhost:1234
上啟動 Playground。如果您讓 lerna 在一個終端中以平行模式運行 watch,然後運行 Parcel,則當您對來源位於packages/*/src/*
內部的任何導入模組進行更改時,您的Playground 將會熱重載。請注意,為了實現此目的,每個套件的start
命令都會向 TDSX 傳遞--noClean
標誌。這可以防止 Parcel 由於「找不到檔案」錯誤而在重建之間爆炸。
重要的安全提示:在 Playground 中新增/更改套件時,請在 package.json 中使用alias
物件。這將告訴 Parcel 將它們解析到檔案系統,而不是嘗試從 NPM 安裝軟體包。它還修復了您可能遇到的重複 React 錯誤。
(在第三個終端機中)您可以執行 Cypress,它將針對 Storybook 執行整合測試。