精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Next-Admin最佳實踐!支持可視化拖拽模塊

開發 前端
拖拽模塊我采用了 movable, 并研究了它的大量 API,最終實現了我想要的效果,當然我還設計了一套數據結構,如果大家對可視化搭建感興趣,也可以擴展成自己的拖拽搭建結構。

模塊演示

圖片圖片

技術實現

拖拽模塊我采用了 movable, 并研究了它的大量 API,最終實現了我想要的效果,當然我還設計了一套數據結構,如果大家對可視化搭建感興趣,也可以擴展成自己的拖拽搭建結構。

圖片圖片

元素多選我采用了 selecto 模塊,成組管理器我采用了 @moveable/helper, 當然在使用這些庫的時候也踩了不少坑,好在已經完美解決。

下面分享一個簡單的數據結構,以支持我們的元素自由搭建:

const schema = {
    "Button": {
        id: 'wep_001',
        name: 'Button',
        type: 'base', // 基礎類型組件
        base: {
            width: 120,
            height: 36,
            transform: 'translate(100px,100px)'
        }
    },
    "Image": {
        id: 'wep_002',
        name: 'Image',
        type: 'base', // 基礎類型組件
        base: {
            width: 120,
            height: 120,
            url: '',
            transform: 'translate(300px,160px)'
        }
    }
}

export default schema

工具條實現

圖片圖片

對于工具條的實現,我做了統一的封裝,以便后期可能更低成本的維護和管理:

  • config 工具條配置
  • actions 工具條選項對應的功能方法

接下來看看工具條的配置:

const toolbar = {
    base: [
        {
            key: 'group',
            icon: <GroupOutlined />,
            text: '成組',
        },
        {
            key: 'ungroup',
            icon: <UngroupOutlined />,
            text: '取消成組'
        },
        {
            key: 'left',
            icon: <AlignLeftOutlined />,
            text: '左對齊'
        },
        // ... 其他工具條配置
        {
            key: 'v-space',
            icon: <PicCenterOutlined />,
            text: '垂直分布空間'
        },
        {
            key: 'h-space',
            icon: <PicCenterOutlined style={{transform: 'rotate(-90deg)'}} />,
            text: '水平分布空間'
        },
        
    ]
}

工具條方法封裝:

const handleOperate = (key: string) => {
        // ... some function
        // 頂對齊實現
        if(key === 'top') {
            const rect = moveableRef.current!.getRect();
            // console.log(rect)
            const moveables = moveableRef.current!.getMoveables();

            if (moveables.length <= 1) {
                return;
            }
            moveables.forEach(child => {
                child.request<DraggableRequestParam>("draggable", {
                    y: rect.top,
                }, true);
            });

            moveableRef.current?.updateRect();
            return
        }
        // 底對齊
        if(key === 'bottom') {
            const rect = moveableRef.current!.getRect();
            const moveables = moveableRef.current!.getMoveables();
            if (moveables.length <= 1) {
                return;
            }
            moveables.forEach(child => {
                child.request<DraggableRequestParam>("draggable", {
                    y: rect.top + rect.height - (child.props?.target ? (child.props.target as any).offsetHeight : 0),
                }, true);
            });
            moveableRef.current?.updateRect();
            return
        }

        // ... 其他工具條方法
        // 水平分布
        if(key === 'h-space') {
            const groupRect = moveableRef.current!.getRect();
            const moveables = moveableRef.current!.getMoveables();
            let left = groupRect.left;

            if (moveables.length <= 1) {
                return;
            }
            const gap = (groupRect.width - groupRect.children!.reduce((prev, cur) => {
                return prev + cur.width;
            }, 0)) / (moveables.length - 1);

            moveables.sort((a, b) => {
                return a.state.left - b.state.left;
            });
            moveables.forEach(child => {
                const rect = child.getRect();

                child.request<DraggableRequestParam>("draggable", {
                    x: left,
                }, true);

                left += rect.width + gap;
            });

            moveableRef.current?.updateRect();
            return
        }

    }

