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

站長(zhǎng)資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

react-dnd怎么實(shí)現(xiàn)拖拽

實(shí)現(xiàn)方法:1、利用“import{DndProvider}from 'react-dnd'”定義一個(gè)可拖拽的范圍;2、利用“import{useDrag}from 'react-dnd'”將DragSource包裹住組件,使其可以拖動(dòng)即可。

react-dnd怎么實(shí)現(xiàn)拖拽

本教程操作環(huán)境:Windows10系統(tǒng)、react17.0.1版、Dell G3電腦。

react-dnd怎么實(shí)現(xiàn)拖拽

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

React DnD 的需求

  • 默認(rèn)使用 HTML5 拖放API,但支持

  • 不直接操作 DOM

  • DOM 和拖放的源和目標(biāo)解耦

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

React DnD 的特點(diǎn)

專注拖拽,不提供現(xiàn)成組件

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

單向數(shù)據(jù)流

類似于 React 一樣采取聲明式渲染,并且像 redux 一樣采用單向數(shù)據(jù)流架構(gòu),實(shí)際上內(nèi)部使用了 Redux

隱藏了平臺(tái)底層API的問(wèn)題

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

可擴(kuò)展可測(cè)試

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

為未來(lái)做好了準(zhǔn)備

React DnD不會(huì)導(dǎo)出mixins,并且對(duì)任何組件同樣有效,無(wú)論它們是使用ES6類,createReactClass還是其他React框架創(chuàng)建的。而且API支持了ES7 裝飾器。

示例如下:

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

/*  * @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 = () => {   // 當(dāng)前拖拽項(xiàng)   const [currentList, setCurrentList] = useState<any>({});   return (     // 類似redux數(shù)據(jù)傳輸  需要在最外層包裹對(duì)象     <DndProvider backend={HTML5Backend}>       <h1>拖拽源組件 列表-----樹(shù)</h1>       <div style={{ display: 'flex' }}>         <div>           {/* 列表拖拽源 */}           {item.map((itemz: any, index: number) => (             <SourceBox setCurrentList={setCurrentList} item={itemz} key={index} />           ))}         </div>         {/* 注意,不要樹(shù)組件整體直接設(shè)置拖拽,抽成一個(gè)組件來(lái)遍歷每一項(xiàng) =》自定義渲染*/}         {/* 樹(shù)形拖拽源 */}         <TreeBox />       </div>       <h1>拖拽放置目標(biāo)</h1>       {/* 拖拽最終放置組件 */}       <TargetBox currentList={currentList} />     </DndProvider>   ); }; export default Container;

2.使用 DragSource 包裹住組件,使其可以進(jìn)行拖動(dòng)

