日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-04-26 17:29:04 229觀看
導讀模塊演示圖片技術實現拖拽模塊我采用了 movable, 并研究了它的大量 API,最終實現了我想要的效果,當然我還設計了一套數據結構,如果大家對可視化搭建感興趣,也可以擴展成自己的拖拽搭建結構。圖片元素多選我采用了 selecto

模塊演示

圖片圖片FUG28資訊網——每日最新資訊28at.com

技術實現

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

圖片圖片FUG28資訊網——每日最新資訊28at.com

元素多選我采用了 selecto 模塊,成組管理器我采用了 @moveable/helper, 當然在使用這些庫的時候也踩了不少坑,好在已經完美解決。FUG28資訊網——每日最新資訊28at.com

下面分享一個簡單的數據結構,以支持我們的元素自由搭建:FUG28資訊網——每日最新資訊28at.com

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

工具條實現

圖片圖片FUG28資訊網——每日最新資訊28at.com

對于工具條的實現,我做了統一的封裝,以便后期可能更低成本的維護和管理:FUG28資訊網——每日最新資訊28at.com

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

接下來看看工具條的配置:FUG28資訊網——每日最新資訊28at.com

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: '水平分布空間'        },            ]}

工具條方法封裝:FUG28資訊網——每日最新資訊28at.com

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        }    }

通過以上的封裝方式我們就能輕松擴展自己的工具條啦~FUG28資訊網——每日最新資訊28at.com

接下來我們看看工具條實現的效果:FUG28資訊網——每日最新資訊28at.com

圖片圖片FUG28資訊網——每日最新資訊28at.com

當然代碼我已經提交到 github 上了, 大家感興趣可以參考研究一下。FUG28資訊網——每日最新資訊28at.com

開源地址:https://github.com/MrXujiang/next-adminFUG28資訊網——每日最新資訊28at.com

多選 & 成組實現

圖片圖片FUG28資訊網——每日最新資訊28at.com

下面直接上代碼:FUG28資訊網——每日最新資訊28at.com

<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 了, 如果大家感興趣也可以研究一下。FUG28資訊網——每日最新資訊28at.com

FUG28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-85858-0.htmlNext-Admin最佳實踐!支持可視化拖拽模塊

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 每位開發者都需要知道的七個Django命令

下一篇: Go 語言入門指南:基礎語法和常用特性解析

