如何搭建一个功能复杂的前端配置化框架(一)
背景
现在很多公司主要业务是c端,拥有巨大用户和流量的同时,b端业务不可或缺,CRM,CMS,运营配置化管理平台,数据可视化平台,各种审批平台。这些系统都有几个共同的特点:需求多,变化快,查询页,列表页,提交页面。而这些页面都是相似的,UI要求低,功能简单。所以我们能不能开发一套配置化平台解放生产力呢?答案是肯定的。我们只需要配置一下Json就能生成一个页面,这个如何实现呢?我们慢慢道来......
技术选型
Nodejs + Vue/React + Json schema
框架搭建
分析:页面只需一个容器,可以理解为一个Div,在加载页面的时候,异步去分布式配置中心(Redis或其他)获取页面配置,页面配置单纯的就是个Json字符串。配置数据取出来之后,我们开始解析Json,包括Json的正确性,合法性等。最后再通过Vue组件的Render方法渲染页面,看到这里,很多人会有如下的疑惑:
- Json格式如何定义?
- Json如何和组件对应起来?
- 组件是怎么渲染出来的?
- 组件间如何通信?
- 支持复杂的逻辑交互吗?
框架创新及优化
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方法,可以递归遍历渲染出我的组件,这样就能实现组件的无限级嵌套。
效果预览
如何搭建一个功能复杂的前端配置化框架(一)相关推荐
- 【微前端】手把手带你从零开始搭建一个qiankun+vue微前端应用
前言 小伙伴们大家好.上一篇文章中我们分享了qiankun的一些概念和特性,以及基于qiankun实现有一个微前端应用的大概步骤,最后以qiankun加vue2.0为例给出了快速搭建qiankun微前 ...
- 工作随记1:搭建一个简单局域网,并配置远程管理
需求: 搭建如图所示的网络,要求主楼与辅楼能够相互通信,且核心交换机与辅楼主交换配置管理vlan并开启telnet,使通信办电脑可以远程维护. 工具: 华为模拟器ensp 规划: 1.主楼通信办划入v ...
- 手把手教你免费搭建一个功能强大的小程序商城
微信小程序近几年可谓是不可错过的一个时代风口,背靠微信10亿用户基数,小程序电商也日益蓬勃发展,不论是微信官方还是第三方开发者,都围绕小程序做了很多事情,包括我们每天扫一扫的健康码等都是用小程序做的, ...
- 以太坊DPOS私链搭建--使用gttc,搭建一个可用于性能测试的区块链框架(1)
遇到的一些坑 bootnode 一直不起作用,所以决定不用它,改用static-nodes.json 在阿里云机器上编译gttc 系统Ubuntu16.04 想把eth服务部署到docker中方便移植 ...
- 用 cooking 搭建一个简单又优雅的 Vue 项目开发环境 (入门篇)
本文适合 Vue 的初学者,以及对 webpack 不熟悉的同学阅读.前提是你要会用基本的命令行. Node 和 NPM,以及掌握 ES2015 的基础知识.本文都是在 macOS 环境下运行,要求使 ...
- 用树莓派搭建全功能NAS服务器(01):树莓派基础操作OMV搭建
写在前面 对于文件互传来说,局域网和云盘的操作总是独立的,而且很难将两者的优势合为一体.如果想要集多种优势为一体,那么NAS应该就是较为完美的解决方案了. 在这个系列中我们尽量跳过一些枯燥的理论知识, ...
- 从零开始学习使用VUE搭建一个管理系统页面
因为我项目中需要使用VUE,因此我接触到了VUE这个前端框架.我分享下学习VUE的流程. 一.安装vue-cli: npm install -g @vue/cli # OR yarn global a ...
- 在Linux上搭建一个自己的网站
文章目录 前言 配置 实验 基于不同IP访问 基于不同端口访问 基于域名访问 前言 搭建一个网站,首先需要的是Web服务器,我们这里使用 Apache,它是由 httpd 服务调度,我们先使用这个服务 ...
- 记录nodejs使用express搭建一个api服务器程序(5)-nodejs操作SQL数据库,Sequelize和Knex
此文章是我自己用来记录如何搭建一个以express为基础的api服务器框架的过程,并不是什么新手教程,并不会每一步都写得非常详细,如果您要阅读此文,需要一点nodejs和编写代码的基础知识 文接上篇 ...
最新文章
- 开发WAP站点之---使用PC电脑浏览器访问WAP手机站点 (转)
- lambda--整理的部分网络博文
- php批量生成html文件,php 批量生成html、txt文件
- linux查看命令类型,查看linux命令类型
- hdu 6016 Count the Sheep
- 【算法】逆波兰式(后缀表达式)的计算 中缀表达式转后缀表达式(逆波兰式)
- 自己写个简易版 PicGo
- App在后台运行时如何保存数据到sqlite数据库
- 湖北省土壤有机质空间分布数据
- Spring Thymeleaf无法显示图片
- Android Adapter详解
- stm32学习之定时器中断时间设置与计算
- Idea 链接mysql数据库失败 Schemas中为空
- Python相关库的安装
- 如何把D盘多余空间返还给C盘
- 1046 mysql_mysql 1046 错误解决实例_MySQL
- TensorFlow学习笔记1:graph、session和op
- [Pytorch 常用函数] 激活函数Relu, Leaky Relu
- 我被Algo套死了......
- (C语言)找出一个二维数组中的鞍点,即该位置上的元素在该行最大,在该列上最小,也可能没有鞍点。存在则输出坐标;否则输出 -1.