低代码01之构建项目框架

news2024/11/27 0:25:05

目录

  • 低代码之构建框架1
    • 1:项目初始化
    • 2:src / data.json 数据 ( 容器大小与渲染的表单数据 )
    • 3:App.vue ( 导入editor组件传递data.json之中的数据与 向下提供组件配置数据config )
    • 4:src / packages / editor.jsx 框架区域样式与组件引入
    • 5:editor.scss
    • 6:src / packages / editor-block.jsx 子组件
    • 7:src / utils / editor.config.jsx 编辑区域的配置文件
    • 8:main.js
    • 效果

低代码之构建框架1

1:项目初始化

  • vue create vue-lesson 初始化项目文件
  • npm i 初始化 package.json
  • package.json 配置运行脚本
    {
      "name": "vue-lesson",
      "version": "0.1.0",
      "private": true,
      "scripts": {
        "serve": "vue-cli-service serve",
        "build": "vue-cli-service build"
      },
      "dependencies": {
        "core-js": "^3.8.3",
        "element-plus": "^2.3.6",
        "vue": "^3.2.13"
      },
      "devDependencies": {
        "@vue/cli-plugin-babel": "~5.0.0",
        "@vue/cli-service": "~5.0.0",
        "sass": "^1.32.7",
        "sass-loader": "^12.0.0"
      }
    }
    
  • 安装依赖
    npm i element-plus
    

2:src / data.json 数据 ( 容器大小与渲染的表单数据 )

{
  "container":{
    "width":550,
    "height":550
  },
  "blocks":[
    {"top":100,"left":100,"zIndex":1,"key":"text"},
    {"top":200,"left":200,"zIndex":1,"key":"button"},
    {"top":300,"left":300,"zIndex":1,"key":"input"}
  ]
}

3:App.vue ( 导入editor组件传递data.json之中的数据与 向下提供组件配置数据config )

<template>
  <div class="app">
    <Editor v-model="state"></Editor>
  </div>
</template>

<script>
import { provide, ref } from "vue";
import data from "./data.json";
import Editor from "./packages/editor"
import { registerConfig as config } from "./utils/editor.config";
export default {
  components:{
    Editor
  },
  setup() {
    const state = ref(data);
    provide('config',config) // 把组件配置传入
    return {
      state,
    };
  },
};
</script>
<style lang="scss">
html,body,#app{
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
}
.app {
  background: #fff;
  width: 100%;
  height: 100%;
}
</style>

4:src / packages / editor.jsx 框架区域样式与组件引入

import { computed, defineComponent ,inject} from "vue";
import "./editor.scss"
import EditorBlock from "./editor-block";
export default defineComponent({
  props:{
    modelValue:{
      type:Object
    },

  },
  setup(props){
    // console.log('props',props.modelValue);
    const data = computed({
      get () {
        return props.modelValue
      }
    })
    const contentStyle = computed(()=>({
      width: data.value.container.width + 'px',
      height: data.value.container.height + 'px'
    }))
    const config = inject('config')
    return () => <div class='editor'>
        <div class='editor-left'>
          {/** 根据config的注册列表 渲染出左侧的物料区域 */}
            { 
              config.componetsList.map(component=>(
                <div class="editor-left-item">
                  <span class="editor-left-item-label">{ component.label }</span>
                  <div>{ component.preview() }</div>
                </div>
              ))
            }
        </div>
        <div className="editor-center">
          <div class="editor-top">top</div>
          <div class="editor-content">
            {/* 负责尝试滚动条 */}
            <div class="editor-content-canvas">
              {/* 产生内容区域 */}
              <div class="editor-content-canvas_content" style={contentStyle.value}>
                {
                  (data.value.blocks.map(block=>
                    (<EditorBlock block={block}>
                    </EditorBlock>)
                  ))
                }
              </div>
            </div>
          </div>
        </div>

        <div class="editor-right">right</div>
    </div>
  }
})

5:editor.scss

.editor {
  width: 100%;
  height: 100%;
  overflow: hidden;
  display: flex;
  .editor-left ,.editor-right{
    width: 270px;
    background: yellow;
    height: 100%;
  }
  .editor-left {
    .editor-left-item {
      position: relative;
      width: 250px;
      margin: 20px auto;
      display: flex;
      justify-content: center;
      align-items: center;
      background: #ccc;
      padding: 20px;
      box-sizing: border-box;
      cursor: move;
      user-select: none; // 无法操作
      min-height: 100px;
      .editor-left-item-label {
        position: absolute;
        left: 0;
        top: 0;
        background: rgb(96, 205, 224);
        color: #fff;
        padding: 4px;
      }
      // 设置 item 项目不可点击等
      &::after {
        content: '';
        position: absolute;
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        background: #ccc;
        opacity: 0.2;
      }
    }
  }
  .editor-center {
    width: calc(100% - 270px - 270px - 20px);
    padding: 0 10px;
    background: orange;
    height: 100%;
  }
  .editor-top {
    height: 80px;
    background: pink;
  }
  .editor-content {
    height: calc(100% - 80px);
    background: orange;
    .editor-content-canvas {
      overflow: scroll;
      height: 100%;
    }
    .editor-content-canvas_content {
      position: relative;
      margin: 20px auto;
      // height: calc(100% - 40px);
      // width: 550px;
      // height: 550px;
      background: #ccc;
    }
  }
}
.editor-block {
  position: absolute;
}

