此项目适用于大多数自定义拖拽项目
项目要求:公司与多家医院对接,对于护理白板中的消息内容的样式有不同的需求,如果为此去进行定制化开发,将产生大量的人力与时间浪费,并且同一项目因此分出多个分支或项目进行管理,将会造成代码管理混乱,因此通过对页面进行自定义开发,从而避免以上问题。数据库中存储页面的DOM结构与展示数据,需要使用时进行实时渲染。
最先想到的是肯定就是后端渲染,每次请求之后刷新页面,方案一与方案二就是后端渲染,前端只负责获取页面,然后innerHTML。
方案一:模板引擎(Handlebars)
原因:由vue的模板引擎想到的的mustache,Handlebars作为mustache
的扩展,功能更加丰富
优点:代码量小,对后端基本无要求,只需要提供存取接口,不需要对页面进行任何处理
缺点:作为初级的模板语法,与Vue中使用的模板语法不同的是,未添加Diff
功能,因此只能通过innerHtml
进行整体DOM替换,因此会造成页面首页白屏,并且整体替换会造成
废除理由:项目实施不愿意学习模板语法
方案二:富文本
老大提出的方案,希望实现所见即所得,类似于Notion这样在页面上直接编辑
原因:需要实现所见即所得
缺点:需要对富文本进行插件开发
方案三(最终方案):九宫格实现页面定位,拖拽实现模块的复用,重写Vue的render函数实现了模块的自定义渲染(算是符合了实施那边的需求,但算不上多么新颖的功能,只是各种技术的堆砌)
这项目有点像上一家公司的自定义驾驶舱,在项目内置一些配置好的图标,然后拖拽到驾驶舱页面,当时使用的是vue-drag-resize做的页面布局,但是到最后布局太过自由,上线时使用人员总是会将各个模块重叠起来,或者布局太过怪异,因此使用了vue-grid-layout进行页面中各模块的布局,先将页面布局定下来,不需要再去各种考虑布局了。
vuedraggable进行预制模块的拖拽,基本上符合了当前的需求
元数据
1 | { |
主要使用vue的$createElement函数和render函数,将元数据渲染成html模板,此方案相较于方案一,因为使用了Vue,有效避免了数据变化时的整屏数据变化
1 | Vue.component('board', { |
难点:
先期,元数据中没有VNode这个参数,使用的函数
1 | // 标签渲染 |
但是在数据结构保存到数据库时,函数会丢失,而且样式泰国复杂,只能修改成现在改写Vue的render
函数,使用$createElement
函数创建出虚拟DOM
标题栏需要显示当前数据的多少,因此使用了字符串模板和computed
1 | Vue.component('board', { |
方案四:
最近在用processon,想到了写新方案
因为之前一直使用的是即时数据渲染,因此当没有数据时,页面会显得光秃秃的,因此现在添加新功能:模块底图
底层使用canvas
绘制出已经修改并保存过的样式
最后更新: 2022年11月03日 21:58