之前跟着组里的前辈做了公司框架的pc端的代码生成器。这次大哥把移动端的代码生成器(基于vue2和vant2的)交给我了。原本生成的代码是组件化的,要求新的代码生成器将页面结构也能展示出来,方便用户自定义。
有了前辈的铺路,我依葫芦画瓢就行了。其实代码生成的逻辑蛮简单,先将表单的id发送给后台,然后拿到json。
先对这串json进行简单处理要注意的是我们生成的代码,是字符串。要用`` 这个符号括起来。//布局字段 let GenerateElement = EachLayout(data.list)这个eachlayout是一个函数
在遇到布局字段时,会生成布局的字符串
如果遇到普通组件的字段,则生成这个组件的字符串。
这些属性都是要带上的,而有些属性可能是object类型的,在字符串化时会变成【obj】,所以可以在要生成的页面预先声明data,值从vue的data里去取,例如上图的v-model="form."。而字段的不可编辑等等属性则不需要担心,因为这都是从父组件继承的。依旧有效。我们现在需要整的是给页面复制。你可能会说,这个v-model不是已经赋值了吗?错了。
这个v-model拿的值是jsondata的默认值。而有的页面是赋值过的(你自己在表单上填完之后保存)。简单的说就是回显。可以两个函数,setFormdata(向后台发送请求给表单赋值),getFormData(取得表单的值发送给后台)。
有的组件因为其特殊性所以要对其特殊对待,例如图片上传,动态数据。所以要先判断type然后再对数据进行处理。
在写这个图片上传时,发现一个问题。原本是用的 Promise.all()来发送请求,后来发现,如果有一个图片不能正常传输,那么所有图片都不能正常显示。这是promise.all的特性(快速返回失败行为)。
两种方法解决
一.使用map每一个过滤每一个promise任务,其中任意一个报错后,return一个返回值,确保promise能正常执行走到.then中。
二.使用 Promise.allSettled。
最后一点要注意,你生成出来的代码字符串不可以直接传给后端,会被浏览器拦截。可以先进行base64操作后再传给后端