婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 基于Html5實現的react拖拽排序組件示例

基于Html5實現的react拖拽排序組件示例

熱門標簽:中紳電銷智能機器人 跟電銷機器人做同事 鄭州電銷外呼系統違法嗎 威海營銷外呼系統招商 鶴壁手機自動外呼系統怎么安裝 漳州人工外呼系統排名 濟南辦理400電話 ai電銷機器人連接網關 農村住宅地圖標注

拖拽排序組件Github地址:https://github.com/VicEcho/VDraggable.git

因為使用了react.js技術棧,所以封裝優先考慮輸入和輸出?;跀祿寗尤ヤ秩卷撁?、控制拖拽元素的順序。

由于我不考慮兼容IE8等舊版本瀏覽器,拖拽的效果采用了HTML5的拖放(Drag 和 drop)。當然,如果要求兼容性豐富,使用鼠標點擊的相關事件也很簡單。

實現的效果如下:

第一步是先了解H5拖放的相關屬性,MDN上有詳細的說明,鏈接為https://developer.mozilla.org/en-US/docs/Web/Events/dragstart

有一點需要注意的是,react.js會給所有的屬性事件名稱前加上"on",后面則為駝峰式寫法。例如原生的click事件,在react.js里應使用onClick事件。

我的組件使用的拖放屬性如下:

  • draggable 當設置為true時,當前控件可以拖拽
  • onDragStart 控件開始被拖拽時觸發的事件,它提供一個dataTransfer.setData()方法,將必要的數據存儲在對象中便于在其它方法中調用
  • onDragOver 規定當前控件可以接收拖拽的組件的方法,一般在此方法中阻止冒泡
  • onDragEnter 拖動后鼠標進入另一個可接受區域時觸發,通過它可以實現移入效果
  • onDragLeave a拖到b,離開b的時候觸發,可以用于監聽消除移入效果的時機
  • onDrop 當控件被“釋放”到一個有效的釋放目標位置時觸發,我在這個方法中處理數據,并通過它調用onChange方法,將value值暴露給父組件

其中draggable,onDragStart是被“拖拽”方需要設置的屬性,onDragOver,onDragEnter,onDragLeave和onDrop是被“拖入”方需要設置的屬性。不過對于我的拖拽排序組件,每一個元素都是拖拽和拖入方

第二步,既然“她"是react.js的組件, 按照習慣,簡單的將輸入屬性定為為value,同時,暴露onChange事件監聽value的變化,并將其暴露給父組件,同時,暴露一個屬性sortKey告訴組件使用哪個key作為排序字段。
既然涉及到排序,同時允許指定組件每個元素的內部子組件,我將輸入數據格式定義為一個數組對象,其中content可以為reactNode:

 value: [
                {
                    content: 'div1',
                    code: '01',
                    sort: 0,
                },
                {
                    content: 'div2',
                    code: '02',
                    sort: 1
                },
                {
                    content: 'div3',
                    code: '03',
                    sort: 2
                },
                {
                    content: 'div5',
                    code: '05',
                    sort: 5
                },
                {
                    content: 'div4',
                    code: '04',
                    sort: 4
                }]

根據value我去生成可排序組件的每個node,關鍵代碼如下:

    // 生成拖拽組件
    createDraggleComponent(data, sortKey, style, uId) {
        return data.sort(this.compare(sortKey)).map((item) => {
            return (
                <div
                    className={styles.content}
                    key={item.code}
                    draggable={true}
                    onDragEnter={this.dragenter.bind(this)}
                    onDragLeave={this.dragleave.bind(this)}
                    onDragStart={this.domdrugstart.bind(this, item[sortKey], item.code, uId, item)}
                    onDrop={this.drop.bind(this, item[sortKey], data, sortKey, uId)}
                    onDragOver={this.allowDrop.bind(this)}
                    style={{ ...style }}>{item.content}</div>
            )
        })
    }
    render() {
        const { value, sortKey, style } = this.props;
        return (
            <Row>
                <div style={{ display: 'flex', flexDirection: 'row' }}>
                    {this.createDraggleComponent(value, sortKey, style)}
                </div>
            </Row>
        )
    }