通過以上的封裝方式我們就能輕松擴展自己的工具條啦~

接下來我們看看工具條實現的效果:

圖片圖片

當然代碼我已經提交到 github 上了, 大家感興趣可以參考研究一下。

開源地址:https://github.com/MrXujiang/next-admin

多選 & 成組實現

圖片圖片

下面直接上代碼:

<Selecto
    ref={selectoRef}
    // dragCnotallow={container.current}
    selectableTargets={[".wep-area .cube"]}
    hitRate={0}
    selectByClick={true}
    selectFromInside={false}
    toggleCnotallow={["shift"]}
    ratio={0}
    notallow={e => {
        const moveable = moveableRef.current!;
        const target = e.inputEvent.target;
        const flatted = deepFlat(targets);

        if (
            target.tagName === "BUTTON"
            || moveable.isMoveableElement(target)
            || flatted.some(t => t === target || t.contains(target))
        ) {
            e.stop();
        }
        e.data.startTargets = targets;
    }}
    notallow={e => {
        const {
            startAdded,
            startRemoved,
            isDragStartEnd,
        } = e;

        if (isDragStartEnd) {
            return;
        }
        const nextChilds = groupManager.selectSameDepthChilds(
            e.data.startTargets,
            startAdded,
            startRemoved,
        );

        setSelectedTargets(nextChilds.targets());
    }}
    notallow={e => {
        const {
            isDragStartEnd,
            isClick,
            added,
            removed,
            inputEvent,
        } = e;
        const moveable = moveableRef.current!;

        if (isDragStartEnd) {
            inputEvent.preventDefault();

            moveable.waitToChangeTarget().then(() => {
                moveable.dragStart(inputEvent);
            });
        }
        let nextChilds: TargetList;

        if (isDragStartEnd || isClick) {
            if (isCommand) {
                nextChilds = groupManager.selectSingleChilds(targets, added, removed);
            } else {
                nextChilds = groupManager.selectCompletedChilds(targets, added, removed, isShift);
            }

        } else {
            nextChilds = groupManager.selectSameDepthChilds(e.data.startTargets, added, removed);
        }
        e.currentTarget.setSelectedTargets(nextChilds.flatten());
        setSelectedTargets(nextChilds.targets());
    }}
></Selecto>

完整代碼都同步到 Next-Admin 了, 如果大家感興趣也可以研究一下。

責任編輯:武曉燕 來源: 趣談前端
相關推薦

2020-07-22 10:30:54

數據可視化分析平臺分析工具

2020-12-22 14:14:25

大數據數據可視化

2015-09-21 09:21:07

2015-10-28 13:28:57

2020-03-11 14:39:26

數據可視化地圖可視化地理信息

2024-03-06 19:57:56

探索商家可視化

2017-10-14 13:54:26

數據可視化數據信息可視化

2009-04-21 14:26:41

可視化監控IT管理摩卡

2022-08-26 09:15:58

Python可視化plotly

2024-07-25 14:04:16

2023-11-30 09:34:14

數據可視化探索

2023-03-09 15:11:30

數據可視化工具matplotlib

2024-06-06 08:27:42

2017-10-25 13:04:10

數據可視化信息可視化數據圖表

2020-03-07 21:48:46

物聯網可視化技術設計

2015-08-20 10:06:36

可視化

2018-07-11 12:30:51

編程語言Python數據可視化

2021-01-09 09:48:10

可視化自然流布局 LowCode

2022-01-14 07:56:38

流布局設計拖拽
點贊
收藏

51CTO技術棧公眾號

