vue3 实现割腌版的低代码

632 阅读2分钟

最近搞了一个后台搭建页面,前端进行渲染回显,类似于割腌版的低代码

image.png

实现功能的时候也遇到了点问题:

1:component如何通过接口返回数据进行查找组件位置

2:json数据格式的定义

3:内容填充的时候该怎么进行赋值从而防止渲染污染

4:样式编辑的时候该怎么进行隔离,防止污染

5:VueDraggable拖拽组件第一次进入页面时无法响应事件及改变数组内容

接下来就是解决办法:

1:component如何通过接口返回数据进行查找组件位置

第一种方法:defineAsyncComponent

官网地址:defineAsyncComponent

activeModules.value.template = activeModules.value.template.map(module => ({
  ...module,
  pcpath: defineAsyncComponent(() => import(/* @vite-ignore */ module.pcpath)),
}));

将 './xx.vue'等路径转换为component能够找到的路径

第二种办法:import导入(这里就说下全局的,局部的在这种需求下过于鸡肋)

1:在components文件下新建 index.ts 用作统一导出

import xx './xx.ue';

export {
  xx
}

2:在min.js中全局注册

import * as components from '/@/views/xx/components/index'

const app = createApp(App);
  // 移动端模版拖拽导出组件
  Object.entries(components).forEach(([name, component]) => {
    app.component(name, component)
  })
  app.mount('#app');

2: json数据格式的定义

初步采用的是一维数组,这里就简单的说下

最外面一个对象,表示是这条数据的所有东西,一个字段json格式表示这个页面所用的组件 组件格式:最外面一个对象,表示是这条数据的所有东西,一个字段json格式表示这个组件所有可配置的选项

3:内容填充的时候该怎么进行赋值从而防止渲染污染

刚开始的时候使用的是方法1进行组件的渲染,但是在这一步的时候会导致响应式问题,对内容进行修改后,左侧渲染区域也会进行修改,后采用了方法二并搭配中转变量进行JSON拷贝

方法1进行JSON拷贝时会导致:setup丢失,也就是会失去响应式导致component无法渲染出来

image.png

5:VueDraggable拖拽组件第一次进入页面时无法响应事件及改变数组内容

第一次进入页面时:拖拽正常但是不响应组件的事件,并且拖拽后左侧渲染区域也不会进行变化,但是完成编辑或者取消编辑后就能正常响应和渲染

排查:

1:组件加载问题,第一次进入时组件没有加载完成导致没有响应

2:内容区问题,因为是动态读取值

解决:

1:新建一个dom测试,发现并没有这个问题

2:排查发现初始变量为:const activeModules = ref<activeinte>({});

使用数据为: <VueDraggable v-model="activeModules.template" @start="start" @end="onEnd" style="width: 100%;">

修改为:

const activeModules = ref<activeinte>({
  template: []
});

问题解决