前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >装B利器--自己实现一个表单编辑器?低代码平台?

装B利器--自己实现一个表单编辑器?低代码平台?

作者头像
terrence386
发布2022-07-14 21:30:21
3030
发布2022-07-14 21:30:21
举报
文章被收录于专栏:JavaScript高级程序设计

变速直线运动的速度是位置函数对时间的导数,加速度是速度对时间的变化率。

关于低代码平台

低代码平台顾名思义,在开发过程中尽量减少开发人员需要写的代码的数量。对于前端来讲,表现形式主要为配置化拖拽的形式。

这里聊一下个人对拖拽式的一些理解。

页面布局及数据流

通常这些拖拽式的低代码开发平台,布局样式如下:

左侧部分为组件,中间是内容展示区域,组件拖拽过来会展示在内容区域,右侧为参数配置区域,可以在右侧为组件配置对应的参数。

上图最左侧部分定义为Setters,用来封装组件可能接受的参数,其最终表现是最右侧灰色部分的表单。这个部分是可有可无的,业务组件也可以直接接受参数,在最右侧展示参数表单进行配置。

根据之前的开发经验,数据的流程预计如下图:

参数==>Setter==>业务组件==>更新展示内容

当然也有可能不需要Setters,直接:

参数==>业务组件==>更新展示内容

当然,肯定还需要一个全局的对象来操作这些个数据流。

实现拖拽展示组件

这个操作的目的是将左侧展示的业务组件拖拽到内容展示区让它能够正常展示。

左侧的组件列表比较容易实现。将写好的组件导出一个数组然后遍历,只展示组件名称就可以。

代码语言:javascript
复制
 <DarggableComponent
    v-for="item in componentList"
    :key="item"
    :itemInfo="item"
/>

拖拽组件的实现

如果只是简单的实现这个拖拽功能,去下载一个别的包岂不是有点麻烦了?直接用dragAPI整呗。

DarggableComponent.vue

代码语言:javascript
复制
<template>
  <div class="draggable-item" draggable="true">{{ itemInfo.name }}</div>
</template>
<script>
import Vue from 'vue'
export default {
  setup() {},
  props: {
    itemInfo: Object,
  },
  data() {
    return {}
  },
  mounted() {
    console.log(this.$store)
    // let dragged
    let self = this
    /* 拖动目标元素时触发drag事件 */
    document.addEventListener(
      'drag',
      function() {
        // console.log(event)
      },
      false
    )

    document.addEventListener(
      'dragstart',
      function(event) {
        // 保存拖动元素的引用(ref.)
        // dragged = event.target
        // 使其半透明
        event.target.style.opacity = 0.5
      },
      false
    )

    document.addEventListener(
      'dragend',
      function(event) {
        // 重置透明度
        event.target.style.opacity = ''
      },
      false
    )

    /* 放置目标元素时触发事件 */
    document.addEventListener(
      'dragover',
      function(event) {
        // 阻止默认动作以启用drop
        event.preventDefault()
        // event.target.style.background = 'purple'
      },
      false
    )

    document.addEventListener(
      'dragenter',
      function(event) {
        // 当可拖动的元素进入可放置的目标时高亮目标节点
        if (event.target.className == 'contents') {
          // event.target.style.background = 'purple'
        }
      },
      false
    )

    document.addEventListener(
      'dragleave',
      function(event) {
        // 当拖动元素离开可放置目标节点,重置其背景
        if (event.target.className == 'contents') {
          event.target.style.background = ''
        }
      },
      false
    )

    document.addEventListener(
      'drop',
      function(event) {
        // 阻止默认动作(如打开一些元素的链接)
        event.preventDefault()
        // 将拖动的元素到所选择的放置目标节点中
        if (event.target.className == 'contents') {
          self.$store.commit('setRenderedComponents', self.itemInfo)
          Vue.component(self.itemInfo.key, self.itemInfo.component)
        }
      },
      false
    )
  },
}
</script>
<style>
.draggable-item {
  background: red;
  border: 5px solid green;
}
</style>

拖拽完成后如何展示组件

路由中配置组件?异步组件?render函数?直接在页面中导入组件?似乎都不合适。

我们的需求是动态注册这个组件,拖拽完成后能够在内容区域正常展示。思考后以后,采用了Vue.component这个方法,在拖拽完成后直接将我们的组件注册为全局组件,同时全局缓存一个需要渲染的组件列表。

这样我们就可以在拖拽完成后直接看到渲染结果。

代码语言:javascript
复制
document.addEventListener(
      'drop',
      function(event) {
        // 阻止默认动作(如打开一些元素的链接)
        event.preventDefault()
        // 将拖动的元素到所选择的放置目标节点中
        if (event.target.className == 'contents') {
          self.$store.commit('setRenderedComponents', self.itemInfo)
          Vue.component(self.itemInfo.key, self.itemInfo.component)
        }
      },
      false
    )

在内容展示区如何展示组件

测试了render函数以及其他方法都不行以后。忽然想到Vue有一个全局的component组件,直接用这个就行了。

代码语言:javascript
复制
<div v-for="item in renderedComponents" :key="item">
  <component :is="item.key"></component>
</div>

然后就可以实现如下功能了:

从左侧组件中拖拽组件到内容展示区,组件组渲染为正常的组件内容

http://mpvideo.qpic.cn/0bf2gaaacaaaviac7ynffbqfamgdaeyaaaia.f10003.mp4?dis_k=ef67579f866dd17671e1e077226b772b&dis_t=1657805378&vid=wxv_1876461735784546304&format_id=10003&support_redirect=0&mmversion=false

总结

表单编辑器这一类的东西有很多,但是自己没有想过去实现一个,既然之前用过,不妨仔细思考一下其中的流程,找时间自己去实现一个简单的。

接下来的任务是将数据流打通,让内容区域实现可配置化。

代码仓库:https://gitee.com/mynoe/low-code-platform.git

javascript基础知识总结

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JavaScript高级程序设计 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 关于低代码平台
  • 页面布局及数据流
  • 实现拖拽展示组件
  • 拖拽组件的实现
  • 拖拽完成后如何展示组件
  • 在内容展示区如何展示组件
  • 总结
相关产品与服务
腾讯云微搭低代码
微搭低代码是一个高性能的低代码开发平台,用户可通过拖拽式开发,可视化配置构建 PC Web、H5 和小程序应用。 支持打通企业内部数据,轻松实现企业微信管理、工作流、消息推送、用户权限等能力,实现企业内部系统管理。 连接微信生态,和微信支付、腾讯会议,腾讯文档等腾讯 SaaS 产品深度打通,支持原生小程序,助力企业内外部运营协同和营销管理。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档