低开开发笔记(二):低代码编辑器基本原理

开发,笔记,代码,编辑器,基本原理 · 浏览次数 : 88

小编点评

**代码解析** ```js export default { data() { return { a: true } }, props: ['dsl', 'model'], render(h) { let dsl = this.dsl; return this.generator(h, dsl); }, methods: { adddraggable() { }, select(e) { console.log(e); }, generator(h, dsl) { //h(tagName,props,children) //当前元素,元素属性,子元素 return h(dsl.component, this.generateProps(h, dsl), this.generateChildren(h, dsl)); }, generateProps(h, dsl) { let self = this; let result = { props: { ...dsl.props }, attrs: { ...dsl.attrs }, style: { ...dsl.style } }; if (self.model.selected) { if (self.model.selected.wid == dsl.wid) { // 获取所有的按钮元素 const allElements = document.getElementById('editor.div') console.log(allElements) } } if (dsl.events) { result.on = { click: function (e) { // console.log(e, dsl.wid, this); e.preventDefault(); this.$emit('select', { e, dsl }); } }; } return result; }, generateChildren(h, dsl) { let result = dsl.children && dsl.children.map((child) => { return this.generator(h, child); }) || []; if (dsl.text) result.push(dsl.text); // console.log(result) return result; } }, mounted() { } }; ``` **代码解释** 1. **`data`**属性存储 DSL 数据。 2. **`props`**属性接收 DSL 配置信息,包括组件、属性和事件。 3. **`render`**函数使用 `h` 函数将 DSL 数据渲染为 HTML 元素。 4. **`generator`**方法递归处理 DSL 中所有子元素,并根据条件创建子元素。 5. **`generateProps`**方法生成元素的属性。 6. **`generateChildren`**方法生成元素的子元素,并处理文本内容。 7. **`mounted`**生命周期钩子中处理 DOM 事件。 **最终效果** 该代码将创建一个包含 DSL 数据的 Vue 元素,并根据 DSL 配置渲染其子元素。

正文

好家伙,

完整代码已开源

https://github.com/Fattiger4399/ph-questionnaire.git

 

本片我们来讲述

如何将dsl的数据渲染为视图

 

1.数据格式

