背景
现在很多公司主要业务是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.支持无限级组件嵌套渲染

2.简化组件间通信

3.页面配置实时预览

疑问解答

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方法,可以递归遍历渲染出我的组件,这样就能实现组件的无限级嵌套。

效果预览

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

  1. 【微前端】手把手带你从零开始搭建一个qiankun+vue微前端应用

    前言 小伙伴们大家好.上一篇文章中我们分享了qiankun的一些概念和特性,以及基于qiankun实现有一个微前端应用的大概步骤,最后以qiankun加vue2.0为例给出了快速搭建qiankun微前 ...

  2. 工作随记1:搭建一个简单局域网,并配置远程管理

    需求: 搭建如图所示的网络,要求主楼与辅楼能够相互通信,且核心交换机与辅楼主交换配置管理vlan并开启telnet,使通信办电脑可以远程维护. 工具: 华为模拟器ensp 规划: 1.主楼通信办划入v ...

  3. 手把手教你免费搭建一个功能强大的小程序商城

    微信小程序近几年可谓是不可错过的一个时代风口,背靠微信10亿用户基数,小程序电商也日益蓬勃发展,不论是微信官方还是第三方开发者,都围绕小程序做了很多事情,包括我们每天扫一扫的健康码等都是用小程序做的, ...

  4. 以太坊DPOS私链搭建--使用gttc,搭建一个可用于性能测试的区块链框架(1)

    遇到的一些坑 bootnode 一直不起作用,所以决定不用它,改用static-nodes.json 在阿里云机器上编译gttc 系统Ubuntu16.04 想把eth服务部署到docker中方便移植 ...

  5. 用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)

    本文适合 Vue 的初学者,以及对 webpack 不熟悉的同学阅读.前提是你要会用基本的命令行. Node 和 NPM,以及掌握 ES2015 的基础知识.本文都是在 macOS 环境下运行,要求使 ...

  6. 用树莓派搭建全功能NAS服务器(01):树莓派基础操作OMV搭建

    写在前面 对于文件互传来说,局域网和云盘的操作总是独立的,而且很难将两者的优势合为一体.如果想要集多种优势为一体,那么NAS应该就是较为完美的解决方案了. 在这个系列中我们尽量跳过一些枯燥的理论知识, ...

  7. 从零开始学习使用VUE搭建一个管理系统页面

    因为我项目中需要使用VUE,因此我接触到了VUE这个前端框架.我分享下学习VUE的流程. 一.安装vue-cli: npm install -g @vue/cli # OR yarn global a ...

  8. 在Linux上搭建一个自己的网站

    文章目录 前言 配置 实验 基于不同IP访问 基于不同端口访问 基于域名访问 前言 搭建一个网站,首先需要的是Web服务器,我们这里使用 Apache,它是由 httpd 服务调度,我们先使用这个服务 ...

  9. 记录nodejs使用express搭建一个api服务器程序(5)-nodejs操作SQL数据库,Sequelize和Knex

    此文章是我自己用来记录如何搭建一个以express为基础的api服务器框架的过程,并不是什么新手教程,并不会每一步都写得非常详细,如果您要阅读此文,需要一点nodejs和编写代码的基础知识 文接上篇 ...

最新文章

  1. 开发WAP站点之---使用PC电脑浏览器访问WAP手机站点 (转)
  2. lambda--整理的部分网络博文
  3. php批量生成html文件,php 批量生成html、txt文件
  4. linux查看命令类型,查看linux命令类型
  5. hdu 6016 Count the Sheep
  6. 【算法】逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)
  7. 自己写个简易版 PicGo
  8. App在后台运行时如何保存数据到sqlite数据库
  9. 湖北省土壤有机质空间分布数据
  10. Spring Thymeleaf无法显示图片
  11. Android Adapter详解
  12. stm32学习之定时器中断时间设置与计算
  13. Idea 链接mysql数据库失败 Schemas中为空
  14. Python相关库的安装
  15. 如何把D盘多余空间返还给C盘
  16. 1046 mysql_mysql 1046 错误解决实例_MySQL
  17. TensorFlow学习笔记1:graph、session和op
  18. [Pytorch 常用函数] 激活函数Relu, Leaky Relu
  19. 我被Algo套死了......
  20. (C语言)找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.

热门文章

  1. Fragment中使用viewLifecycleOwner/getActivity/this
  2. js 判断是否为null
  3. ppt怎么加注解文字_ppt注释的使用方法
  4. Java并发之同步的产生及解决
  5. iOS进阶之架构设计MVVM的实现示例(4)
  6. (0011) iOS 开发之模拟HTTP请求与响应,返回自己想要的报文。
  7. python transformers_transformers 安装
  8. Vue Router路由嵌套
  9. redis主从复制下哨兵模式---选举原理
  10. 第七章 ReentrantLock总结