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

开发,笔记,代码,编辑器,基本原理 · 浏览次数 : 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: {

低开开发笔记(五):修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 是开

低代码选型,论协同开发的重要性

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 Git是一款用于分布式版本控制的免费开源软件: 它可以跟踪到所有文件集中任意的变更,通常用于在软件开发期间,协调配合程序员之间的代码程序开发工作。 Git 最初诞生的原

低代码助力微信小程序对接,提升开发效率

本文由葡萄城技术团队原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 微信小程序相信大家都用过,相较于APP,微信小程序的优势在于其便捷性,只需要下载一个微信就可以访问所有的小程序,因此许多开发者也逐渐将自己开发的系统部署到微信小程序上以供

Ui2Code+ChatGPT助力低代码搭建

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

低代码平台如何借助Nginx实现网关服务

摘要:本文由葡萄城技术团队于博客园原创并首发。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 前言 在典型的系统部署架构中,应用服务器是一种软件或硬件系统,它承载着应用程序的核心逻辑。它接收客户端的请求并处理相应的业务逻辑、数据操作等任务。应用服务器通常被

低代码如何构建响应式布局前端页面

本文由葡萄城技术团队于博客园原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。 “你开发的界面为啥在我的屏幕里这么小啊?” “这个界面为啥在我这里会出现横向滚动条啊?” 大家在进行前端界面开发时,有没有遇到这些类似的问题呢?又是如何解决的呢? 页面