低代码01之构建项目框架

news/2025/1/13 7:57: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.ppmy.cn/news/370448.html

相关文章

深入理解深度学习——注意力机制(Attention Mechanism):带掩码的多头注意力(Masked Multi-head Attention)

分类目录&#xff1a;《深入理解深度学习》总目录 相关文章&#xff1a; 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;基础知识 注意力机制&#xff08;AttentionMechanism&#xff09;&#xff1a;注意力汇聚与Nadaraya-Watson核回归 注意力机制&#…

谷歌网盘扩容 - Google Drive Upgrade

介绍 平时需要用谷歌网盘&#xff08;Google Drive&#xff09;来管理、发布一些大文件&#xff0c;但是免费的15GB很快就用完了。想开通会员&#xff0c;就是那些100GB或者更多的升级包&#xff0c;发现需要信用卡或者paypal&#xff0c;然而我并没有信用卡也无法使用paypal。…

无手机注册谷歌账户

使用edge浏览器&#xff0c;非谷歌的估计也可以

分享可用的谷歌学术(google scholar) hosts

看到知乎上的一个回答&#xff0c;用了近两个月&#xff0c;算是比较稳定。终于不用到处找镜像站了 172.245.241.129 scholar.google.com 172.245.241.129 scholar.google.com.hk 172.245.241.129 scholar.google.com.tw 172.245.241.129 scholar.google.com.sg 172.245.2…

谷歌支付沙盒测试

谷歌支付沙盒测试 以内购为例&#xff0c;进行谷歌支付沙盒测试前&#xff0c;需要完成以下步骤&#xff1a; app接入google支付&#xff0c;打包上传到谷歌&#xff0c;至少是alpha版本&#xff0c;并设置好内购商品 添加测试用户&#xff08;该用户后续作为支付沙盒测试的用…

申请谷歌地图API介绍

如果是个人申请&#xff0c;需要准备手机卡(支持中国大陆地区手机卡)、信用卡等信息 如果是企业申请&#xff0c;需要除个人申请的资料外&#xff0c;还需要准备企业邮箱以及企业资质等相关信息 1、访问&#xff1a;https://mapsplatform.google.com/ 2、选择&#xff1a;右上…

解决Google Earth谷歌地球无法连接服务器问题

从2020年11月20号左右&#xff0c;谷歌地球中国服务器全部关停&#xff0c;所有原来可以使用的hosts,全部不能使用了&#xff0c;导致原来可以在电脑上打开谷歌地球的&#xff0c;现在全部提示无网络&#xff0c;如下图: 这个是谷歌地球的最新版&#xff0c;一样打不开&#xf…

A. 实验7-2-6 打印杨辉三角

A. 实验7-2-6 打印杨辉三角 题目描述 本题要求按照规定格式打印前N行杨辉三角。 输入 输入在一行中给出N&#xff08;1≤N≤10&#xff09;。 输出 以正三角形的格式输出前N行杨辉三角。每个数字占固定4位 #include<stdio.h> int main(){int i,j,k,n;scanf("%d&…