【摸鱼神器】UI库秒变LowCode工具——列表篇(二)维护json的小工具

714 阅读4分钟

相关文章

上一篇介绍了一下如何实现一个可以依赖 json 渲染的列表控件,既然需要 json 文件,那么要如何维护这个 json 文件就成了重点,如果没有好的维护方案的话,那么还不如直接用UI库。

所以需要我们做一个维护 json 文件的小工具,维护 json 有多方法:

  • 最基础的方法就是手撸,显然这个是下下策。
  • 可以通过编辑器的插件来维护,不过这种方式针对所有 json,不会对某种需求做优化。
  • 或者做一套维护 json 的增删改查,这样可以维护 json 的每一个属性,只是实现起来比较繁琐。
  • 最后就是可视化 + 拖拽的方式,对于某些属性的修改,用起来会非常爽。

于是我们发扬一不怕苦,二不怕累的钻研精神,终于做了一个比较完美的小工具,可以非常方便的维护 json 文件。

小工具的功能

  • 通过拖拽的方式修改一部分属性。
  • 修改【列表】的属性。
  • 添加、修改【列】的属性。
  • 修改后立即重新渲染看效果。

修改的时候可以立即看到效果,json 对应的是组件的属性,更改后如果能够立即看到效果,显然更直观。

实现方式

可视化 + 拖拽 + 手势 的方式修改属性

可以实现以下功能:

  • 表头和内容的对齐方式。
  • 调整列的先后顺序,交换两个列的位置。
  • 调整列宽
  • 移除列

优点是用起来比较爽,尤其是调整列的宽度、先后顺序的时候,非常直观、简单、快捷。 当然缺点也很明显,只能用于维护一部分属性,其他属性的维护还得做表单维护。

11列-调整列顺序.gif

列表属性

我们可以基于 el-table 的属性做一个表单:

001-列表属性.png

修改表单的值,会立即渲染,可以实时查看属性变化后的效果。
也可以快速掌握 el-table 各个属性都是什么意思。

  • 模板

使用低代码的表单控件来维护列表的两个属性:低代码需要的属性使用一个控件,el-table 需要的属性使用另一个控件。

  <!--低代码需要的属性-->
  <nf-form
    v-form-drag="baseGridProps"
    :model="meta.gridMeta"
    v-bind="baseGridProps"
    size="small"
    label-width="110px"
  >
  </nf-form>
  <!--el-table需要的属性-->
  <nf-form
    v-form-drag="baseGridTable"
    :model="meta"
    v-bind="baseGridTable"
    size="small"
    label-width="110px"
  >
  </nf-form>

然后加载需要的json 文件,绑定属性。

  • ts
  import { defineComponent, reactive, computed, watch } from 'vue'
  import grid_base from './json/grid-base.json'
  import grid_table from './json/grid-table.json'

  export default defineComponent({
    name: 'nf-help-grid-item',
    props: {
      meta: Object,
      reMeta: Object
    },
    setup(props, context) {
      // 基础属性的表单需要的 meta,创建表单用
      const baseGridProps = reactive(grid_base)
      const baseGridTable = reactive(grid_table)

      // 定义表单的 model
      const { meta, reMeta } = props
     
      watch(props.meta, () => {
        // 看看属性,如果是默认值,则去掉
        Object.keys(baseGridTable.itemMeta).forEach(key => {
          const item = baseGridTable.itemMeta[key]
          const colName = item.colName
          const val = props.meta[colName]

          switch (colName) {
            case 'height':
            case 'show-header':
            case 'fit':
            case 'select-on-indeterminate':
            case 'lazy':
              // 不删除的属性
              props.reMeta[colName] = val
              break
            default:
              // 如果是默认值、空,则删除属性
              if (!(val) || val === item.defValue) {
                delete props.reMeta[colName]
              } else {
                 props.reMeta[colName] = val
              }
              break
          }
        })
      })

      // 设置 colOrder 的备选项
      watch(meta.itemMeta, () => {
        baseGridProps.itemMeta[200].optionList.length = 0
        Object.keys(meta.itemMeta).forEach(key => {
          const item = meta.itemMeta[key]
          baseGridProps.itemMeta[200].optionList.push({
            "value": item.id,
            "label": item.label // colName
          })
        })
      }, {immediate: true})
       
      return {
        baseGridProps,
        baseGridTable,
        json
      }
    }
  })

卡片的形式维护列表属性

  <!--维护列表的 meta -->
  <el-row :gutter="20">
    <el-col :span="8">
      <el-card class="box-card">
        <template #header>
          <div class="card-header">
            <span>列表属性</span>
          </div>
        </template>
        <el-scrollbar height="600px">
          <help-grid-base :meta="gridMeta" :reMeta="reMeta"/>
        </el-scrollbar>
      </el-card>
    </el-col>
    <el-col :span="8">
      <el-card class="box-card">
        <template #header>
          <div class="card-header">
            <span>导出json</span>
          </div>
        </template>
        <help-grid-ouput :reMeta="gridMeta"></help-grid-ouput>
      </el-card>
    </el-col>
    <el-col :span="8">
      <el-card class="box-card">
        <template #header>
          <div class="card-header">
            <span>列属性</span>
          </div>
        </template>
        <help-grid-col :formMeta="gridMeta"/>
      </el-card>
    </el-col>
  </el-row>

使用 el-card 把列表的属性和列的属性整合一下。

“抽屉”的方式维护列表属性

200列表的维护.png

  <!--模板-->
  <el-drawer
    v-model="drawerInfo.isShow"
    title="维护 meta"
    :with-header="false"
    :modal="false"
    size="450px"
  >
    <!--表单-->
    <el-tabs type="border-card">
      <el-tab-pane label="列表">
        <!--基础属性-->
        <component
          :is="tabComp.base"
          :meta="gridMeta"
          :reMeta="reMeta"
        ></component>
      </el-tab-pane>
      <el-tab-pane label="列">
        <!--列-->
        <component
          :is="tabComp.col"
          :formMeta="gridMeta"
        ></component>
      </el-tab-pane>
      <el-tab-pane label="导出">
        <component
          :is="tabComp.output"
          :reMeta="reMeta"
        ></component>
      </el-tab-pane>
    </el-tabs>
  </el-drawer>

列的属性

我们可以基于 el-table-colmun 的属性做一个表单:

002-列属性.png

可以修改列的属性:

  • 对齐方式
  • 字段名、标签
  • 宽度
  • 固定列
  • 是否排序
  • 是否可以拖拽
  • 是否显示提示
  • class名称
  • 其他

用 “抽屉”的方式维护列的属性

抽屉列表.png

使用 el-drawer 整合列表属性、列属性和导出的功能。这样不影响列表页面的使用,需要的时候才需要打开“抽屉”。

导出

json 维护好之后需要导出的功能,这里提供了两种方式:

  • 作为 el-table 的属性,使用 v-bind="tableProps" 的方式绑定。

010-导出列表属性.png

  • json 文件的方式,可以用于渲染列表。

012-导出json格式的属性.png

  • 导出 json(得到 json 文件或者 js 对象)

导出JSON.png

源码

gitee.com/naturefw-co…

gitee.com/naturefw-co…

gitee.com/naturefw-co…

在线演示

naturefw-code.gitee.io/nf-rollup-h…