gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区

站長資訊網
最全最豐富的資訊網站

react-dnd怎么實現拖拽

實現方法:1、利用“import{DndProvider}from 'react-dnd'”定義一個可拖拽的范圍;2、利用“import{useDrag}from 'react-dnd'”將DragSource包裹住組件,使其可以拖動即可。

react-dnd怎么實現拖拽

本教程操作環境:Windows10系統、react17.0.1版、Dell G3電腦。

react-dnd怎么實現拖拽

React DnD是React和Redux核心作者 Dan Abramov創造的一組React 高階組件,可以在保持組件分離的前提下幫助構建復雜的拖放接口。

React DnD 的需求

  • 默認使用 HTML5 拖放API,但支持

  • 不直接操作 DOM

  • DOM 和拖放的源和目標解耦

  • 融入HTML5拖放中竊取類型匹配和數據傳遞的想法

React DnD 的特點

專注拖拽,不提供現成組件

React DnD提供了一組強大的原語,但它不包含任何現成組件,而是采用包裹使用者的組件并注入 props 的方式。 它比jQuery UI等更底層,專注于使拖放交互正確,而把視覺方面的效果例如坐標限制交給使用者處理。這其實是一種關注點分離的原則,例如React DnD不打算提供可排序組件,但是使用者可以基于它快速開發任何需要的自定義的可排序組件。

單向數據流

類似于 React 一樣采取聲明式渲染,并且像 redux 一樣采用單向數據流架構,實際上內部使用了 Redux

隱藏了平臺底層API的問題

HTML5拖放API充滿了陷阱和瀏覽器的不一致。 React DnD為您內部處理它們,因此使用者可以專注于開發應用程序而不是解決瀏覽器問題。

可擴展可測試

React DnD默認提供了HTML5拖放API封裝,但它也允許您提供自定義的“后端(backend)”。您可以根據觸摸事件,鼠標事件或其他內容創建自定義DnD后端。例如,內置的模擬后端允許您測試Node環境中組件的拖放交互。

為未來做好了準備

React DnD不會導出mixins,并且對任何組件同樣有效,無論它們是使用ES6類,createReactClass還是其他React框架創建的。而且API支持了ES7 裝飾器。

示例如下:

1.1.使用DndProvider定義一個可以拖拽的范圍

