V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
isSamle
V2EX  ›  程序员

拖拽 VUE 代码生成

  •  
  •   isSamle · 1 天前 · 895 次点击

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

    第 1 条附言  ·  1 小时 59 分钟前

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

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


    使用:

    <div>
          <div class="divA" v-draggable="{edit: false, drag: true, drop: false, clone: true}">
            A--拖拽元素
          </div>
          <div class="divB" v-draggable="{edit: true, drag: true, drop: true, clone: false}">
            B--拖入元素
          </div>
    </div>
    

    设置指令:

    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
            // 移除拖拽事件监听器
        
        }
    }
    

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

    8 条回复
    mogutouer
        1
    mogutouer  
       1 天前
    夹个 div 怕什么,一个正则把字符串处理一下不就去掉了吗
    isSamle
        2
    isSamle  
    OP
       1 天前
    @mogutouer 用$createElement 即时渲染的,本质不是字符串,是一个 json 数据,通过$createElement 渲染组件,因为按我的设想,使用过程要不断的往其中插入新的页面元素,以及配置数据
    isSamle
        3
    isSamle  
    OP
       1 天前
    @mogutouer 如果把这个 div 去掉(也就是把 Vue.draggable 去掉),那就不能再往元素里面插元素了
    isSamle
        4
    isSamle  
    OP
       1 天前
    最好是有什么方法,把一个本来的元素,设置为可拖拽插入元素,原来是什么标签还是什么标签,这样不使用 Vue.draggable 就不会多一层 div
    isSamle
        5
    isSamle  
    OP
       1 天前
    比如原本是
    <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>
    Akuta
        6
    Akuta  
       1 天前
    isSamle
        7
    isSamle  
    OP
       1 天前
    @Akuta 谢谢 我看看
    isSamle
        8
    isSamle  
    OP
       1 小时 53 分钟前
    如果用`Vue.directive('draggable', draggable)`的话,组件要重新封装,拖拽、克隆方法要重新写、数据处理方法也要重写😂,不知道能不能找到已经封装好的类似 vue.draggable 的指令直接插入使用😂
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2713 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 05:49 · PVG 13:49 · LAX 22:49 · JFK 01:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.