成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

數據可視化探索

2024-06-06 08:27:42

2023-03-09 15:11:30

數據可視化工具matplotlib

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數據可視化

2022-01-14 07:56:38

流布局設計拖拽

2021-01-09 09:48:10

可視化自然流布局 LowCode
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品成人一区二区三区吃奶 | 日韩一区二区三区精品 | 久久久久国产一区二区三区 | 成人深夜福利 | 精品一区二区三区电影 | 国产成人精品免费 | 亚洲人成人一区二区在线观看 | 久久久精品影院 | 亚洲日本视频 | 精品一二区 | 日韩国产免费观看 | 成人国产精品久久 | 国产午夜精品一区二区三区嫩草 | 亚洲精品18| 久久久久网站 | 国产精品日日做人人爱 | 久久在线 | 精品一区二区在线观看 | 国产黄色电影 | 亚洲一区中文字幕在线观看 | 91网站在线观看视频 | 亚洲高清在线观看 | 亚洲一区中文字幕 | 99爱视频 | 欧美成人精品在线观看 | 成人a免费 | 日韩一区二区三区视频在线观看 | 综合国产 | 日韩精品1区2区3区 成人黄页在线观看 | 中文字幕一区在线 | 国产一级片在线播放 | 天天操夜夜看 | 在线视频一区二区三区 | 国产精品免费观看 | 欧美激情va永久在线播放 | 国产无套一区二区三区久久 | 色综合一区二区三区 | 少妇一级淫片免费播放 | 国产精品亚洲综合 | 成人夜晚看av | 亚洲男人网 |