精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

丁香花在线观看完整版电影| 国产精品美女免费视频| 国产不卡一区二区在线观看| 国产亚洲色婷婷久久99精品91| 欧美精品一二三四区| 精品一区二区三区免费看| 久久国产欧美| 日韩精品一区二区三区swag| 亚洲二区自拍| 免费无码国产精品| 欧美丝袜美腿| 亚洲国产一区视频| 91九色精品视频| 日本美女xxx| 性感女国产在线| a级高清视频欧美日韩| 欧美日韩福利电影| 色综合五月婷婷| 日本美女在线中文版| 日本亚洲天堂网| 亚洲色图25p| 欧美女人性生活视频| 人妻无码一区二区三区久久99| 天天做天天爱综合| 欧美电影一区二区| 五月天男人天堂| 国产永久免费视频| 99久久婷婷| 亚洲精品福利在线| 欧美午夜小视频| 天天综合永久入口| 国产精品五区| 精品亚洲男同gayvideo网站| 黄色一级片播放| 日本私人网站在线观看| 日韩一级免费| 日韩精品在线视频观看| 一级片黄色免费| 亚洲天堂一区二区| 中文字幕巨乱亚洲| 成人黄色网免费| 国产午夜手机精彩视频| 免费看日产一区二区三区| 欧美视频国产精品| 日韩福利影院| 中文字幕久久久久| 97精品国产福利一区二区三区| 欧美日韩精品一区二区天天拍小说 | 成人免费看片98| 91精品久久久久久综合五月天| 亚洲国产毛片aaaaa无费看| 国产精品sss| 国产女人18毛片18精品| 在线精品在线| 亚洲视频axxx| 能免费看av的网站| 久久er热在这里只有精品66| 亚洲嫩草精品久久| 国内精品国语自产拍在线观看| 黄色在线免费观看| 91亚洲国产成人久久精品| 亚洲偷欧美偷国内偷| 爱情岛论坛成人| 在线视频观看国产| 91一区二区三区在线播放| 国产狼人综合免费视频| 日本熟妇毛茸茸丰满| 精品国产一区探花在线观看| 91精品婷婷国产综合久久性色| 婷婷无套内射影院| 福利在线免费视频| 综合久久给合久久狠狠狠97色| 91精品国产99久久久久久红楼 | 国产精品中文在线| 亚洲无码精品在线播放| 亚洲经典在线| 色婷婷综合成人| 黄色国产在线视频| 粉嫩av一区二区三区四区五区| 亚洲一区电影777| 国产人妻777人伦精品hd| 日本在线免费中文字幕| 亚洲人成精品久久久久| 欧美午夜精品理论片a级大开眼界| 国产乱码精品一区二区| 日韩精品色哟哟| 午夜精品久久17c| 91嫩草丨国产丨精品| 国内自拍视频一区二区三区| 日韩少妇与小伙激情| 亚洲一区二区三区蜜桃| 青青草91久久久久久久久| 精品视频一区在线视频| 亚洲色图第四色| 欧美久久久久| 麻豆乱码国产一区二区三区| 中文字幕成人动漫| 另类在线视频| 欧美大片在线观看| 久久中文字幕人妻| 日本福利一区| 色妞色视频一区二区三区四区| 久久99久久久| 欧美va亚洲va日韩∨a综合色| 丝袜情趣国产精品| 国产精品日日夜夜| 亚洲视频一二| 国产精品日本精品| 少妇人妻偷人精品一区二区 | 黄色一级片中国| 成人亚洲一区| 国产+人+亚洲| 国产精品111| 久久av中文字幕片| 国产日韩欧美综合| 中文字幕+乱码+中文乱码91| 国产精品一级黄| 51国偷自产一区二区三区的来源 | av中文字幕不卡| 亚洲午夜精品一区二区三区| 国产福利免费在线观看| 久久婷婷国产综合精品青草| 精品国产91亚洲一区二区三区www| 国产乱码精品一区二三区蜜臂 | 日韩欧美黄色影院| 亚洲女优在线观看| 欧美午夜精品一区二区三区电影| 色综合久久久888| 91麻豆国产在线| 久久久www成人免费毛片麻豆 | 欧美丝袜一区二区| 波多野吉衣在线视频| 亚洲一区二区三区日本久久九| 深夜福利一区二区| 国产男人搡女人免费视频| 美国毛片一区二区| 亚洲综合中文字幕在线观看| 亚洲av永久纯肉无码精品动漫| 国产成人av电影在线观看| 国产日本一区二区三区| 欧美大片黄色| 日韩欧美一区视频| 久久性爱视频网站| 国产精品www994| 亚洲综合精品伊人久久| av香蕉成人| 狠狠综合久久av一区二区小说| 亚洲成人福利在线观看| 爽爽窝窝午夜精品一区二区| 国产无一区二区| 91久久免费观看| 无码人妻丰满熟妇区毛片| 澳门av一区二区三区| 欧美日韩中文精品| 美女扒开腿免费视频| 亚洲影视一区二区三区| 九九热这里只有精品免费看| 一级黄色片在线看| 国产精品乱码一区二区三区软件 | 欧美性xxxxxx| 国产艳俗歌舞表演hd| 欧美激情在线免费| 久久精品这里热有精品| 日韩精品一区三区| 亚洲一区免费观看| 9色porny自拍视频一区二区| 成人av免费电影| 无码人妻丰满熟妇区五十路| 26uuu色噜噜精品一区| 日本一区二区在线| 性欧美video高清bbw| 欧美日韩一区二区三区在线免费观看 | 888av在线| 亚洲午夜电影网| 欧美人与z0zoxxxx视频| 亚洲天堂一区二区在线观看| 青青一区二区| 日本精品久久久| 91video| 国产午夜亚洲精品不卡| 亚洲视频第二页| 青青操综合网| 国产精品福利网站| 五月婷婷在线播放| 依依成人综合视频| 美女在线视频一区二区 | 一级性生活视频| 综合在线影院| 不卡av电影院| 涩涩视频在线观看免费| 欧美色倩网站大全免费| 玖玖爱免费视频| 久久婷婷久久一区二区三区| 最新av免费在线观看| 亚洲日本va中文字幕| 欧美在线视频网| 麻豆电影在线播放| 欧美在线一区二区| 粉嫩av蜜桃av蜜臀av| 美女脱光内衣内裤视频久久网站 | 亚洲国产综合色| 91激情视频在线观看| 国产精品一区二区久激情瑜伽| 国模无码视频一区二区三区| 先锋资源久久| 成人久久久久爱| 在线观看v片| 欧美成人三级视频网站| a在线观看视频| 亚洲欧美激情小说另类| 好吊一区二区三区视频| 激情深爱一区二区| 久久久国产精华液999999| 91伊人久久| 韩国精品美女www爽爽爽视频| av大全在线免费看| 日韩精品在线电影| 黄色一级大片在线免费看国产一 | 最近2019年手机中文字幕| 女人18毛片一区二区三区| 欧美高清视频一二三区 | 国产精品30p| 国产精品护士白丝一区av| 97久久人人超碰| 亚洲77777| 日韩免费看片| 国产一区私人高清影院| 韩国成人动漫| 尤物九九久久国产精品的分类| 精品成人无码久久久久久| 亚洲不卡一区二区三区| 亚洲国产欧美视频| 成人精品一区二区三区中文字幕 | 西西裸体人体做爰大胆久久久| 好看的日韩精品视频在线| 国产精品亚洲欧美一级在线| 久久久久久综合网天天| 亚洲人视频在线观看| 精品国精品自拍自在线| 久久免费激情视频| 亚洲国产精品成人久久综合一区| av网页在线观看| 成人精品gif动图一区| 国产性xxxx18免费观看视频| 日本一区二区在线看| 欧美人xxxxx| 亚洲欧美校园春色| 国产一区玩具在线观看| 久久69成人| 国产在线精品播放| 外国成人毛片| 4438全国亚洲精品在线观看视频| √天堂资源地址在线官网| 亚洲一区二区久久久| 国产高清在线看| 在线观看久久久久久| 77导航福利在线| 理论片在线不卡免费观看| 中国av在线播放| 国内精品久久久久伊人av| 99thz桃花论族在线播放| 日韩中文字幕视频| 免费av不卡| 欧美裸体xxxx极品少妇| xxxcom在线观看| 日本精品久久中文字幕佐佐木| 欧美人与性动交xxⅹxx| 国产精品免费久久久久影院| 亚洲成人精品综合在线| 97伦理在线四区| 久久亚州av| 欧美一区二区高清在线观看| 日韩国产在线| 久久香蕉视频网站| 欧美偷拍自拍| 女女百合国产免费网站| 黄色另类av| 日韩有码免费视频| 激情综合网最新| 99re这里只有| 国产成人免费视| 一道本视频在线观看| 韩日av一区二区| 国产一级伦理片| 国产精品丝袜一区| 久久久久无码精品国产| 色综合天天做天天爱| 好吊操这里只有精品| 亚洲精品国久久99热| 羞羞影院体验区| 欧美精品乱人伦久久久久久| 日本黄色三级视频| 中文字幕日韩精品有码视频| 肉丝一区二区| 日韩视频在线一区| 日本不良网站在线观看| 韩剧1988免费观看全集| 国产三级一区| 国内精品视频免费| 99久久综合狠狠综合久久aⅴ| 国产精品成人久久电影| 蜜臀av国产精品久久久久| 久久久男人的天堂| 成人黄色大片在线观看| 极品久久久久久久| 性欧美疯狂xxxxbbbb| 在线观看中文字幕码| 亚洲精品福利免费在线观看| sm国产在线调教视频| 国产mv久久久| 国产成人福利av| 国产伦精品一区二区三区免| 澳门久久精品| 国产一区二区三区黄| 色喇叭免费久久综合| 99福利在线观看| 成人av片在线观看| 在线看的片片片免费| 在线看不卡av| 性xxxxbbbb| 欧美黑人一级爽快片淫片高清| 里番在线播放| 91精品久久久久久久| 久久91麻豆精品一区| 一本久道高清无码视频| 亚洲欧洲一区| 污视频在线观看免费网站| 中文字幕欧美三区| 无码人妻av一区二区三区波多野| 亚洲国产精品字幕| 天堂8中文在线| 亚洲va电影大全| 希岛爱理一区二区三区| 污视频网址在线观看| 国产乱码精品一区二区三| 天天干天天舔天天操| 欧美性videos高清精品| 污污视频在线免费看| 久久青草精品视频免费观看| 亚洲视频国产| 蜜臀av性久久久久蜜臀av| 久久精品国产精品亚洲综合| 日本一区二区视频在线播放| 91国产丝袜在线播放| 久草视频视频在线播放| 最近2019中文字幕第三页视频| 欧美特大特白屁股xxxx| 欧美精品一区二区三区在线看午夜 | 日本一区二区三区视频视频| 永久免费看片直接| 亚洲成人av电影在线| 亚洲AV无码一区二区三区少妇 | 日韩精品久久久| 亚洲一区二区免费看| 无码人妻精品一区二区三应用大全| 岛国视频午夜一区免费在线观看| 三级毛片在线免费看| 国产91久久婷婷一区二区| 精品久久国产| 午夜免费福利视频在线观看| 亚洲人成网站色在线观看 | 亚洲美女中文字幕| 黄视频在线观看网站| 欧美亚洲成人精品| 亚洲人成精品久久久| 欧美激情精品久久久久久小说| 国产欧美精品区一区二区三区| 在线免费一级片| 久久久国产在线视频| 1769国产精品视频| 日本精品免费在线观看| 国产日韩精品一区二区三区| 亚洲天堂网视频| 久久99亚洲精品| 亚洲三级网页| 污污动漫在线观看| 亚洲激情av在线| 牛牛热在线视频| 97人人做人人爱| 精品精品久久| 乳色吐息在线观看| 国产精品欧美经典| 99在线精品视频免费观看20| 久久久久久国产精品| 一呦二呦三呦国产精品| 色天使在线观看| 亚洲福利一区二区三区| 国产视频福利在线| 91手机在线视频| 亚洲av无码乱码国产精品| 国产视频在线观看一区二区| 成人精品电影在线| 99re视频在线观看| 男人天堂欧美日韩| 波多野结衣亚洲一区二区| 亚洲国产欧美一区二区三区久久| 嫩草伊人久久精品少妇av杨幂| av在线免费观看国产| 国产一区二区电影| √天堂中文官网8在线|