亚洲国产另类av| 国产一区二区三区久久悠悠色av| 日韩经典一区二区三区| xxxx18hd亚洲hd捆绑| 青青青手机在线视频观看| 日韩专区在线视频| 欧美大码xxxx| theav精尽人亡av| 91久久久久久白丝白浆欲热蜜臀| 亚洲欧美日韩中文字幕一区二区三区 | 777精品视频| 国产又粗又猛又爽又黄的视频小说| 国产麻豆一区二区三区| 欧美日韩综合视频| 国产又粗又爽又黄的视频| 四虎影院在线播放| 国产精品自在在线| 国产精品久久久久福利| 国产在线一区视频| 成人网18免费网站| 亚洲国模精品私拍| 香蕉视频xxxx| 精品网站在线| 激情av一区二区| 中国成人在线视频| 国产剧情在线观看| 99精品视频在线观看免费| 成人免费福利在线| 加勒比在线一区| 亚洲久久在线| 欧美成人精品h版在线观看| 日韩乱码人妻无码中文字幕久久| 国产精品45p| 欧美一级电影网站| 欧美三级午夜理伦三级富婆| 中文日产幕无线码一区二区| 亚洲综合色成人| 精品久久免费观看| melody高清在线观看| 99re6这里只有精品视频在线观看| 亚洲在线观看视频网站| 曰批又黄又爽免费视频| 日韩综合小视频| 日韩**中文字幕毛片| 国产情侣自拍av| 亚洲日本成人| 久久久久久18| 免费中文字幕在线观看| 在线成人直播| 久久在线免费观看视频| 五月天婷婷丁香网| 欧美一级精品片在线看| 国产亚洲一区二区精品| 在哪里可以看毛片| 杨幂一区二区三区免费看视频| 亚洲国产私拍精品国模在线观看| 精品国产aⅴ一区二区三区东京热| 国产麻豆精品| 欧美大肚乱孕交hd孕妇| 欧美一级特黄aaa| 亚洲高清影院| 欧美一级高清片在线观看| 久久久久中文字幕亚洲精品| 91亚洲无吗| 亚洲成人三级在线| 91黄色免费视频| 亚洲另类春色校园小说| 日韩成人在线观看| 巨胸大乳www视频免费观看| 精品一区毛片| 国产亚洲精品成人av久久ww| 国产破处视频在线观看| 欧美激情欧美| 九九久久久久99精品| 国产小视频在线观看免费| 国产婷婷精品| 国产精品aaaa| 99久久精品国产色欲| 国产999精品久久久久久| 久久草.com| 91在线视频| 亚洲精品视频在线看| 日韩 欧美 视频| 一二三四视频在线中文| 欧美三级视频在线播放| av在线网站免费观看| 国产精品宾馆| 伊人伊成久久人综合网站| 91n在线视频| 亚洲国产午夜| 国产精品久久久久久中文字| 国产福利资源在线| 91久色porny| 中文字幕久久综合| 超碰激情在线| 8v天堂国产在线一区二区| 美女黄色一级视频| 成人一区而且| 久久久久久12| 中文有码在线播放| 成人看片黄a免费看在线| 欧美在线一二三区| 深夜国产在线播放| 欧美午夜一区二区三区| 亚洲美女精品视频| 色喇叭免费久久综合网| 国内精品视频久久| 亚洲一区二区天堂| 2020国产精品自拍| 自拍偷拍99| 欧美专区福利免费| 精品乱人伦小说| 操她视频在线观看| 国产麻豆综合| 国产精品久久波多野结衣| 亚洲精品字幕| 亚洲人成网站色在线观看| 日韩精品视频在线观看视频| 欧美日韩精品一区二区三区视频| 免费观看成人鲁鲁鲁鲁鲁视频| 国产一区二区丝袜高跟鞋图片| 欧美一区二区黄片| 中文字幕一区二区三区不卡 | 日韩二区三区| 亚洲视频图片小说| 能在线观看的av网站| 亚洲国产高清在线观看| 自拍偷拍亚洲一区| 午夜影院在线看| 国产乱一区二区| 亚洲国产午夜伦理片大全在线观看网站 | 日韩成人在线免费观看| 劲爆欧美第一页| 狠狠色综合日日| 性欧美精品一区二区三区在线播放 | 成人三级av在线| 久久精品99久久久香蕉| 樱花视频在线免费观看| 99精品视频在线免费观看| 福利视频免费在线观看| 日本成人手机在线| 久久视频国产精品免费视频在线| 最近中文字幕在线观看| 久久久777精品电影网影网| 日韩在线视频在线观看| 精品三级av在线导航| 国模视频一区二区| 国产91免费在线观看| 亚洲免费毛片网站| 亚洲第一成肉网| 国产精品成久久久久| 国产欧美va欧美va香蕉在线| 一本一道波多野毛片中文在线 | 中文字幕精品综合| 日本成人中文字幕在线| 国精一区二区| 国产精品久久中文| 成人影视在线播放| 欧美日韩国产另类一区| 日韩成人短视频| 精品亚洲porn| 91传媒免费视频| 亚洲视频一起| 久久久久久亚洲精品不卡| 人妻无码一区二区三区久久99| 亚洲国产综合在线| 免费日本黄色网址| 久久久久在线| 亚洲欧洲精品一区二区| 亚洲国产aⅴ精品一区二区三区| 在线观看国产精品日韩av| 天堂网中文字幕| 国产精品免费久久久久| 91热视频在线观看| 欧美特黄一级| 欧美国产一区二区在线| 日本国产欧美| 欧美成人国产va精品日本一级| 欧美 日韩 国产 在线| 欧美小视频在线观看| 亚洲精品91在线| 国产一区二区在线影院| 91黄色在线看| 欧美精美视频| 成人夜晚看av| 免费成人在线电影| 一区二区在线视频播放| 99国产精品一区二区三区| 性做久久久久久免费观看| 91成人破解版| 国产麻豆视频精品| 日韩精品视频久久| 91亚洲国产成人久久精品| 成人永久免费| 国产一区二区主播在线| 欧美二区乱c黑人| 四虎精品在线| 欧美一区二区三区免费大片| 欧美三级午夜理伦| 成人免费在线视频| 久久偷拍免费视频| 久久99国产精品麻豆| 青娱乐自拍偷拍| 久久99影视| 亚洲aⅴ日韩av电影在线观看| 午夜av不卡| 欧美成人精品激情在线观看 | 99久久亚洲一区二区三区青草| 亚洲xxxx2d动漫1| 亚洲大片av| 一区二区三区一级片| 亚洲va久久久噜噜噜久久| 亚洲精品日产aⅴ| 欧美精品高清| 久久久欧美一区二区| 免费av网站在线看| 亚洲品质视频自拍网| 亚洲精品久久久蜜桃动漫| 在线欧美日韩国产| 免费观看成人毛片| 亚洲一区在线电影| 裸体武打性艳史| 国产欧美一区在线| 中出视频在线观看| 国产成人自拍网| av中文字幕网址| 老司机精品导航| 国产97在线 | 亚洲| 国产精品99一区二区| 伊人久久大香线蕉av一区| 久久综合欧美| 欧美不卡在线一区二区三区| 国产一区二区三区不卡av| 97av影视网在线观看| 日韩毛片网站| 国产一区视频在线播放| 日韩和的一区二在线| 日本欧美爱爱爱| 日本三级一区| 81精品国产乱码久久久久久| japanese色国产在线看视频| 欧美激情xxxx性bbbb| 亚洲色图美国十次| 久久综合伊人77777| 国产在线激情| 久久精品一偷一偷国产| 欧美另类极品| 久久九九全国免费精品观看| 黄色片网站在线| 久久精品国产亚洲一区二区| 看女生喷水的网站在线观看| 日韩在线视频国产| 久草免费在线| 久久香蕉国产线看观看av| 动漫一区在线| 欧美成aaa人片免费看| 18av在线播放| 欧美激情喷水视频| 98色花堂精品视频在线观看| 久久男人资源视频| av中文在线资源库| 欧美精品久久久久久久久久| 国产激情在线播放| 欧美综合在线观看| 久久亚洲精品爱爱| 成人欧美一区二区三区黑人孕妇| 国产精品视频一区视频二区 | 欧美激情在线视频二区| 久久亚洲导航| 国产91精品久久久| 欧美日韩精品免费观看视欧美高清免费大片 | 亚洲人体偷拍| 日韩毛片在线免费看| 日本一区中文字幕 | 成人亚洲精品| 国产91免费视频| 亚洲系列另类av| 中文字幕成人一区| 亚洲国产免费| 欧美自拍小视频| 国产精品18久久久| 久久精品一区二区免费播放| 国产精品久久久久永久免费观看 | 手机在线观看日韩av| 丁香婷婷综合激情五月色| 野花社区视频在线观看| 国产精品久久久久久久久久免费看| 中文字幕在线有码| 精品久久中文字幕| 亚洲一区二区三区高清视频| 精品国产一区二区精华| 国产最新视频在线观看| 久久人体大胆视频| 松下纱荣子在线观看| 91精品久久久久久久久青青| 国产一区在线电影| 一区二区三区四区视频在线观看| 在线成人h网| 亚洲老女人av| 成人免费视频免费观看| 免费黄在线观看| 亚洲图片一区二区| 91极品身材尤物theporn| 亚洲精品成人久久电影| 天堂а√在线官网| 91地址最新发布| 欧洲精品99毛片免费高清观看 | 精品日韩中文字幕| 国产精品爽爽久久| 亚洲欧洲成视频免费观看| 日本电影在线观看| 国产一区二区在线免费视频| 亚洲精品无吗| 91九色丨porny丨国产jk| 寂寞少妇一区二区三区| 国产熟妇久久777777| 亚洲成人午夜电影| 国产精品久久久久久久免费| 国产亚洲免费的视频看| av2020不卡| 999视频在线免费观看| 日韩精品免费| 久久久久国产精品熟女影院| 91网站黄www| 久久精品欧美一区二区| 91精品国产全国免费观看| av黄色在线观看| 日韩男女性生活视频| 欧美福利在线播放网址导航| 国产乱子伦精品视频| 久草中文综合在线| 日本一级免费视频| 欧美性猛xxx| 欧美视频在线观看一区二区三区| 久久久www成人免费精品| 香蕉成人在线| 亚洲欧美日本国产有色| 日韩精品亚洲一区| 欧洲女同同性吃奶| 日韩欧美精品中文字幕| 午夜黄色小视频| 韩国视频理论视频久久| 爱高潮www亚洲精品| 国产在线视频综合| 成人在线视频一区| 国产污片在线观看| 亚洲黄色片网站| 激情黄产视频在线免费观看| 国产欧美一区二区三区另类精品 | 欧美精品一二区| 免费精品一区二区三区在线观看| 91制片厂免费观看| 国产精品亚洲一区二区三区妖精 | chinese麻豆新拍video| 午夜精品福利一区二区三区蜜桃| 色一情一乱一乱一区91av| 午夜精品久久久久久久男人的天堂 | 欧美性生交片4| 二区三区在线播放| 国产欧美日韩中文| 国产精品久久观看| 中文字幕第10页| 亚洲第一在线综合网站| 亚洲 精品 综合 精品 自拍| 欧美在线视频一区| 狠狠色丁香婷婷综合影院| 污网站免费在线| 亚洲免费观看在线观看| 刘亦菲久久免费一区二区| 2019中文字幕全在线观看| 欧美理论视频| 亚洲第一成肉网| 亚洲成人激情av| 久久这里精品| 国产自产女人91一区在线观看| 中文在线日韩| 偷拍女澡堂一区二区三区| 在线中文字幕一区二区| 国产最新在线| 久久青青草原一区二区| 蜜桃视频第一区免费观看| 曰本女人与公拘交酡| 日韩av网站大全| 69堂精品视频在线播放| 肉大捧一出免费观看网站在线播放 | 午夜a成v人精品| 97人人在线| 国产精品久久久久久久久久直播 | 天天操天天射天天舔| 国产精品99久久久久久www| 欧美成人日韩| 伊人网伊人影院| 欧美电影免费提供在线观看| 偷拍自拍在线看| 中文字幕一区二区三区最新 | 国产手机在线观看| 日韩欧美视频一区| 午夜无码国产理论在线| 日本人妻伦在线中文字幕| 国产欧美日韩不卡免费|