其中的屬性方法具體實現:

    // 拖動事件
    domdrugstart(sort, code, ee) {
        ee.dataTransfer.setData("code", code);
        ee.dataTransfer.setData("sort", sort);
    }
    // 拖動后鼠標進入另一個可接受區域
    dragenter(ee) {
        ee.target.style.border = '2px dashed #008dff';
        ee.target.style.boxShadow = '0 0 8px rgba(30, 144, 255, 0.8)';
    }
    // a拖到b,離開b的時候觸發
    dragleave(ee) {
        ee.target.style.border = '1px solid grey';
        ee.target.style.boxShadow = '';
    }
    // 對象排序
    compare(key) {
        return (obj1, obj2) => {
            if (obj1[key] < obj2[key]) {
                return -1;
            } else if (obj1[key] > obj2[key]) {
                return 1;
            }
            return 0
        }
    }
    // 當一個元素或是選中的文字被拖拽釋放到一個有效的釋放目標位置時
    drop(dropedSort, data, sortKey, ee) {
        ee.preventDefault();
        const code = ee.dataTransfer.getData("code");
        const sort = ee.dataTransfer.getData("sort");
        if (sort < dropedSort) {
            data.map(item => {
                if (item.code === code) {
                    item[sortKey] = dropedSort;
                } else if (item[sortKey] > sort && item[sortKey] < dropedSort + 1) {
                    item[sortKey]--;
                }
                return item;
            });
        } else {
            data.map(item => {
                if (item.code === code) {
                    item[sortKey] = dropedSort;
                } else if (item[sortKey] > dropedSort - 1 && item[sortKey] < sort) {
                    item[sortKey]++;
                }
                return item;
            });
        }
        this.props.onChange(data)
    }
    allowDrop(ee) {
        ee.preventDefault();
    }

值得注意的點其實只有一個,我控制順序的時候,并沒有使用.target.before(document.getElementById({id}))去實際操控節點,而是在每次觸發onDrop時間的時候,處理數據的sort,并通過onChange事件暴露給父組件,將數據輸出,通過改變value值觸發虛擬dom重新去渲染,以此控制順序。

根據公司的要求,在此基礎上,我還實現了拖拽復制的功能,這個等下次自己不懶的時候再記錄下來。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:咸陽 萍鄉 營口 文山 惠州 甘南 紅河 蘇州

