赞
踩
前言
低代码的概念早在很多很多年前就已经出现了,比如最早期的Dreamweaver 1.0
,使用这种可视化编辑工具根本不需要投入较高的学习成本就可以轻松实现一个Web页面。而低代码最大的初衷也正是让开发者或用户减少编码时间,从而把更多的时间和精力用在网站的体验、设计当中
低代码
(Low-Code)从字面意思来讲,低
就是少;在一般标准或平均程度之下
,那低代码
自然就是少代码
,也就是说不需要付出太多的代码成本
如果想要从0实现一个可以在Web
中访问的网页,那最好要掌握的技术必然是Html
、Css
、JavaScript
,大部分情况下仅仅有了以上三种技术的加持是不够的,为了让所生产出来的Web页面
有着高维护性和高灵活性,一般要根据网页中的功能进行模块划分,以及确定页面的整个层次、结构等,其次再去考虑UI
等设计类问题
通过上述描述可以发现,实现一个Web页面
的学习成本,对于一个并不长期从事于网页开发的用户来说,这种开发方式所带来的学习成本是较大的;而低代码则不同,它不需要付出太多的代码成本,换句话说,即使零代码基础也可以轻松构建Web页面
随着一个个可视化编辑工具或者说低代码平台的问世,低代码的优点也逐渐突出,比如上手速度快、开发效率高,不需要去考虑高学习成本所带来的负担。有着页面可视化的加持
,网页的布局、设计、UI等尽在掌握之中。通过拖拽组件的方式,可以在最短时间内实现最初的想法或设计,从而不用将过多的精力投入至编程中
这里来分析较为亲切的Dreamweaver CS6
页面布局
dw-menu.png
上方的菜单栏中包含了几乎布局所能用到的所有操作,比如插入表格、图片,同时你也可以通过插入-布局对象-div
来实现整个页面的div一把梭
dw-table1.gif
右边管理栏则是对于文件夹、外部资源、CSS样式的一些其它操作
下方属性栏则是对添加的dom
元素进行设置,比如调整宽、高等属性
dw-cs6-set-prop.gif
通过上面的种种功能,或插入亦或拖拽,都可以实现一个Web页面
,也不需要导出、预览等功能,因为Dreamweaver
始终会牢记这些基本要素
说完Dreamweaver这类可视化编辑工具之后,现在来看看实现一个Web版低代码平台
的方式大概有哪些
由浏览器完成构建、渲染;服务端则提供一些依赖包
由服务端完成构建;浏览器则只负责渲染
这里采用第一种实现方式,也就是由前端完成一系列工作
,或者您也可以选用SSR
的方式由服务端完成所有基本操作
本篇文章大概通过以下步骤来从0至1实现低代码平台
快速完成静态页面布局
确定能够被拖拽的组件有哪些,以及它们的存在方式是什么
选择一种适用于各组件间进行通信的方式
实现拖拽
渲染被拖拽组件
确保组件属性更改后可以实时映射至画布区域
如果将一个功能较为完整的低代码平台实现方式放在本篇文章中,那整片文章的篇幅势必过于冗长,为了简单且高效的快速实现一个低代码平台,此处仅以一个Demo(基于React v18.2.0)对其核心功能进行说明。完整版在文末有详细介绍
上述看到的界面则是Adobe Dreamweaver CS6
所展现的布局,那现在再来看看Adobe Dreamweaver 2021
版本所展现的布局
dw-layout.png
差别其实并不大,都有着菜单栏
、属性栏
、管理栏
等等,在下面的Demo中,将继续沿用这种布局,只不过稍作修改
lowcode-layout.png
去除一切无用的操作,直接采用最简单的布局,即左、中、右方式的三栏布局
,左栏与右栏均为固定宽度,中间一栏自适应。不过左栏和右栏这俩名字听起来也不优雅,所以将左栏称之为组件区
,代表要拖拽的组件;中间栏称为画布区
,即发挥灵魂画手的地方;右栏则为属性区
,用来设置画布中某个组件的样式或属性
组件区定义为Left
,画布区定义为Center
,属性区定义为Right
;然后由App
组件对其统一管理。此时的项目结构为
- |-- Low-Code
- |-- package-lock.json
- |-- package.json
- |-- README.md
- |-- public
- | |-- favicon.ico
- | |-- index.html
- |-- src
- |-- App.jsx
- |-- index.js
- |-- components
- | |-- Center
- | | |-- index.jsx
- | |-- Left
- | | |-- index.jsx
- | |-- Right
- | |-- index.jsx
- 复制代码
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
为了方便起见,文章后面再展示项目目录时,只展示src
下的结构
简单提一下布局思路,App(#root)
为flex
布局,Left
与Right
的宽度固定为300px
,由于Center
是自适应宽度,所以不设置固定宽度,而是将其flex-grow
设为2
,这样便达到了圣杯布局
的效果
当然您也可以不采用flex布局,转而使用calc属性来计算宽度或者使用其它方式完成此界面的搭建
- |-- src
- |-- App.css // 新增
- |-- App.jsx
- |-- App.less // 新增
- |-- index.js
- |-- components
- | |-- Center
- | | |-- index.jsx
- | |-- Left
- | | |-- index.jsx
- | |-- Right
- | |-- index.jsx
- 复制代码
App
样式如下
- #root {
- width: 100%;
- height: 100%;
- display: flex;
- }
- 复制代码
Left
样式如下
- #root .left {
- width: 300px;
- height: 100%;
- padding: 15px;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- background-color: #94B49F;
- }
- 复制代码
Center
样式如下
- #root .center {
- height: 100%;
- flex-grow: 2;
- position: relative;
- background-color: #FCF8E8;
- box-shadow: inset 0 0 4px 2px #00000042;
- }
- 复制代码
Right
样式如下
- #root .right {
- width: 300px;
- height: 100%;
- padding: 15px;
- background-color: #DF7861;
- }
- 复制代码
App
组件代码如下
- import Left from './components/Left'
- import Right from './components/Right'
- import Center from './components/Center'
-
- import './App.css'
-
- const App = () => {
- return (
- <Left />
- <Center />
- <Right />
- )
- }
-
- export default App
-
- 复制代码
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
Left
、Center
、Right
组件中的代码均为以下示例模板
- const Xxx = () => {
- return <session className="xxx"></session>
- }
-
- export default Xxx
-
- 复制代码
至此,一个简易的静态Low-Code
平台页面就搭建完毕了。考虑到文章篇幅原因,在下面的文章中,除非很有必要,否则一律不展示CSS
样式代码
一个关乎Low-Code
能否实现的关键问题之一就是:组件区、画布区、属性区之间应该通过何种方式进行关联?此处并不是指组件间通信方式,因为这并不是个棘手的问题
在组件区拖拽完成后,画布区和属性区显示当前被拖拽组件,以及它所对应的属性
one-drag-two.gif
在属性区完成更改属性后,画布区需要根据最新的属性重新渲染当前组件,属性区则也要展示当前组件所对应的最新属性
one-set-two.gif
需求大概是上面这些,下面进行详细介绍
在已经实现拖拽的前提下,设想现有一个Button
组件,鼠标从组件区将Button
拖至画布区,然后画布区呈现当前拖拽的Button
组件,并且属性区会显示Button
组件的一系列属性。如果此时主动(拖拽)修改画布区中Button
组件的位置,则Center
要重新渲染最新的位置,要注意的是,画布区中其它组件的位置不能发生变动,位置发生变化的只能是当前组件,即Button
类似的问题又来了,当修改属性区中的某一属性时,只有当前组件所对应的属性会发生变化,其它组件即使有同名属性也不会发生变化
现在可以正视这个问题了,不管是组件的位置变化还是属性更改,其影响的区域甚多,而又不可能让每个区域都单独遵从某个逻辑,所以综上所述,此时应使用一个规则,来管理所有的变化,所有的区域都遵循当前规则
那这个规则又应该是什么呢?比如
- {
- text: "按钮",
- el: <Button/>,
- style: {
- width: '',
- height: '',
- },
- }
- 复制代码
text
代表当前组件的名称,el
代表当前要渲染的组件,style
代表当前组件的css样式
所有区域都共用以上规则,假设在属性区中修改Button
组件的宽度,此时只需要改变style
中的width
即可,然后其它区域拿到的都是修改后的width
,这样一来,问题不就解决了吗。但不能直接叫人家规则吧,
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。