標簽:
  • 熱門焦點
  • Rust中的高吞吐量流處理

    作者 | Noz編譯 | 王瑞平本篇文章主要介紹了Rust中流處理的概念、方法和優化。作者不僅介紹了流處理的基本概念以及Rust中常用的流處理庫,還使用這些庫實現了一個流處理程序
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • Java NIO內存映射文件:提高文件讀寫效率的優秀實踐!

    Java的NIO庫提供了內存映射文件的支持,它可以將文件映射到內存中,從而可以更快地讀取和寫入文件數據。本文將對Java內存映射文件進行詳細的介紹和演示。內存映射文件概述內存
  • ESG的面子與里子

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之三伏大幕拉起,各地高溫預警不絕,但處于厄爾尼諾大&ldquo;烤&rdquo;之下的除了眾生,還有各大企業發布的ESG報告。ESG是&ldquo;環境保
  • 小米MIX Fold 3下月亮相:今年唯一無短板的全能折疊屏

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都有新的進展,其中榮耀、三星都已陸續發布了最新的折疊屏旗艦,尤其號榮耀Magi
  • 華為HarmonyOS 4.0將于8月4日發布 或搭載AI大模型技術

    華為宣布HarmonyOS4.0將于8月4日正式發布。此前,華為已經針對開發者公布了HarmonyOS4.0,以便于開發者提前進行適配,也因此被曝光出了一些新系統的特性
  • Android 14發布:首批適配機型公布

    5月11日消息,谷歌在今天凌晨舉行了I/O大會,本次發布會谷歌帶來了自家的AI語言模型PaLM 2、谷歌Pixel Fold折疊屏、谷歌Pixel 7a手機,同時發布了Androi
  • 蘋果140W USB-C充電器:采用氮化鎵技術

    據10 月 30 日 9to5 Mac 消息報道,當蘋果推出新的 MacBook Pro 2021 時,該公司還推出了新的 140W USB-C 充電器,附贈在 MacBook Pro 16 英寸機型的盒子里,也支
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現在已經可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
美女日韩在线中文字幕| 亚洲国产欧美国产综合一区| 欧美视频一区二区| 国产精品久久久久久亚洲毛片| 国产精品一区久久久| 国产一区二区三区最好精华液| 在线精品视频一区二区| 夜夜爽av福利精品导航| 欧美日本免费一区二区三区| 欧美性大战久久久久| 国产一区二区三区成人欧美日韩在线观看 | 国产精品九九久久久久久久| 国产精品区一区二区三区| 狠狠色2019综合网| 亚洲美女精品成人在线视频| 午夜精品视频网站| 欧美xxxx在线观看| 国产精品拍天天在线| 一区二区视频在线观看| 欧美日韩国产综合视频在线| 国产精品日韩精品欧美精品| 在线看片成人| 亚洲在线中文字幕| 裸体素人女欧美日韩| 国产精品成人在线| 一区在线观看视频| 一区二区三区四区蜜桃| 久久久久成人网| 欧美日韩在线观看一区二区三区| 国产日韩综合| 亚洲精品综合精品自拍| 久久国产免费看| 欧美色图五月天| 亚洲国产精品精华液2区45 | 欧美精品一区二区三区一线天视频| 国产精品乱子久久久久| 最近中文字幕mv在线一区二区三区四区| 亚洲欧美另类综合偷拍| 欧美国产日韩免费| 国产在线精品成人一区二区三区| 9人人澡人人爽人人精品| 六月婷婷久久| 国产午夜亚洲精品理论片色戒| 99国产精品视频免费观看| 久久久久久色| 国产精品一区久久| 99国产一区| 欧美www视频| 狠久久av成人天堂| 午夜精品视频在线| 欧美视频在线观看| 亚洲精品视频一区二区三区| 久久久久久亚洲综合影院红桃| 国产精品久久7| 亚洲精品视频在线播放| 久久青草久久| 国产一级一区二区| 亚洲欧美在线高清| 国产精品成人观看视频免费| 日韩视频不卡| 欧美精品国产一区| 亚洲日本精品国产第一区| 久久综合精品国产一区二区三区| 国产农村妇女精品一区二区| 亚洲线精品一区二区三区八戒| 欧美另类久久久品| 亚洲日本在线视频观看| 欧美成人精品激情在线观看| 在线免费观看日本欧美| 久久五月天婷婷| 激情成人综合| 久热re这里精品视频在线6| 国产自产2019最新不卡| 欧美在线一二三四区| 国产欧美婷婷中文| 欧美一区二区三区免费视频| 国产欧美一区二区三区另类精品| 亚洲欧美影音先锋| 国产日韩欧美三区| 久久精品免费电影| 韩国一区二区在线观看| 久久女同精品一区二区| 亚洲第一网站| 欧美成人一品| 亚洲精选一区| 欧美日韩三区四区| 亚洲午夜电影网| 国产精品爽黄69| 欧美夜福利tv在线| 国产一区二区三区黄视频| 久久精品成人一区二区三区| 韩国av一区二区三区| 久久婷婷丁香| 亚洲韩日在线| 欧美片第一页| 亚洲一区二区在线免费观看视频| 国产精品久久久久一区二区三区| 亚洲永久在线| 国产亚洲精品激情久久| 久久婷婷久久| 亚洲精品网站在线播放gif| 欧美日韩免费| 亚洲无线视频| 国产欧美在线播放| 久久免费观看视频| 亚洲精品久久久久中文字幕欢迎你| 欧美极品在线观看| 亚洲一区二区视频在线| 国产亚洲精品一区二区| 久久影音先锋| 亚洲伦理网站| 国产精品欧美一区喷水| 久久国产高清| 亚洲国产婷婷香蕉久久久久久| 欧美精品综合| 午夜激情综合网| 1024国产精品| 欧美日韩国内| 午夜视频一区在线观看| 黄色在线一区| 欧美日本免费| 欧美在线精品一区| 亚洲激情校园春色| 国产精品久久久久av免费| 羞羞视频在线观看欧美| 亚洲高清一区二| 欧美视频在线免费| 久久精品国产亚洲5555| 亚洲伦理在线观看| 国产亚洲精品一区二区| 欧美国产日韩精品免费观看| 亚洲免费在线电影| 亚洲福利国产精品| 国产精品日韩在线| 麻豆精品在线观看| 亚洲一区国产视频| 精品成人在线| 国产精品大全| 免费影视亚洲| 亚洲欧美一区二区在线观看| 亚洲国产一区二区三区青草影视 | 国产偷国产偷亚洲高清97cao| 免费在线国产精品| 亚洲女同在线| 91久久精品美女高潮| 国产伦精品一区二区三区高清| 欧美成人一二三| 欧美一区影院| 一本色道88久久加勒比精品| 国精产品99永久一区一区| 欧美色综合网| 久久综合网hezyo| 亚洲欧美美女| 亚洲精品在线二区| 好看不卡的中文字幕| 国产精品高清网站| 欧美黄网免费在线观看| 欧美一区激情| 亚洲天堂免费观看| 亚洲国产精品视频一区| 国产亚洲欧洲997久久综合| 欧美日韩精品福利| 久久综合影视| 欧美一区二区三区精品电影| 日韩一级大片| 亚洲国产成人91精品| 国产模特精品视频久久久久| 欧美久久视频| 久久野战av| 午夜精品视频在线| 一区二区三区精品国产| 亚洲成在线观看| 国产一区二区三区免费不卡| 国产精品久久毛片a| 欧美日韩国产色视频| 免费成人高清视频| 久久久久国内| 欧美在线视频观看免费网站| 亚洲一区三区视频在线观看| 一本色道**综合亚洲精品蜜桃冫| 亚洲国产电影| 伊人一区二区三区久久精品| 国产一区二区三区久久 | 国产精品久久久久久影视 | 亚洲日韩成人| 亚洲电影免费在线观看| 韩日成人在线| 激情小说亚洲一区| 狠狠干成人综合网| 国内揄拍国内精品少妇国语| 国产精品一区免费观看| 国产精品麻豆va在线播放| 国产精品mv在线观看| 欧美色播在线播放| 欧美日韩一区视频| 欧美日韩一视频区二区| 欧美日韩一区二区三区高清| 欧美日韩精品免费在线观看视频| 欧美成人自拍| 欧美黄色网络| 欧美精品一区二区视频| 欧美高清视频在线播放| 欧美成年网站| 欧美激情综合五月色丁香|