6:src / packages / editor-block.jsx 子组件

import { computed, defineComponent,inject } from "vue";

export default defineComponent({
  props:{
    block:{type:Object}
  },
  setup(props){
    const blockStyle = computed(()=>({
      top:`${props.block.top}px`,
      left: `${props.block.left}px`,
      zIndex:`${props.block.zIndex}`

    }))
    const config = inject('config') // 获取从app.vue 提供的组件配置
    return ()=> {
      // 通过block之中的key 获取config之中对应的组件
      const component = config.componetsMap[props.block.key];
      console.log('component',component);
      // 获取组件的渲染函数
      const componentRender = component.render();
      return <div class="editor-block" style={blockStyle.value}>
        {componentRender}
      </div>
    }

  }
})

7:src / utils / editor.config.jsx 编辑区域的配置文件

// 列表区可以显示所有的物料
// key对应的组件隐射关系

import { ElButton,ElInput } from "element-plus"
function createEditorConfig(){
  const componetsList = []
  const componetsMap = {}

  return {
    componetsList,
    componetsMap,
    register:(component)=>{
      componetsList.push(component)
      componetsMap[component.key] = component
    }
  }
}

export let registerConfig = createEditorConfig()
console.log('registerConfig',registerConfig);
// 文本
registerConfig.register({
  label:'文本',
  preview:()=> '预览文本',
  render:()=> '渲染文本',
  key:'text'
})
registerConfig.register({
  label:'按钮',
  preview:()=> <ElButton>预览按钮</ElButton>,
  render:()=> <ElButton>渲染按钮</ElButton>,
  key:'button'
})
registerConfig.register({
  label:'输入框',
  preview:()=> <ElInput placeholder='预览输入框'></ElInput>,
  render:()=> <ElInput placeholder='渲染输入框'></ElInput>,
  key:'input'
})

// echarts等

8:main.js

import { createApp } from 'vue'
import App from './App.vue'
import 'element-plus/dist/index.css'

createApp(App).mount('#app')

效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/643403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

我记不住的那些C语言的二维数组的函数传参

背景&#xff1a; 最近在复习数据结构和算法&#xff0c;顺带刷刷题&#xff0c;虽然很长时间不刷题了但还是原来熟悉的味道&#xff0c;每一次重学都是加深了上一次的理解。本次我们看一下如何将C语言的二维数组进行函数传参&#xff0c;C语言实现。 其实这个比较简单&#x…

springboot项目使用proguard配置代码混淆

springboot项目使用proguard配置代码混淆 代码混淆是一些软件开发过程中必不可少的步骤。 常用的代码混淆技术有 proguard maven plugin , yguard maven plugin, procyon maven plugin, dex maven plugin . 这些代码混淆技术大同小异&#xff0c;都是对maven打包生成class时进…

补充知识点

这里写目录标题 进制转换Java内置的进制转换介绍具体代码 有符号数据表示法整数强制转换之数据溢出浮点数进制转换浮点数储存 进制转换 Java内置的进制转换 介绍 也就是常用API里Integer的静态方法 具体代码 注意 最后一个方法&#xff0c;返回的是基于第二个参数为基数的第…

大模型部署实战(三)——ChatGLM-6B

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

SSR渲染-初识Nuxt-01

SSR服务端渲染 SSR服务端渲染&#xff1a;在后端将html页面处理好&#xff0c;前端直接展示&#xff08;可以解决为后端给你传了一个html脚本&#xff0c;全段渲染&#xff09; 为什么要有SSR服务端渲染&#xff1f; 可以解决单页面首屏加载慢的问题&#xff0c;同时有利于用…

在线分享怎么多接口批量查询快递信息

做物流和电商行业的小伙伴应该都知道&#xff0c;大量快递集中发出后&#xff0c;我们要做的就是及时查询和跟踪快递单号&#xff0c;这样能够有效避免快递发错或快递丢失等情况出现&#xff0c;小编今天给大家安利一款全自动批量查询跟踪快递单号的辅助工具&#xff0c;它支持…

【C++/嵌入式笔试面试八股】二、21.分层模型 | HTTP

分层模型 01.画出OSI和TCP/IP协议栈的对应关系 对应关系记忆2113 02.什么是OSI七层模型?每层列举2个协议。❤️ OSI七层模型及其包含的协议如下 物理层: 传输单位为bit 功能:通过物理媒介透明的传输比特流,确定机械及电气规范 主要包括的协议为:IEE802.3 CLOCK RJ45 数据链…

