成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

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

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

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

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

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

react-dnd怎么實現(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 的特點

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

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

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

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

隱藏了平臺底層API的問題

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

可擴展可測試

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

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

React DnD不會導(dǎo)出mixins,并且對任何組件同樣有效,無論它們是使用ES6類,createReactClass還是其他React框架創(chuàng)建的。而且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 = () => {   // 當(dāng)前拖拽項   const [currentList, setCurrentList] = useState<any>({});   return (     // 類似redux數(shù)據(jù)傳輸  需要在最外層包裹對象     <DndProvider backend={HTML5Backend}>       <h1>拖拽源組件 列表-----樹</h1>       <div style={{ display: 'flex' }}>         <div>           {/* 列表拖拽源 */}           {item.map((itemz: any, index: number) => (             <SourceBox setCurrentList={setCurrentList} item={itemz} key={index} />           ))}         </div>         {/* 注意,不要樹組件整體直接設(shè)置拖拽,抽成一個組件來遍歷每一項 =》自定義渲染*/}         {/* 樹形拖拽源 */}         <TreeBox />       </div>       <h1>拖拽放置目標(biāo)</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, //返回當(dāng)前列表項數(shù)據(jù)       canDrag: (monitor) => {         //是否取消拖拽         console.log(monitor, 'monitor131');         return true;       },       //       end(currentItem, monitor) {         // monitor.getDropResult(); //獲取拖拽對象所處容器的數(shù)據(jù)         // monitor.didDrop(); // 當(dāng)前容器能否放置拖拽對象 拖動停止時觸發(fā)         monitor.didDrop() && setCurrentList(currentItem); //在容器點松開 才賦值       },     }),     [],   );   return (     <div ref={drag} style={{ ...style, opacity }}>       {item.id}------{item.name}     </div>   ); }; export default SourceBox;

3.使用 DropTarget 包裹住組件,使其對拖動,懸停或 dropped 的兼容項目做出反應(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號-2    滬公網(wǎng)安備31011702889846號
免费A级毛片无码A∨蜜芽试看| 韩国免费A级毛片| 俄罗斯13一14幻交| 亚洲无人区码一码二码三码四码| 色欲AV永久无码精品无码蜜桃| 麻豆极品JK丝袜自慰喷水久久| 国产又色又爽又黄的在线观看| 大波妺AV网站影院| 吧唧吧唧吧唧一口一口吃掉了| 中文字幕无码专区人妻制服| 亚洲色偷偷综合亚洲av伊人| 亚洲AV无码成人黄网站在线观看 | 国产精品久久久久AAAA| 白嫩美女被内射59| 二三四五六七无产乱码| 国产性一交一乱一伦一色一情| 二虎进入温如玉160章小说| 国产裸模视频免费区无码| 欧洲一本到卡二卡三卡乱码| 国色精品卡一卡2卡3卡4卡免费| 国产成人AV一区二区三区无码| AAA日本高清在线播放免费观看| 亚洲А∨天堂男人色无码| 午夜精品久久久久久中宇| 熟女俱乐部五十路二区AV| 日韩欧美亚洲每日更新在线 | 少妇粉嫩小泬白浆流出| 日本国产一区二区三区在线观看| 免费看的WWW哔哩哔哩| 日韩乱码人妻无码中文字幕视频 | 美女露胸 0无挡挡| 一区二区三区国产亚洲网站| 去掉小内打扑克的视频| 人妻少妇粗大持久满足| 欧美XXXxX高潮喷水| 妺妺窝人体色WWW精品| 男女裸交免费无遮挡全过程| 逆徒每天都想着欺师犯上| 欧美激欧美啪啪片免费看| 漂亮人妻被黑人久久精品| 乌克兰少妇XXXX做受野外| 无码天堂亚洲国产AV久久| 西西GOGO大胆啪啪艺术| 亚洲AV片一区二区三区| 亚洲国产精品无码久久青草| 亚洲天天做日日做天天谢日日欢 | 在线成人看片黄A免费看| 一二三四五在线播放免费观看中文| 人妻激情偷乱频一区二区三区| 男女猛烈无遮掩视频免费软件| 婷婷综合久久中文字幕| 无码日韩精品一区二区人妻 | 国产对白videos麻豆高潮| 国产精品国产自线拍免费软件| 国产丝袜无码一区二区三区视频| 国偷自产一区二区免费视频| 欧美成人精品在线| 亚洲AV中文无码字幕色最| 八戒八戒WWW资源高清| 精品亚洲国产成AV人片传媒| 兰姨不敢发出一点声音怕吵醒风| 老师的粉嫩小又紧水又多| 男生晚上睡不着想看B站| 午夜精品久久久久久毛片| A级大胆欧美人体大胆666| 韩国电影办公室6免费完整版| 人人澡人人妻人人爽人人蜜桃| 色欲AV无码一区二区人妻| 国产美女自卫慰黄网站| 浪货两个都满足不了你| 午夜福利理论片高清在线观看| 4虎CVT4WD| 啊轻点灬大JI巴太粗太长了欧美| 国产成 人 综合 亚洲专区| 美女高潮流白浆娇喘免费网站| 无人区码一码二码三码是| JLZZJLZZJLZ亚洲日本| 成人片黄网站色大片免费观看AP| 国产男男GAY做受ⅩXX软件| 欧美性狂猛BBBBBBXXXXXX| 特黄AAAAAAAAA毛片免费视频| 亚洲 另类 在线 欧美 制服 | 护士的小嫩嫩好紧好爽| 乱老熟女成熟50ⅩXXX小| 性CHINESE新婚VIDEO| 野花在线高清视频| ぱらだいす天堂中文网.WWW| 久久精品国产99精品国产202 | 国产护士在线视频XXXX免费| 强奷漂亮饱满雪白少妇AV| 一二三四在线观看免费高清视频 | 第二书包网高H肉辣文| 免费又黄又爽又猛的毛片| 亚洲色无码中文字幕手机在线 | 亚洲AV无码乱码麻豆精品国产| 丰满人妻一区二区三区Aⅴ在线| 国内少妇高潮嗷嗷叫在线播放| 色偷偷AV老熟女| 锕锕锕锕锕锕锕锕好疼小视频软件 | 韩国的无码AV看免费大片在线 | 在线精品国产成人综合| 国产真实强被迫伦姧女在线观看| 国产激情大臿免费视频| 秋霞鲁丝AV一区二区三区| 与亲女洗澡伦了东北| 把舌头伸进她腿间花缝| 美女高潮无遮挡喷水视频| 亚洲爽爆东京爽爆东京爽爆av| 国产又爽又黄又刺激的视频| 熟女体下毛毛黑森林| 成人人妻小说AV| 秋霞AV鲁丝片一区二区| 1000部夫妻午夜免费| 国产人久久人人人人爽| 欧美日韩国产免费一区二区三区| 一受多攻同做H嗯啊巨肉| 丰满少妇大叫太大太粗| 人人人妻人人澡人人爽欧美一区| 97人人模人人爽人人少妇| 国产一区二区无码蜜芽精品| 无码免费无线观看在线视频| 成人午夜无码国产| 国产成人免费无码AV在线播放| 厨房征服丰满熟妇少妇人妻| 极品国产主播粉嫩在线观看| 人妻少妇乱子伦无码专区| A∨色狠狠一区二区三区| 精品国产一区二区三区免费| 日本丰满少妇XXXX| А√天堂资源中文在线官网| 人妻被按摩师玩弄到潮喷| А√天堂8资源官网在线BT种子| 欧美爽到高潮漏水大喷视频| YSL千人千色8610| 鲁丝一区二区三区| 亚洲综合久久一本久道| 国产毛多水多五月激情四射| 帅气小鲜肉自慰VIDEO| 高雅人妻被迫沦为玩物| 女人双腿搬开让男人桶| 亚洲色精品三区二区一区| 久久99精品久久久久久HB无码| 四虎AV永久在线精品免费观看| 高H纯肉放荡脏话H文合集| 体型差糙汉乖乖女| 国产乱码精品一区二区三区四川人| 亚洲日韩乱码中文无码蜜桃臀| 锕锕锕锕锕锕好大好深APP| 啪啪叉叉xx高清无码| 被CAO的奶水直喷高H| 蜜桃AV麻豆AV天美AV| 亚洲精品乱码久久久久久V| 国产精品久久久久久久久久久不卡| 日韩一区二区三区无码影院| AAAAA级少妇高潮大片| 人人婷婷色综合五月第四人色阁| 国产69精品久久久久99尤物| 日本高清视频网站WWW| 国产99久9在线视频传媒| 小雪被老汉玩遍各种方式电影| 国产在线观看无遮挡无码AⅤ多人| 亚洲精品无码不卡在线播HE| 久久一本加勒比波多野结衣| 亚洲人成无码网站久久99热国产| 久久久久99精品成人片三人毛片| 青青青国产精品一区二区| 成人精品免费AV不卡在线观看| 欧美成人看片黄A免费看| www.xx欧美大鸡巴| 视频二区精品中文字幕| 熟肉OVA初恋时间2附前作| 中文字幕人妻色偷偷久久| 人人妻人人妻人人片色AV| 2021影音先锋AⅤ资源男人网| 人妻插B视频一区二区三区| 国产精品久久久久这里只有精品| 亚洲卡5卡6卡7卡2021入口| 黑人狂虐中国人妻陈艳| 羞羞午夜爽爽爽爱爱爱爱人人人| 久久ZYZ资源站无码中文动漫| 8AV国产精品爽爽ⅤA在线观看| 狼人大香伊蕉国产WWW亚洲| YY6080久久亚洲精品| 无人区码一码二码三MBA| 久久久久久久久久久综合日本| YSL千人千色T9T9T9T9| 西西人体444WWW高清大但| 久久久久久久精品国产亚洲| 别揉我奶头~嗯~啊~视频| 人善之交Z0OZO0D0G人善| 国产蜜臀AV无码一区二区三区| 亚洲伊人五月丁香激情| 老外和中国女人毛片免费视频| YY6090青苹果影院| 性生大片免费观看网站| 超碰97人人做人人爱综合| 中文亚洲AV片在线观看| 国产成人免费A在线视频 | 色婷婷五月综合激情中文字幕| 嗯啊WW免费视频网站|