如何搭建一个功能复杂的前端配置化框架(一) - 吴空

wukong-holmes 2021-11-14 原文


如何搭建一个功能复杂的前端配置化框架(一)


背景

现在很多公司主要业务是c端,拥有巨大用户和流量的同时,b端业务不可或缺,CRM,CMS,运营配置化管理平台,数据可视化平台,各种审批平台。这些系统都有几个共同的特点:需求多,变化快,查询页,列表页,提交页面。而这些页面都是相似的,UI要求低,功能简单。所以我们能不能开发一套配置化平台解放生产力呢?答案是肯定的。我们只需要配置一下Json就能生成一个页面,这个如何实现呢?我们慢慢道来……

技术选型

Nodejs + Vue/React + Json schema

框架搭建

分析:页面只需一个容器,可以理解为一个Div,在加载页面的时候,异步去分布式配置中心(分布式Redis或其他)获取页面配置,页面配置单纯的就是个Json字符串。配置数据取出来之后,我们开始解析Json,包括Json的正确性,合法性等。最后再通过Vue组件的Render方法渲染页面,看到这里,很多人会有如下的疑惑:

  1. Json格式如何定义?
  2. Json如何和组件对应起来?
  3. 组件是怎么渲染出来的?
  4. 组件间如何通信?
  5. 支持复杂的逻辑交互吗?

框架创新及优化

  • 支持无限级组件嵌套渲染

  • 简化组件间通信

  • 页面配置实时预览

疑问解答

  1. Json格式如何定义?

这个没有统一的标准,完全按照个人喜好,给大家展示一下我的定义:

{
 "uniqueId": "mt-form",
 "attrs": {
 "style": {
 "paddingBottom": "15px",
 "paddingLeft": "5px"
    }
  }
}

 

2. Json如何和组件对应起来? 我们先看一个自定义组件Form.vue的代码:

<template>
 <el-form :label-width="labelWidth" :inline="true" class="mt-form-inline">
    <slot></slot>
 </el-form>
</template>
<script>
export default {
 props: [\'labelWidth\']
}
</script>
<style>
</style>

 

新建组件库模块ComponentsLib.js,我们把自定义组件通过这个模块暴露出去:

/**
 * 引入所有公共组件库
 */
import Form from \'./Form.vue\'

module.exports = {
 /**
   * 对外暴露组件,名称id必须唯一
   */
 \'mt-form\': Form
} 

 

3. 组件是怎么渲染出来的

写了组件和暴露出组件之后,我们怎么渲染出来呢?通过Vue.component定义一个全局组件:

import Vue from \'vue\'
import ComponentsLib from \'./ComponentsLib\' // 暴露出来的组件库

/**
 * 注入全局的页面容器组件
 * 所有组件必须包裹在一个容器组件中
 */
Vue.component(\'page-container\', {
 render: function (createElement) {
 return this.deepComponents(this.pageConfig, createElement)
  },
 methods: {
 deepComponents (pageConfig, createElement) {
 if (pageConfig) {
 return createElement(ComponentsLib[pageConfig.uniqueId], {
 ...pageConfig.attrs
        }, this.deepChildren(pageConfig.children, createElement))
      }
    },
 /**
     * 递归遍历所有子组件
     * @param {} pageConfig
     * @param {*} createElement
     */
 deepChildren (pageConfig, createElement) {
 if (!pageConfig) {
 return createElement(\'span\')
      }
 if (pageConfig) {
 let children = []
 for (let i = 0; i < pageConfig.length; i++) {
 let item = pageConfig[i]
 if (item) {
 children.push(createElement(ComponentsLib[item.uniqueId], {
 ...item.attrs }, this.deepChildren(item.children, createElement)))
          }
        }
 return children
      }
    }
  },
 props: {
 pageConfig: {
 type: Object,
 required: true
    }
  }
})

可以看出主要的一点,我的组件通过组件库暴露出来,并且每个组件都有一个唯一的ID,而我在Json中配置的时候uniqueId就是对应我组件的唯一ID,这样通过Vue.component的Render方法,可以递归遍历渲染出我的组件,这样就能实现组件的无限级嵌套。

效果预览

发表于
2018-07-10 10:58 
吴空 
阅读(12249
评论(1
编辑 
收藏 
举报

 

版权声明:本文为wukong-holmes原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/wukong-holmes/p/9287763.html

如何搭建一个功能复杂的前端配置化框架(一) - 吴空的更多相关文章

  1. jquery 如何使用innerHTML – 飞肠剑

    jquery 如何使用innerHTML $(“#responsediv”) 是个Jq […]...

  2. 小程序签名 – Leepyng

    小程序签名 将文件引入到项目中即可使用,也可以根据需求添加扩展功能; 文件内容如下: 1、mini-progr […]...

  3. Win8系统搜索不到无线信号该怎么办? – ghost_xp

    Win8系统搜索不到无线信号该怎么办? 最近朋友问我他电脑安装了预装Win8中文版系统出现了一点小问题,无线设 […]...

  4. 微信公众平台开发(六) 翻译功能开发 – 云潇洒

    微信公众平台开发(六) 翻译功能开发 一、简介 上一篇文章介绍了微信公众平台天气预报功能的开发,实现了微信公众 […]...

  5. Java、Python和大数据,哪个发展前景最好? – 暮暮少年

    Java、Python和大数据,哪个发展前景最好? Java、Python和大数据,哪个发展前景最好?   J […]...

  6. 小企业必读的五大超牛创业忠告 解读 – LabVIEW开发者

    小企业必读的五大超牛创业忠告 解读 第一:一定要有激情和理念你才能感染自己和其他人。在最困难的时候,在所有人绝 […]...

  7. linux安装java环境 – 傻傻小菜鸟

    linux安装java环境 转自:http://dawndiy.com/archives/155/   本人用 […]...

  8. C语言 – 快速排序算法

    1、 快速排序算法 1 #include<stdio.h> 2 3 struct node 4 { […]...

随机推荐

  1. 系统架构设计师考试大纲 – 愚见未来

    一、考试说明: 1.考试目标        考试合格人员应能够根据系统需求规格说明书,结合应用领域和技术发展的 […]...

  2. Mac M1原生(ARM64)Golang dev&debug

    前言 通过本文最终实现了在M1芯片的Mac mini上的Goland的开发,并通过编译源码解决了无法DEBUG […]...

  3. 设计模式——中介模式

    引言 假设有老赵、老钱、老孙三位房东,他们自己手里有一套房租需要出租,但是又有不同的需求,于是相互商量: 可是 […]...

  4. 如何用Go实现一款类似滴滴优步的网络约车软件(含源码)

    导读:我们经常使用打车软件出行,也经常思考其架构设计。本文作者在所在国家也负责开发一款打车软件,并且开源了其中 […]...

  5. Unity 3D 新手强烈推荐教程

    (请注意:老鸟可以离开了。本教程是推荐给几乎啥都不会的新手的。) 此教程虽然都是英文的,但是听不懂没关系,视频 […]...

  6. Java提示错误: 找不到或无法加载主类

    C:\Java\IdeaProjects\java>java xxxx 错误: 找不到或无法加载主类 x […]...

  7. Spring Boot 系列:日志动态配置详解

    世界上最快的捷径,就是脚踏实地,本文已收录架构技术专栏关注这个喜欢分享的地方。 开源项目: 分布式监控(Git […]...

  8. HashMap分析之红黑树树化过程

    概述 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型。随着JDK(Java De […]...

展开目录

目录导航