[学习笔记] [机器学习] 10. 支持向量机 SVM(SVM 算法原理、SVM API介绍、SVM 损失函数、SVM 回归、手写数字识别)

视频链接数据集下载地址&#xff1a;无需下载 学习目标&#xff1a; 了解什么是 SVM 算法掌握 SVM 算法的原理知道 SVM 算法的损失函数知道 SVM 算法的核函数了解 SVM 算法在回归问题中的使用应用 SVM 算法实现手写数字识别器 1. SVM 算法简介 学习目标&#xff1a; 了解 …

路径规划算法:基于阿基米德优化优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于阿基米德优化优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于阿基米德优化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用…

Spring Bean-生命周期

三连支持 一起鼓励 一起进步 Bean生命周期 文章目录 一、生命周期1.Bean中配置生命周期2.实现InitializingBean和DisposableBean接口3.PostConstruct & PreDestroy4.BeanPostProcessor接口 二、执行过程三、源码中使用的BeanPostProcessor1.以ApplicationContextAwareProce…

【Flutter】Flutter 如何实现主题 Theme 切换

文章目录 一、引言二、Flutter 中的主题&#xff08;Theme&#xff09;和主题数据&#xff08;ThemeData&#xff09;三、如何在 Flutter 中创建自定义主题四、在 Flutter 中实现主题切换五、完整的代码示例六、总结 一、引言 大家好&#xff0c;欢迎阅读这篇文章。今天我们要…

Android——发送和接收广播

实验名称&#xff1a; 发送和接收广播 实验目的&#xff1a; &#xff08;1&#xff09;能创建广播接收者&#xff0c;实现广播的注册 &#xff08;2&#xff09;能自定义广播&#xff0c;发送和接收广播 实验内容及原理&a…

uni-app 使用axios发请求 运行到微信开发者工具报错 Adapter “http‘ is not available in the build

场景 最近在使用uni-app开发H5移动端&#xff0c;跟往常一样使用axios发请求&#xff0c;做一些全局的请求拦截响应拦截操作 uni-app数据存储&#xff0c;uni-ui组件开发&#xff0c;配置axios&#xff0c;vuex。配置了vue.config.js文件做跨域操作 运行到谷歌浏览器一切正常…

[n00bzCTF 2023] CPR 最后还是差一个

Crypto AES 给了java的加密原码&#xff0c;AES加密&#xff0c;有key import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; import java.n…

【论文导读】- Variational Graph Recurrent Neural Networks(VGRNN)

文章目录 文章信息摘要BackgroundGraph convolutional recurrent networks (GCRN)Semi-implicit variational inference (SIVI) Variational graph recurrent neural network (VGRNN)VGRNN modelSemi-implicit VGRNN (SI-VGRNN) 文章信息 Variational Graph Recurrent Neural …

1.OpenCV 运行环境配置(Python)

一、安装Python 1.在Python官网下载Python。Download Python | Python.org 下载有点慢&#xff0c;需耐心等一等。&#xff08;用迅雷下载挺快&#xff09; 2.下载完后&#xff0c;一步一步的安装即可。我本地安装在 D:\Python\&#xff0c;路径可以自定义。安装时勾选了添加…

​selenium+python做web端自动化测试框架与实例详解教程

最近受到万点暴击&#xff0c;由于公司业务出现问题&#xff0c;工作任务没那么繁重&#xff0c;有时间摸索seleniumpython自动化测试&#xff0c;结合网上查到的资料自己编写出适合web自动化测试的框架&#xff0c;由于本人也是刚刚开始学习python&#xff0c;这套自动化框架目…

Linux操作系统的启动流程

一、&#xff08;通常&#xff09;操作系统的启动流程步骤 【关于BIOS的介绍&#xff0c;如果是操作系统小白可以参考一下百度百科的解释&#xff1a;】 通常操作系统启动的流程一般包括以下步骤&#xff1a; BIOS自检&#xff1a;计算机开机后&#xff0c;会进入Power On Se…

CMOS组合逻辑(二)

在前面介绍了静态互补CMOS逻辑&#xff0c;这里主要说明有比逻辑和动态CMOS逻辑。 CMOS组合逻辑_vtc曲线_沧海一升的博客-CSDN博客介绍了静态互补CMOS逻辑https://blog.csdn.net/qq_21842097/article/details/107456036 一、有比逻辑 1、伪NMOS 因为互补CMOS优点是全轨输出&…

WinForm——软件加载读条界面卡死问题

WinForm——软件加载读条界面卡死问题 前言一、问题现象二、测试部分代码1.Loading窗体2.加载代码Program处 三、分析原因四、解决方案代码1.Loading窗体2.加载代码Program处 前言 在制作软件开启界面&#xff0c;读条加载时&#xff0c;在Program中new了个Loading窗体&#x…