拖拽 VUE 代码生成 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
请不要在回答技术问题时复制粘贴 AI 生成的内容
isSamle
0.04D

拖拽 VUE 代码生成

  •  
  •   isSamle Sep 20, 2024 2148 views
    This topic created in 587 days ago, the information mentioned may be changed or developed.

    请教下市面上有什么开源项目使用了 Vue.draggable 拖拽生成 Vue 前端代码的吗?目前找到的好像都是表单构建器,维护一些组件然后拖入组件,不能直接拖拽设计前端,想找下类似项目研究研究 我用 Vue.draggable 封装了一个可拖入容器组件,然后嵌入调用之后,样式全部被干扰了开 F12 查看所有的组件会夹一层 div

    Supplement 1    Sep 21, 2024

    找到一个不太想用的解决方案,这里稍作分享--使用Vue.directive('draggable', draggable)插入自定义指令

    不想用的原因是:太繁琐 + 可能工作量太大 + 可能会遇到未知异常


    使用:

    设置指令:

    import handle from "./handle" export default { inserted(el, binding, vnode) { const { value } = binding // 添加 contenteditable 属性并设置为 true if (value && value.edit) { el.setAttribute('contenteditable', 'true') } // 添加 draggable 属性并设置为 true if (value && value.clone && value.drag) { el.setAttribute('draggable', 'true') // 添加克隆事件监听器 el.addEventListener('dragstart', handle.onDragClone); el.addEventListener('drag', handle.onDrag); el.addEventListener('dragend', handle.onDragend); } else if (value && value.drag) { el.setAttribute('draggable', 'true') // 添加事件监听器 el.addEventListener('dragstart', handle.onDragStart); el.addEventListener('drag', handle.onDrag); el.addEventListener('dragend', handle.onDragend); } // 添加可移入事件监听器 if (value && value.drop) { el.addEventListener('dragover', handle.onDragover); el.addEventListener('dragenter', handle.onDragenter); el.addEventListener('dragleave', handle.onDragleave); el.addEventListener('drop', handle.onDrop); } }, unbind(el, binding, vnode) { console.log('unbind: 只调用一次,指令与元素解绑时调用'); const { value } = binding // 移除拖拽事件监听器 } } 

    然后按自己的需要去写监听事件,简单测试了个示例:

    Supplement 2    Sep 29, 2024

    使用html5的draggable='true'+vue自定义指令,勉强也算实现了类似的拖拽效果,但是要处理的细节好多

    vue.draggable v-drag
    vue.draggable插件 自定义封装
    方法接口现成且较完善 使用指令插入到元素没有包夹div层,不干扰样式渲染
    原理是在外层囊括了一层可供操作的div盒子,对部分组件样式有影响,影响到了一些布局调整 功能方法不完善,目前只实现封装了拖拽、放下、拷贝、数据删除等逻辑,但是每次拖拽会排布到目标空间的最末尾,如果要实现拖拽排序还需要计算移动略过元素来进行计算(较复杂)

    还是求问下有没有功能方法齐全的符合预期的插件,自己封装要处理的细节太多了

    mogutouer
        1
    mogutouer  
       Sep 20, 2024
    夹个 div 怕什么,一个正则把字符串处理一下不就去掉了吗
    isSamle
        2
    isSamle  
    OP
       Sep 20, 2024
    @mogutouer 用$createElement 即时渲染的,本质不是字符串,是一个 json 数据,通过$createElement 渲染组件,因为按我的设想,使用过程要不断的往其中插入新的页面元素,以及配置数据
    isSamle
        3
    isSamle  
    OP
       Sep 20, 2024
    @mogutouer 如果把这个 div 去掉(也就是把 Vue.draggable 去掉),那就不能再往元素里面插元素了
    isSamle
        4
    isSamle  
    OP
       Sep 20, 2024
    最好是有什么方法,把一个本来的元素,设置为可拖拽插入元素,原来是什么标签还是什么标签,这样不使用 Vue.draggable 就不会多一层 div
    isSamle
        5
    isSamle  
    OP
       Sep 20, 2024
    比如原本是
    <el-container>
    <draggable>
    <el-aside width="200px">Aside</el-aside>
    <el-main>Main</el-main>
    </draggable>
    </el-container>
    如果能够改成下面实现拖拽插入的效果,那就少一层 div 就没影响
    <el-container vue-draggable>
    <el-aside width="200px">Aside</el-aside>
    <el-main>Main</el-main>
    </el-container>
    g17
        6
    g17  
       Sep 20, 2024
    isSamle
        7
    isSamle  
    OP
       Sep 20, 2024
    @Akuta 谢谢 我看看
    isSamle
        8
    isSamle  
    OP
       Sep 21, 2024
    如果用`Vue.directive('draggable', draggable)`的话,组件要重新封装,拖拽、克隆方法要重新写、数据处理方法也要重写,不知道能不能找到已经封装好的类似 vue.draggable 的指令直接插入使用
    isSamle
        9
    isSamle  
    OP
       Sep 29, 2024
    目前来看还是要自己封装
    About     Help     Advertise     Blog     API     FAQ     Solana     3608 Online   Highest 6679       Select Language
    创意工作者们的社区
    World ispowered by solitude
    VERSION: 3.9.8.5 30ms UTC 00:15 PVG 08:15 LAX 17:15 JFK 20:15
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86