/*  * @Author: muge  * @Date: 2021-12-04 16:59:25  * @LastEditors: Please set LastEditors  * @LastEditTime: 2021-12-08 14:24:47  */ import React, { useState } from 'react'; import { DndProvider } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; import SourceBox from './SourceBox'; import TargetBox from './TargetBox'; import TreeBox from './TreeBox'; const item: any[] = [   {     id: 1,     name: 'muge',   },   {     id: 2,     name: 'muxi',   },   {     id: 3,     name: 'mugege',   }, ]; const Container = () => {   // 當前拖拽項   const [currentList, setCurrentList] = useState<any>({});   return (     // 類似redux數據傳輸  需要在最外層包裹對象     <DndProvider backend={HTML5Backend}>       <h1>拖拽源組件 列表-----樹</h1>       <div style={{ display: 'flex' }}>         <div>           {/* 列表拖拽源 */}           {item.map((itemz: any, index: number) => (             <SourceBox setCurrentList={setCurrentList} item={itemz} key={index} />           ))}         </div>         {/* 注意,不要樹組件整體直接設置拖拽,抽成一個組件來遍歷每一項 =》自定義渲染*/}         {/* 樹形拖拽源 */}         <TreeBox />       </div>       <h1>拖拽放置目標</h1>       {/* 拖拽最終放置組件 */}       <TargetBox currentList={currentList} />     </DndProvider>   ); }; export default Container;

2.使用 DragSource 包裹住組件,使其可以進行拖動

/*  * @Author: muge  * @Date: 2021-12-07 14:26:08  * @LastEditors: Please set LastEditors  * @LastEditTime: 2021-12-08 14:18:52  */ import { useDrag } from 'react-dnd'; const ItemTypes = {   BOX: 'box', }; const style = {   border: '1px dashed gray',   backgroundColor: 'white',   padding: '0.5rem 1rem',   marginRight: '1rem',   marginBottom: '1rem',   cursor: 'move', }; const SourceBox = ({ item, setCurrentList }: any) => {   const [{ opacity }, drag] = useDrag(     () => ({       type: ItemTypes.BOX,       collect: (monitor) => ({         opacity: monitor.isDragging() ? 0.4 : 1,       }),       item: () => item, //返回當前列表項數據       canDrag: (monitor) => {         //是否取消拖拽         console.log(monitor, 'monitor131');         return true;       },       //       end(currentItem, monitor) {         // monitor.getDropResult(); //獲取拖拽對象所處容器的數據         // monitor.didDrop(); // 當前容器能否放置拖拽對象 拖動停止時觸發         monitor.didDrop() && setCurrentList(currentItem); //在容器點松開 才賦值       },     }),     [],   );   return (     <div ref={drag} style={{ ...style, opacity }}>       {item.id}------{item.name}     </div>   ); }; export default SourceBox;

3.使用 DropTarget 包裹住組件,使其對拖動,懸停或 dropped 的兼容項目做出反應。

/*  * @Author: muge  * @Date: 2021-12-07 14:26:08  * @LastEditors: Please set LastEditors  * @LastEditTime: 2021-12-08 14:33:08  */ import React from 'react'; import { useDrop } from 'react-dnd'; const ItemTypes = {   BOX: 'box', }; const style: any = {   border: '1px solid gray',   height: '15rem',   width: '15rem',   padding: '2rem',   textAlign: 'center', }; const TargetBox = ({ currentList }: any) => {   const [{ isActive, isOver, canDrop }, drop] = useDrop(() => ({     accept: ItemTypes.BOX,     collect: (monitor) => ({       isActive: monitor.canDrop() && monitor.isOver(),       isOver: monitor.isOver(),       canDrop: monitor.canDrop(),     }),     // hover: (item, monitor) => {     //   console.log(item, 'item');     //   console.log(monitor, 'monitor');     // },   }));   // console.log(isOver, 'isOver');   // console.log(canDrop, 'canDrop');   return (     <div ref={drop} style={style}>       {isActive ? 'Release to drop' : 'Drag item here'}       <div         style={{           backgroundColor: 'pink',           height: 30,           display: 'flex',           alignItems: 'center',           justifyContent: 'center',           fontSize: 17,           fontWeight: 600,           width: '100%',         }}       >         {JSON.stringify(currentList) !== '{}' ? JSON.stringify(currentList) : '當前item'}       </div>     </div>   ); }; export default TargetBox;

到此列表拖拽即可完成

推薦學習:《react視頻教程》

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
成人性生交视频免费观看| 黄色一级视频播放| 青青草视频国产| 天天色综合社区| www黄色av| 欧美日韩中文在线视频| 日本精品一区二区三区四区| 国产乱淫av片杨贵妃| aa视频在线播放| 你懂的av在线| 国产女女做受ⅹxx高潮| 六月丁香婷婷激情| 国产精品入口免费软件| 亚洲77777| 国产精品波多野结衣| 精品无码av无码免费专区| 成人性做爰片免费视频| 丰满少妇大力进入| 欧美一区二区三区爽大粗免费| 国产精品宾馆在线精品酒店| 99免费视频观看| 网站在线你懂的| 日本一区午夜艳熟免费| 成年人免费在线播放| 精品综合久久久久| 久久久无码中文字幕久...| 欧美中文字幕在线观看视频 | 欧美一区二区三区爽大粗免费| www.日日操| 手机成人av在线| 你懂的av在线| 久久综合在线观看| 国产高清www| 欧美成人乱码一二三四区免费| 欧美日韩dvd| 亚洲少妇久久久| 97av中文字幕| 性生活免费在线观看| 欧美日韩不卡在线视频| 亚洲第一狼人区| 黄色动漫在线免费看| 美女在线免费视频| 欧美一级裸体视频| 青青草国产精品视频| 三日本三级少妇三级99| 亚洲人成无码www久久久| 妺妺窝人体色www看人体| 一区二区三区韩国| 男人添女人下面高潮视频| 视频区 图片区 小说区| 日本成人在线免费视频| av无码久久久久久不卡网站| 97超碰成人在线| 国产精品第12页| 国产美女无遮挡网站| 久久亚洲a v| 永久免费看av| 污免费在线观看| 丰满少妇在线观看| 黑鬼大战白妞高潮喷白浆| 可以看毛片的网址| 岛国大片在线播放| 久久久久99精品成人片| 日本a级片在线观看| 99亚洲精品视频| 成人免费看片视频在线观看| 污免费在线观看| 男人午夜视频在线观看| 亚洲综合20p| 午夜免费视频网站| 97超碰人人看| 午夜啪啪免费视频| 久久国产精品免费观看| 色哟哟免费网站| 欧美日韩视频免费| 黄色免费视频大全| 蜜臀av免费观看| 欧美日韩久久婷婷| 国产又粗又猛又爽又黄的网站| 玖玖精品在线视频| 欧美成人三级在线视频| 男人揉女人奶房视频60分| 精品视频无码一区二区三区| 超碰在线人人爱| 久久久久久久久久毛片| 国产爆乳无码一区二区麻豆| 老太脱裤子让老头玩xxxxx| 97在线免费公开视频| 亚洲天堂网2018| 日韩在线视频在线| 激情婷婷综合网| 国产福利片一区二区| 大西瓜av在线| 亚洲黄色小视频在线观看| 香蕉视频在线网址| 2022亚洲天堂| 日韩第一页在线观看| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 少妇黄色一级片| 可以在线看黄的网站| 国产精品乱码久久久久| 蜜臀av.com| 鲁一鲁一鲁一鲁一av| avav在线播放| 男人午夜视频在线观看| 国产午夜大地久久| 无套内谢丰满少妇中文字幕| 亚洲美免无码中文字幕在线| 超碰在线免费av| av无码精品一区二区三区| 中文字幕色呦呦| 亚洲免费在线播放视频| 国产淫片av片久久久久久| 亚洲乱码日产精品bd在线观看| 午夜免费一区二区| 免费av观看网址| 少妇一晚三次一区二区三区| 九九九九九九九九| 麻豆传传媒久久久爱| av 日韩 人妻 黑人 综合 无码| www.精品在线| 成年人视频在线免费| 日韩网站在线免费观看| 日韩不卡视频一区二区| 性久久久久久久久久久久久久| 999在线免费视频| 中国丰满人妻videoshd| 日韩av三级在线| 日韩国产欧美亚洲| 免费看又黄又无码的网站| 丰满人妻一区二区三区53号| 99精品一级欧美片免费播放| 午夜大片在线观看| 91极品视频在线观看| 中文久久久久久| 久久精品影视大全| 一道本在线免费视频| 久热精品在线播放| 手机av在线网| 日韩人妻精品一区二区三区| 国产xxxxhd| 屁屁影院ccyy国产第一页| 2018中文字幕第一页| 亚洲美免无码中文字幕在线 | 无码专区aaaaaa免费视频| 18禁裸男晨勃露j毛免费观看 | 国产又粗又长又大的视频| 亚洲综合在线网站| 国产精品自在自线| 欧美性受黑人性爽| 亚洲精品久久久久久久蜜桃臀| 黄页免费在线观看视频| 黑人粗进入欧美aaaaa| 成人亚洲免费视频| 在线观看17c| 女人喷潮完整视频| 一本色道久久亚洲综合精品蜜桃 | 人妻少妇被粗大爽9797pw| 日韩视频在线免费看| 天堂网成人在线| 国产精品久久..4399| av五月天在线| a级片一区二区| 日韩精品一区中文字幕| 91香蕉国产线在线观看| 欧美啪啪免费视频| 999久久久精品视频| 欧美一级片免费播放| 美女在线视频一区二区| av在线com| 手机免费av片| 欧美日韩一区二区在线免费观看 | 亚洲一二三区av| 国产三级三级看三级| 9191国产视频| 杨幂毛片午夜性生毛片 | 亚洲成人福利在线观看| 国产精品久久久影院| 三上悠亚在线一区二区| 五十路熟女丰满大屁股| 黑人巨大国产9丨视频| 美女黄色片视频| 国产91在线视频观看| 国产情侣第一页| 永久免费看av| 深爱五月综合网| 天天色天天综合网| 爆乳熟妇一区二区三区霸乳| 999在线观看视频| 黄色a级片免费看| 日韩视频在线观看视频| 岛国av免费在线| 中文字幕视频三区| 国产一级做a爰片久久| 久久国产色av免费观看| 黄色一级视频片| av视屏在线播放| 日韩欧美视频网站| 男人添女人下部视频免费| 国产精品99久久久久久大便|