日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

react-dnd 拖拽

發布時間:2025/5/22 编程问答 78 豆豆
生活随笔 收集整理的這篇文章主要介紹了 react-dnd 拖拽 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

介紹

React DnD 是一組 React 高階組件,可以用來幫你構建復雜的拖拽接口,同時解耦你的組件。React DnD 非常適合像 Trello 和 Storify 這樣的應用,在不同地方通過拖拽轉移數據,而組件會改變它們的外觀和應用的狀態來響應拖拽事件。

基本用法

  • 把應用的根組件包裝在?DragDropContext?中

  • 把可以拖拽的組件包裝在?DragSource?中

  • 設置 type

  • 設置 spec,讓組件可以響應拖拽事件

  • 設置 collect,把拖拽過程中需要信息注入組件的 props

  • 把可以接受拖拽的組件包裝在?DropTarget?中

  • 設置 type

  • 設置 spec,讓組件可以響應拖拽事件

  • 設置 collect,把拖拽過程中需要信息注入組件的 props

  • 翻譯成代碼就是:

    ? // 1 import HTML5Backend from 'react-dnd-html5-backend'; import { DragDropContext } from 'react-dnd';class App { ... } export default DragDropContext(HTML5Backend)(App); /*---------------------------*/ // 2 import { DragSource } from 'react-dnd'; class MyComponent { ... } export default DragSource(type, spec, collect)(MyComponent); /*---------------------------*/ // 3 import { DropTarget } from 'react-dnd'; class MyComponent2 { ... } export default DropTarget(types, spec, collect)(MyComponent2);

    這樣,MyComponent 就變得可以拖拽,而 MyComponent2 就變得可以接受拖拽了,但這并不代表 MyComponent 可以放到 MyComponent2 中!

    一些概念

    React DnD 中有一些特殊的概念,理解這些概念之后才能活用這個庫!

    • Backend?實現 DnD 的方式,默認是用 HTML5 DnD API,它不能在觸屏環境下工作,而且在 IE 下可定制性比其他瀏覽器弱。你也可以用自己實現,具體請看官方文檔。

    • Items?拖拽數據的表現形式,用 Object 來表示。譬如,要拖拽一張卡片,那這張卡片的數據的表現形式可能是?{ id: xxx, content: yyy }。

    • Types?表示拖/放組件的兼容性,DragSource?和?DropTarget?必須指定?type。只有在?type?相同的情況下,DragSource才能放到?DropTarget?中。

    • Monitors?用來響應拖拽事件,可以用來更新組件的的狀態。

    • Connectors?底層接觸 DOM 的東西,用來封裝你的組件,讓你的組件有拖拽的特性。一般在 collect 方法中指定,然后注入到組件的 props 中,最后 render 方法中包裝你自己的組件。

    • DragSource && DropTarget?把上面的概念都綁在一起的東西,也是真正跟你的組件打交道的東西。

    主要 API 介紹

    這些主要 API 都是通過包裝你的組件,然后返回一個新的組件。

    DragDropContext(backend)

    • backend?實現 DnD 的方式,一般是 HTML5Backend

    export?default?DragDropContext(HTML5Backend)(App);

    DragSource(type, spec, collect)

    DropTarget(type, spec, collect)

    • type?必須。type 是自定義的,可以是 string,symbol,也可以是用一個函數來返回該組件的其他 props。該組件只能放到相同 type 的 DropTarget 中。

    • spec?必須。一個帶有特定方法的純 Object,里面是一些響應拖拽事件的方法。

    • collect?必須。一個函數返回一個 Object,這個 Object 會注入到組件的 props 中。

    • options?可選。除非有性能問題,否則不需要關心這個參數。

    const type = 'xxx'; const spec = { ... }; function collect(connect, monitor) { ... } export default DragSource(type, spec, collect)(MyComponent); export default DropTarget(type, spec, collect)(MyComponent2);

    DragSource#spec

    讓你的組件響應 dnd 相關事件,支持以下方法:

    • beginDrag(props, monitor, component)?必須

    • endDrag(props, monitor, component)?可選

    • canDrag(props, monitor)?可選

    • isDragging(props, monitor)?可選

    參數含義如下:

    • props?組件當前的 props

    • monitor?是一個?DragSourceMonitor?實例,用來查詢當前 drag state 的信息。

    • component?表示當前組件,可以省略。

    const spec = {beginDrag(props) {return { id: props.id, content: props.content}}//... }

    DropTarget#spec

    讓你的組件響應 dnd 相關事件,支持以下方法:

    • drop(props, monitor, component)?可選,響應 drop 事件

    • hover(props, monitor, component)?可選

    • canDrop(props, monitor)?可選

    參數含義如下:

    • props?組件當前的 props

    • monitor?是一個?DropTargetMonitor?實例,用來查詢當前 drag state 的信息。

    • component?表示當前組件,可以省略。

    const spec = {drop(props, monitor, component) {// 獲取正在拖放的數據const item = monitor.getItem();// 更新組件狀態 component.setState({ item }) } }

    DragSource#collect(connect, monitor)

    DropTarget#collect(connect, monitor)

    返回一個 object,這個 object 可以會注入到組件的 props 中。

    • connect?一個?DragSourceConnector/DropTargetConnector?實例,可以用connect.dragSource()/connect.dropTarget()?來封裝我們的組件。

    • monitor?一個?DragSourceMonitor/DropTargetMonitor?實例,用來查詢當前拖拽的信息。

    function collect(connect, monitor) { return { isDragging: monitor.isDragging(), connectDragSource: connect.dragSource() } } class MyComponent extends Component { render() { // 可以訪問 collect 中返回的 object const { isDragging, connectDragSource } = this.props; // 需要用 connect.dragSource()/connect.dropTarget() 封裝自己的組件 return connectDragSource( <div>123</div> ) } }

    具體例子

    • 演示

    • 代碼

    出處

    • https://scarletsky.github.io/2015/11/17/react-dnd-usage/

    參考資料

    • 官方文檔

    轉載于:https://www.cnblogs.com/liuna/p/6655720.html

    總結

    以上是生活随笔為你收集整理的react-dnd 拖拽的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 韩日av| www.九九九| 中文字幕日本视频 | 国产精品久久久久久久久久久久久久久久久久 | 久久91久久| 日本一区二区三区四区视频 | 在线观看黄色 | 91偷拍网站| 国产婷婷一区二区 | 九色一区 | 99精品一区 | 无码人妻精品一区二区三 | 天天舔天天射天天干 | 国产日韩欧美一区二区东京热 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 日韩影视在线 | 无遮挡的裸体按摩的视频 | 四虎婷婷 | 九九热久久免费视频 | 国产一二三在线观看 | 中文字幕视频观看 | 一区一区三区产品乱码 | 精品成人一区二区 | 国产一区a | 在线观看免费高清在线观看 | 黑人狂躁日本妞hd | 亚洲成熟女性毛茸茸 | 俺也去综合 | 色网站女女 | 天天操天天摸天天干 | 波多野结衣成人在线 | 精品福利一区二区三区 | 国产精品国产自产拍高清av | 免费在线观看www | 亚洲一区二区在线视频 | 免费在线观看日韩av | 香蕉视频在线观看www | 久久综合色网 | 精品视频免费观看 | 嫩草嫩草嫩草 | 一区二区三区精 | 免费在线观看视频 | 极度诱惑香港电影完整 | 天天干天天日 | 免费观看成人毛片 | av在线伊人 | 欧美黑丝少妇 | 久久久久成人精品无码中文字幕 | 华人永久免费视频 | 激情插插插 | 色妞色视频一区二区三区四区 | 永久免费黄色 | 7788色淫网站小说 | 亚洲欧美日韩国产一区二区 | 侵犯亲女在线播放视频 | 欧美特级黄 | 成人国产精品免费观看动漫 | 美女三级黄色片 | 日韩插| 视频一区二区三 | 第四色视频 | 涩涩视频网站 | 超能一家人电影免费喜剧在线观看 | 青青射| 日韩一级在线视频 | av黄网站| 在线观看免费黄网站 | 日本wwwxx| 一区国产在线 | 男女啪啪网站免费 | 午夜老湿机 | 日本免费黄视频 | 一区二区伦理 | 精品深夜av无码一区二区老年 | 亚洲天堂第一区 | 女人叫床很黄很污句子 | 性插动态视频 | 亚洲一区二区成人 | 超碰男人的天堂 | 农村末发育av片一区二区 | 777色婷婷 | 舌奴调教日记 | 青娱乐青青草 | 999精品免费视频 | 在线观看av黄色 | 女同动漫免费观看高清完整版在线观看 | 欧美xxxxxhd | 在线观看日韩中文字幕 | 欧美日韩精品一区二区三区蜜桃 | 3d动漫啪啪精品一区二区中文字幕 | 污污的视频在线免费观看 | 国产精品99精品无码视 | 婷婷激情五月综合 | 国产中文字字幕乱码无限 | 超碰人人草 | 国产欧美在线看 | 婷婷六月网 | 黄色av中文字幕 | 俺去日|