经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 编程经验 » 查看文章
低开开发笔记(二):低代码编辑器基本原理
来源:cnblogs  作者:养肥胖虎  时间:2024/4/17 15:32:01  对本文有异议

好家伙,

完整代码已开源

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

 

本片我们来讲述

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

 

1.数据格式

  1. dsl: {
  2. component: 'div',
  3. wid: 0,
  4. props: {
  5. },
  6. style: { background: ' #FFF8DC' },
  7. children: [
  8. {
  9. wid: 1,//序号
  10. component: 'ph-radio', //组件名
  11. props: { //组件数据接口
  12. No: 1,
  13. title: "我是输入框",
  14. options_1: "选项一一",
  15. options_2: "选项二二"
  16. },
  17. style: { top: '300px', left: '300px', zIndex: '1', border: "2px dashed red" },//组件配置项
  18. attrs: {
  19. },
  20. events: {
  21. }
  22. },
  23. ]

 

 

2.vue的h函数

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

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

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

 

 h 函数接收三个参数

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

 

 

3.编辑器代码解释

代码如下:

  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. a: true
  6. }
  7. },
  8. props: ['dsl', 'model'],
  9. render(h) {
  10. let dsl = this.dsl;
  11. return this.generator(h, dsl);
  12. },
  13. methods: {
  14. adddraggable() {
  15. },
  16. select(e) {
  17. console.log(e);
  18. },
  19. generator(h, dsl) {
  20. //h(tagName,props,children)
  21. //当前元素,元素属性,子元素
  22. return h(dsl.component, this.generateProps(h, dsl), this.generateChildren(h, dsl));
  23. },
  24. generateProps(h, dsl) {
  25. let self = this;
  26. let result = {
  27. }
  28. result.props = {
  29. ...dsl.props
  30. }
  31. result.attrs = {
  32. ...dsl.attrs
  33. }
  34. result.style = { ...dsl.style }
  35. if (self.model.selected) {
  36. if (self.model.selected.wid == dsl.wid) {
  37. // 获取所有的按钮元素
  38. const allElements = document.getElementById('editor.div')
  39. console.log(allElements)
  40. }
  41. }
  42. if (dsl.events) {
  43. result.on = {
  44. click: function (e) {
  45. // console.log(e, dsl.wid, this);
  46. e.preventDefault();
  47. self.$emit('select', { e, dsl });
  48. },
  49. };
  50. }
  51. return result;
  52. },/**
  53. * 该函数用于生成child节点
  54. * @param {*} h
  55. * @param {*} dsl
  56. */
  57. generateChildren(h, dsl) {
  58. let result = dsl.children &&
  59. dsl.children.map((child) => this.generator(h, child))
  60. || [];
  61. // (A&&B)||C
  62. if (dsl.text) result.push(dsl.text)
  63. // console.log(result)
  64. return result;
  65. }
  66. },
  67. mounted() {
  68. }
  69. }
  70. </script>

解释

 

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

让我们把重点放在这句上

  1. 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://www.cnblogs.com/FatTiger4399/p/18136070

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号