巨人網絡通訊聲明:本文標題《基于Html5實現的react拖拽排序組件示例》,本文關鍵詞  基于,Html5,實現,的,react,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《基于Html5實現的react拖拽排序組件示例》相關的同類信息!
  • 本頁收集關于基于Html5實現的react拖拽排序組件示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲综合另类小说| 天使萌一区二区三区免费观看| 久久久亚洲精华液精华液精华液| 亚洲成人一二三| 97成人超碰视| 亚洲一区中文日韩| 91精品国产综合久久香蕉麻豆 | 丝袜亚洲另类丝袜在线| 日本三级韩国三级欧美三级| 欧美刺激午夜性久久久久久久 | 成人免费不卡视频| 极品少妇一区二区| 亚洲va欧美va国产va天堂影院| 国产精品美日韩| 欧美韩国日本一区| 欧美激情一区二区三区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲免费观看高清完整版在线观看 | 欧美电影免费观看高清完整版在线 | 欧美丰满嫩嫩电影| 首页国产丝袜综合| 欧美精品1区2区3区| 奇米在线7777在线精品| 26uuu亚洲综合色欧美| 成人午夜看片网址| 丝袜亚洲另类欧美综合| 久久综合狠狠综合久久综合88 | 日韩一区在线免费观看| 在线影院国内精品| 青青草97国产精品免费观看| 久久久蜜桃精品| 欧美亚洲综合一区| 国产乱人伦精品一区二区在线观看| 国产精品美日韩| 欧美日韩不卡一区二区| 国产精品伦一区| 欧美一区二区三区小说| 久久这里只精品最新地址| 国产日韩欧美综合一区| 自拍偷拍欧美精品| 午夜精品免费在线观看| 麻豆精品在线播放| 99久久夜色精品国产网站| 91黄色免费观看| 欧美男女性生活在线直播观看| 欧美一区二区福利在线| 中日韩免费视频中文字幕| 亚洲欧美综合色| 亚洲chinese男男1069| 美女视频黄a大片欧美| 国产精品小仙女| 国产日韩av一区二区| 欧美一区二区日韩| 欧美日韩精品二区第二页| 北岛玲一区二区三区四区| 另类人妖一区二区av| 亚洲国产成人高清精品| 亚洲免费色视频| 中文字幕欧美一区| 国产欧美1区2区3区| 久久久久久久久久电影| 精品国产一区二区亚洲人成毛片 | 色成人在线视频| 国产成人无遮挡在线视频| 理论片日本一区| 久色婷婷小香蕉久久| 日本不卡一区二区三区高清视频| 亚洲福利一区二区三区| 亚洲图片有声小说| 亚洲综合色视频| 亚洲午夜久久久| 亚洲午夜久久久久中文字幕久| 亚洲精品第1页| 亚洲综合色丁香婷婷六月图片| 亚洲自拍偷拍综合| 亚洲成人激情自拍| 日产欧产美韩系列久久99| 蜜桃av一区二区| 国产精品88888| 成人av午夜电影| 色www精品视频在线观看| 欧美最新大片在线看| 欧美卡1卡2卡| 日韩一级二级三级精品视频| 亚洲精品一区二区精华| 国产欧美1区2区3区| 亚洲免费观看高清完整版在线观看| 亚洲午夜久久久久久久久久久 | 日韩欧美在线123| 久久久精品tv| 综合久久久久综合| 日韩电影在线一区二区| 午夜亚洲国产au精品一区二区| 五月天久久比比资源色| 韩国成人福利片在线播放| 日韩一二三四区| 欧美激情艳妇裸体舞| 日本不卡视频在线观看| 色综合一个色综合| 欧美成人午夜电影| 久久精品国产网站| 欧美日韩一区三区| 国产欧美日韩视频一区二区| 亚洲高清在线精品| 欧美日韩高清一区| 国产精品自产自拍| 欧美一区二区三区视频在线| 日韩精品1区2区3区| 日韩成人av影视| 欧美精品黑人性xxxx| 精品一区二区在线视频| 亚洲午夜在线视频| 91在线你懂得| 久久国产剧场电影| 国产福利精品一区二区| 在线观看一区二区精品视频| 中文字幕中文字幕在线一区| 夜夜嗨av一区二区三区中文字幕| 极品少妇xxxx精品少妇偷拍| 波多野结衣的一区二区三区| 日韩欧美电影在线| 性做久久久久久免费观看| 91亚洲永久精品| 国产精品人成在线观看免费 | 国产欧美日韩精品一区| 日韩精品欧美精品| 欧美午夜不卡视频| 亚洲精品国产精华液| 99免费精品视频| 久久精品人人做人人综合| 蜜桃视频在线观看一区二区| 欧美视频在线观看一区| 欧美国产禁国产网站cc| 经典一区二区三区| 欧美成人官网二区| 九九九精品视频| 欧美成人精品3d动漫h| 麻豆精品一区二区av白丝在线| 91精品国产综合久久精品麻豆| 婷婷综合另类小说色区| 欧美精品自拍偷拍| 午夜精品视频一区| 欧美日韩国产一级片| 一区二区三区不卡在线观看| 97se亚洲国产综合自在线不卡| 日韩毛片精品高清免费| 色哟哟一区二区| 亚洲大片在线观看| 欧美一级一区二区| 国产在线国偷精品产拍免费yy | 亚洲男人的天堂网| 91久久免费观看| 首页综合国产亚洲丝袜| 日韩欧美卡一卡二| 国产一区二区不卡在线| 欧美国产禁国产网站cc| 色88888久久久久久影院按摩| 亚洲国产精品一区二区久久恐怖片| 色av一区二区| 麻豆精品国产91久久久久久 | 国产女同互慰高潮91漫画| 成人理论电影网| 亚洲自拍偷拍综合| 日韩欧美高清dvd碟片| 大尺度一区二区| 亚洲欧美日韩国产综合在线| 欧美人与禽zozo性伦| 国产主播一区二区| 自拍偷拍亚洲综合| 日韩一区二区三区免费观看| 国产露脸91国语对白| 亚洲精品中文字幕乱码三区| 日韩一区二区三区在线观看| 成人免费精品视频| 五月婷婷激情综合| 国产精品久久久久久久久久久免费看 | 日韩欧美123| 色哟哟欧美精品| 国产一区二区在线观看视频| 樱花草国产18久久久久| 日韩欧美国产成人一区二区| 色悠悠久久综合| 国产一区二区精品在线观看| 亚洲国产裸拍裸体视频在线观看乱了 | 久久久蜜桃精品| 欧美美女黄视频| 91一区在线观看| 精品系列免费在线观看| 亚洲精品成人a在线观看| 精品国产乱码久久| 在线观看免费一区| 91在线国内视频| 高潮精品一区videoshd| 蜜臀av一级做a爰片久久| 亚洲国产精品一区二区www在线| 最新日韩av在线| 中文字幕欧美区| 国产拍揄自揄精品视频麻豆| 精品国产乱码久久| 日韩精品一区二区三区蜜臀|