/*  * @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, //返回當(dāng)前列表項(xiàng)數(shù)據(jù)       canDrag: (monitor) => {         //是否取消拖拽         console.log(monitor, 'monitor131');         return true;       },       //       end(currentItem, monitor) {         // monitor.getDropResult(); //獲取拖拽對(duì)象所處容器的數(shù)據(jù)         // monitor.didDrop(); // 當(dāng)前容器能否放置拖拽對(duì)象 拖動(dòng)停止時(shí)觸發(fā)         monitor.didDrop() && setCurrentList(currentItem); //在容器點(diǎn)松開(kāi) 才賦值       },     }),     [],   );   return (     <div ref={drag} style={{ ...style, opacity }}>       {item.id}------{item.name}     </div>   ); }; export default SourceBox;

3.使用 DropTarget 包裹住組件,使其對(duì)拖動(dòng),懸停或 dropped 的兼容項(xiàng)目做出反應(yīng)。

/*  * @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) : '當(dāng)前item'}       </div>     </div>   ); }; export default TargetBox;

到此列表拖拽即可完成

推薦學(xué)習(xí):《react視頻教程》

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
gmnon.cn-疯狂蹂躏欧美一区二区精品,欧美精品久久久久a,高清在线视频日韩欧美,日韩免费av一区二区
国产精品videossex国产高清| 久久国产亚洲精品无码| 能在线观看的av| 妺妺窝人体色777777| 亚洲av综合色区| 国产女主播av| 欧美视频在线观看视频| 免费看国产一级片| 国产男女无遮挡| 99久久国产宗和精品1上映| 亚洲精品无码久久久久久| 1024精品视频| 在线观看国产一级片| 99日在线视频| 免费人成自慰网站| 国产午夜伦鲁鲁| 国产91色在线观看| 国产又粗又爽又黄的视频| 人妻无码一区二区三区四区| 欧美激情亚洲天堂| 日本成年人网址| 中文字幕永久有效| 高清无码视频直接看| 黄页免费在线观看视频| 国产野外作爱视频播放| 在线免费黄色网| 成人毛片一区二区| 污污网站在线观看视频| 激情五月六月婷婷| 最新中文字幕免费视频| 亚洲五码在线观看视频| 人妻精品无码一区二区三区 | 成人小视频在线观看免费| www.男人天堂网| a在线观看免费视频| 成年人看的毛片| 日韩av在线中文| 老太脱裤让老头玩ⅹxxxx| 欧美一级xxxx| 99精品视频在线看| 日韩欧美一级在线| 色乱码一区二区三区在线| 97干在线视频| 大桥未久一区二区三区| 亚洲欧美自拍另类日韩| 免费看国产曰批40分钟| 自拍偷拍视频在线| 韩国视频一区二区三区| 久久久久久久久久久视频| 日本女人高潮视频| 天堂视频免费看| 爆乳熟妇一区二区三区霸乳| 国产av人人夜夜澡人人爽麻豆| 中文字幕第66页| 岛国av免费在线| 爱情岛论坛亚洲首页入口章节| 奇米精品一区二区三区| 国产成人一区二区三区别| 午夜大片在线观看| 欧美大尺度做爰床戏| 男人女人黄一级| 一区二区在线播放视频| 久久综合久久色| 国产精品人人妻人人爽人人牛| 日韩精品在线中文字幕| 国产成人在线小视频| 在线观看av的网址| 麻豆视频传媒入口| 4444在线观看| www.国产在线视频| 久久久久久久久久久99| 丁香花在线影院观看在线播放 | 亚洲 欧美 日韩 国产综合 在线| 国产免费xxx| 青青在线视频免费观看| 亚洲熟妇无码一区二区三区| 丰满的少妇愉情hd高清果冻传媒 | 永久免费看av| 性高湖久久久久久久久aaaaa| 日韩欧美猛交xxxxx无码| 亚洲熟妇无码另类久久久| 黄色一级在线视频| 亚洲五月天综合| 亚洲一区二区偷拍| 中文字幕の友人北条麻妃| 91免费黄视频| 天天干天天干天天干天天干天天干| 国产成年人视频网站| 中文字幕乱码免费| 日韩欧美亚洲天堂| 亚洲 国产 图片| 免费在线看黄色片| 亚洲视频在线观看一区二区三区| 五月激情五月婷婷| 97中文字幕在线| www欧美激情| avav在线播放| 日韩精品视频一二三| 波多野结衣 作品| 无码少妇一区二区三区芒果| 四虎免费在线观看视频| 国产福利一区视频| 91传媒免费视频| 免费成年人高清视频| 又粗又黑又大的吊av| 嫩草视频免费在线观看| 四虎成人在线播放| 六月婷婷激情网| 日本三级免费观看| 亚洲高清在线不卡| 激情网站五月天| 女人帮男人橹视频播放| www.污污视频| 91在线视频观看免费| 日韩xxxx视频| 好吊色这里只有精品| 中文久久久久久| 日韩av在线第一页| 精品丰满人妻无套内射| 亚洲精品永久视频| 欧美男女交配视频| 午夜激情在线观看视频| 午夜肉伦伦影院| 免费观看美女裸体网站| 日韩亚洲欧美一区二区| 影音先锋男人的网站| 91丨九色丨蝌蚪| 向日葵污视频在线观看| 日本999视频| 久久久精品三级| 精品999在线| 日本不卡一区二区在线观看| 欧美日韩怡红院| 在线观看日本一区二区| 国产一级不卡毛片| av免费在线播放网站| www.日日操| 日韩精品你懂的| 99中文字幕在线| 亚洲一级片免费观看| 日本一本在线视频| 特级西西444| 很污的网站在线观看| 成人在线播放网址| 成人免费在线小视频| 欧美激情成人网| www.久久久久久久久久久| 一级黄色高清视频| 日韩免费在线观看av| 国产97在线 | 亚洲| 成年人视频在线免费| 欧美又黄又嫩大片a级| 超碰中文字幕在线观看| 99久热在线精品视频| 国产精品va无码一区二区| 亚洲国产精品久久久久爰色欲| 无码内射中文字幕岛国片| 亚洲va综合va国产va中文| 五月天国产视频| 成人一区二区免费视频| 国产熟女高潮视频| 手机av在线网站| 国产精品专区在线| 鲁一鲁一鲁一鲁一av| 97超碰在线人人| 九色91popny| 91免费视频黄| 天天干在线影院| 免费人成自慰网站| 一区二区三区入口| 欧美在线一区视频| 992kp免费看片| 久久综合久久色| 色欲色香天天天综合网www| 嫩草影院国产精品| 免费无码不卡视频在线观看| 欧洲在线免费视频| 爱情岛论坛成人| 国产精品后入内射日本在线观看| 欧美成人乱码一二三四区免费| 国产精品网站免费| 毛片av在线播放| 免费国产成人看片在线| 91高清国产视频| 毛葺葺老太做受视频| 国产精品一区二区免费在线观看| 水蜜桃在线免费观看| 亚洲制服中文字幕| 可以看污的网站| wwwwww.色| 韩国视频一区二区三区| 久久久久久香蕉| 成年人视频在线免费| 国产l精品国产亚洲区久久| 男人添女荫道口女人有什么感觉| 99热这里只有精品7| 日韩欧美理论片| 异国色恋浪漫潭| avove在线观看| 日本一道在线观看|