dsl: {
                component: 'div',
                wid: 0,
                props: {
                },
                style: { background: '    #FFF8DC' },
                children: [

                    {
                        wid: 1,//序号
                        component: 'ph-radio', //组件名
                        props: {    //组件数据接口
                            No: 1,
                            title: "我是输入框",
                            options_1: "选项一一",
                            options_2: "选项二二"
                        },
                        style: { top: '300px', left: '300px', zIndex: '1', border: "2px dashed red" },//组件配置项
                        attrs: {

                        },
                        events: {
                        }
                    },
]

 

 

2.vue的h函数

h 函数是 Vue.js 中的一个辅助函数,通常用于创建虚拟 DOM 元素(VNode)。

在 Vue.js 中,h 函数实际上是 createElement 函数的别名

createElement 函数是 Vue.js 内部用来创建虚拟 DOM 元素(VNode)的核心函数。

 

 h 函数接收三个参数

  • 第一个参数:表示要创建的元素的标签名、组件或者函数。
  • 第二个参数:是一个包含元素属性、样式、事件等信息的对象。
  • 第三个参数:是元素的子元素,可以是一个数组或者单个元素。

 

 

3.编辑器代码解释

代码如下:

<script>
export default {
    data() {
        return {
            a: true
        }
    },
    props: ['dsl', 'model'],
    render(h) {
        let dsl = this.dsl;
        return this.generator(h, dsl);
    },
    methods: {
        adddraggable() {

        },
        select(e) {
            console.log(e);
        },
        generator(h, dsl) {
            //h(tagName,props,children)
            //当前元素,元素属性,子元素
            return h(dsl.component, this.generateProps(h, dsl), this.generateChildren(h, dsl));
        },
        generateProps(h, dsl) {
            let self = this;
            let result = {
            }
            result.props = {
                ...dsl.props
            }
            result.attrs = {
                ...dsl.attrs
            }
            result.style = { ...dsl.style }

            if (self.model.selected) {
                if (self.model.selected.wid == dsl.wid) {
                    // 获取所有的按钮元素
                    const allElements = document.getElementById('editor.div')
                    console.log(allElements)

                }
            }
            if (dsl.events) {
                result.on = {
                    click: function (e) {
                        // console.log(e, dsl.wid, this);
                        e.preventDefault();
                        self.$emit('select', { e, dsl });
                    },
                };

            }
            return result;
        },/**
 * 该函数用于生成child节点
 * @param {*} h 
 * @param {*} dsl 
 */
        generateChildren(h, dsl) {

            let result = dsl.children &&
                dsl.children.map((child) => this.generator(h, child))
                || [];

            // (A&&B)||C

            if (dsl.text) result.push(dsl.text)
            // console.log(result)
            return result;
        }
    },
    mounted() {
    }
}
</script>

解释

 

本质上是对props属性递归处理后,使用vue的h函数将dsl全部渲染出来

让我们把重点放在这句上

return h(dsl.component, this.generateProps(h, dsl), this.generateChildren(h, dsl));
  1. generator 方法用于生成 Vue 元素,根据传入的 dsl 配置信息,设置元素的属性、样式、事件等,并返回生成的元素。

  2. generateProps 方法用于生成元素的属性,包括 propsattrs 和 style,同时根据条件判断是否添加事件监听器。

  3. generateChildren 方法用于生成元素的子元素,遍历 dsl 中的 children,对每个子元素调用 generator 方法生成对应的 Vue 元素,并返回所有子元素的数组。

 

最终效果如下:

 

 

 

 

 

 

与低开开发笔记(二):低代码编辑器基本原理相似的内容:

低开开发笔记(二):低代码编辑器基本原理

好家伙, 完整代码已开源 https://github.com/Fattiger4399/ph-questionnaire.git 本片我们来讲述 如何将dsl的数据渲染为视图 1.数据格式 dsl: { component: 'div', wid: 0, props: { }, style: {

低开开发笔记(八): 低代码编辑器实现撤销回退(命令模式,防抖处理)

好家伙, 0.代码已开源 https://github.com/Fattiger4399/ph_questionnaire-.git 1.事件触发 我们先从事件的触发开始讲起 大致上我们有两个思路可以选择 1.监控用户行为 2.监控数据变化 两种选择都会有较难处理的部分,这里我们先选第二个选项 关于

低开开发笔记(五):修bug-深拷贝与浅拷贝

好家伙 今天遇到一个bug 0.问题描述 描述如下: 代码如下: copynodefunc() { this.copynode = this.model.selected }, affixnode() { const id = this.model.selected.wid - 1; const g

低开开发笔记(六): 工作台与模板样式开发

好家伙,仅仅只是实现了样式,完整功能暂未完成 完整代码已开源 https://github.com/Fattiger4399/ph-questionnaire.git 1.灵感来源 (抄袭对象) 刚开始想着随便写个低开项目练练手的,然后就写成这样了 1.1.简道云 1.2.问卷星 2.上代码

Gitee千Star优质项目解析: ng-form-element低开引擎解析

好家伙, 在写项目的时候,我发现自己的平台的组件写的实在是太难看了,于是想去gitee上偷点东西,于是我们本期的受害者出现了 gitee项目地址 https://gitee.com/jjxliu306/ng-form-elementplus-sample.git 组件库以及引擎完全开源,非常牛逼的项

Karmada v1.5发布:多调度组助力成本优化

摘要:在最新发布的1.5版本中,Karmada 提供了多调度组的能力,利用该能力,用户可以实现将业务优先调度到成本更低的集群,或者在主集群故障时,优先迁移业务到指定的备份集群。 本文分享自华为云社区《Karmada v1.5发布!多调度组助力成本优化》,作者:华为云云原生团队。 Karmada 是开

Ui2Code+ChatGPT助力低代码搭建

低代码开发平台(LCDP),是低代码或无代码通过快速搭建配置的方式完成一个应用程序的开发与上线,可视化低代码就是可视化的DSL,它的优点更多的是来源可视化,相对的,它的局限性也还是来源于可视化,复杂的业务逻辑用低代码可能会更加复杂。低代码应该是特定领域问题的简化和抽象,如果只是单纯将原有的编码工作转换为 GUI 的模式,并没有多大意义。

LuBase 低代码开发框架介绍 - 可私有化部署

框架定位 面向开发人员,针对管理软件领域,对页面交互和通用功能进行高阶封装,逐步打造成平台型、生态型开发工具。 涓涓细流 ,汇聚成海,基于 PBC(组件式开发)开发理念,让功能模块的复用更简单。 让管理软件开发回归到对需求的深入思考和求解。 框架简介 LuBase 是以数据模型驱动,可视化表单和页面

ChatGPT赋能低代码开发:打造智能应用的双重引擎

摘要:本文摘自葡萄城低代码产品活字格的资深用户(格友超哥)所撰写的文章:《惊叹表现!活字格+ChatGPT:低代码开发智能应用的巨大潜力》。 ChatGPT的functions函数使用方 自从OPENAI发布了最新的GPT引擎gpt-3.5-turbo-0613之后,我就对它的functions参数

为什么现代的低代码开发平台都不支持导出源代码?

> 摘要:本文由葡萄城技术团队于博客园原创并首发。葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 初次接触低代码的程序员大多会纠结一个问题,为什么功能越强大的低代码开发平台越不会提供导出源代码的功能? 要想回答这个问题,我们得回顾一下低代码开发的发展史。事实上,支持导出[源代码](h