10、架构:组件通信设计

news2024/12/28 12:58:48

通信是一个应用中不可或缺的一个功能,现如今前端视图类框架大多数都是由数据驱动,通过数据来进行视图层的展示渲染。举个简单的例子如下,这是一个常见的 React 列表渲染:

// each
const numbers = [1, 2, 3, 4, 5];
const listItems = numbers.map((number) =>
  <li>{number}</li>
);

// render
<ul>{ listItems }</ul>

在实际开发场景下,numbers 的值往往是动态变化的,通过 setState 可以进行数据的更新从而带动页面视图的渲染,以此来达到数据驱动的结果。

一款通用的低代码成品也一定会具备不同的物料组件交互和联动以及数据共享函数执行等功能。

因此组件通信是实现低代码平台模块化、提高扩展性和任务连接的关键手段。

状态管理设计


前端应用程序的数据状态通常包括用户输入、服务端返回的数据、组件之间的数据传递等,这些数据状态的变化会影响到前端应用程序的展示和交互。 在实际应用中,大多数的状态(State)都是以下几种形式存在的:

  • 局部状态管理: 将状态存储在组件的本地状态中,没有通过实例或者是属性向外传递,这种状态适用于简单的区块组件,其特点就是完全内部独立,无需进行共享;
  • 全局状态管理:将状态存储在一个上层容器中,通过向下注入的方式来统一收集状态管理流,统一管理状态的变化的事件的触发,只需要在应用程序中用到的地方进行订阅即可获取最新的状态内容。通常在一些大型应用和复杂的区块模板中会经常使用到。

在 React 中,实现状态管理的方案有很多,其中比较知名的就是 Mobx 与 Redux,这是早期流行的解决方案,分别是单向数据流与双向数据流的典型代表作品,除此之外,也有 recoilzustandxState 等方案都可以实现 React 的状态管理。

在低代码平台中,后续实现也会基于 Redux 来实现组件通信的状态管理,选择 Redux 的原因有几下几个方面的考量:

  • 使用足够简单,应用程序的全局状态都在存储区内的对象树里面,通过派发事件可以来进行对应的状态修改;
  • 扁平化状态管理,可以自顶向下的管理自身的状态引用,能够将应用复杂的状态变得可预测和可维护;
  • 与框架无关,Redux 本身就是一种状态容器,可以在不同的 JS 环境下运行;
  • 使用 Redux 的中间件可以让我们在核心层中对状态做一些魔法改造,比如日志、数据处理、错误兜底等一些通用类的处理;
  • 调试,借用 redux-tool 可以在开发时更好地理解应用程序中发生的事件和状态的变化,增强错误排查的能力和开发调试的体验。

以上都是一些使用 Redux 的原因,在低代码平台中也不需要开发者来维护一个非常规范的 Store 目录,减少了很多使用 Redux 时代码组织的烦恼。

数据流


数据流是指在应用程序中数据传递的方向和路径。在前端开发中,数据流通常是单向的。

如果在页面的 Text 组件中,我需要来获取一个动态的数据变量(root)。此时,会进行一次向上路径树的寻址最终来获取到相关的变量。也可以通过具体的 NamePath 获取对应的状态数据,最终来完成页面的显示。

如下图所示,是前期对平台一个基本数据链空间的状态流转:

但在我们的产品设计中,最终还是将状态链的方案给摒弃掉了,而是使用了最基础的 Redux 数据流模式来进行工作,通过一个中间件来完成整个状态的调度。这么做的原因是大部分框架都是由数据来驱动的,对于低代码平台的数据流而言,应尽可能的简单,便于预测和集中化统一调度

如下图,是一个 Redux 的基本数据流的过程,在平台中,页面组件属性都可以绑定一个 store 层中声明的状态,一旦绑定后,这个属性将会成为一个受控内容,组件的操作往往会引起应用程序状态的改变,而状态的改变又会反过来影响组件的状态和行为。

这就是组件通信数据流的概念与作用。

组件联动与操作


组件操作是指页面中组件的一些行为和交互,通过这些操作来实现页面的功能。

在设计数据流的时候也提到了受控属性会因为状态发生改变而改变。也就是说一个组件的状态会随着另外一个组件或者本身的操作而发生变化,在组件操作的设计中,大体上分为以下几种:

  • 事件绑定:通过绑定事件处理函数来响应用户操作,例如点击、鼠标悬停、拖拽等。事件绑定通常通过 React 的事件系统或其他库来实现,它们可以使得页面变得更加动态和交互性;
  • 表达式: 通过表达式来计算和展示页面的内容和样式。表达式可以是简单的变量、函数调用或复杂的逻辑运算,它们可以使得页面的内容更加灵活和可定制。除此之外,也有类似于 amis 的后端公式法则,也属于是表达式相关的一种;
  • 循环遍历&条件判断:循环遍历和条件判断可以使得页面的结构和内容根据数据来进行相应的显示,往往会随着状态数据改变而重新进行视图的渲染,展示动态变化的页面;
  • 属性绑定:将组件属性变更为可控属性,从而来实现状态与内容的一致和灵活,也是日常开发中最常见的功能之一。

基于设计好的事件流,后续组件的联动就无需将组件与组件挂钩了,而是与状态关系之间相关联,也就是常见的 UI(State)解法。

如下图所示:在逻辑块中创建了onBtnClick保存后,此时就创建了一个可执行的函数,在函数内部操作了 Redux 的 Dispatch 来派发 UPDATE Reducer 更新内容。

保存函数后,在对应的属性面板点击事件绑定将其进行关联。

需要注意的是,所有的表达式在存储的时候都会会进行一个类型的标记。比如上述事例中的 onBtnClick,在协议中会进行如下转换一个简单的数据结构进行存储,参考如下代码:


onBtnClick: {
  type: 'Function',
  source: "onBtnClick = () => {\n  __store__.dispatch({\n    type: 'UPDATE',\n    payload: {\n      data: __props__.value + 1\n    }\n  })\n}"
}

那么这串协议怎么用呢?

那就需要使用 BrowserCodeExecVM 来进行处理了。如下所示:

BrowserCodeExecVM 是一个代码执行的虚拟容器,它能够动态的解析代码字符串并解析,当绑定事件执行的时候,会被 BrowserCodeExecVM 进行执行,然后将结果返回给触发器的源头,以此来实现一个中继闭环。

在本章节中,主要是对其有一个基本的认识了解,在后续动态逻辑执行实现中,会详细的来刨析 BrowserCodeExecVM 的设计与实现过程。

AST与未来


协议是整个低代码平台的基石,随着对低代码平台的要求越来越高的情况下,那么承载与底层的协议必然会随之迭代的非常复杂。如何使用协议来描述一个组件许,其最终形态能够满足用户将状态、PRops、表达式等大部分功能可以像 React 一样快速的进行开发。

基于此,有部分的同学脑海中立马就浮现了 AST 的身影,基于 AST 方案的抽象协议可以很好的满足用户对大部分状态和组件的交互操作。就目前而言,AST 是代码最真实抽象的存在,但是同样的本身结构也非常复杂,相比于搭建平台抽象的协议而言,两者的等级相差还是非常大的。

在社区中看到一片文章感觉非常有意思,如下代码所示:

{
    type: 'Component',
    name: 'Test',
    props: [
      {
        type: 'ComponentProp',
        name: 'initalValue',
        init: { type: 'Literal', value: 0 },
      },
    ],
    state: [
      {
        type: 'Val',
        name: 'counter',
        init: { type: 'Identifier', name: 'initialValue' },
      },
    ],
  }

const Test = ({ initialValue = 0 }) => {
  const [counter, setCounter] = useState(initialValue);
  // ....其他
}

这样的设计是 reka.js 的解法,基于 AST 来为搭建页面构建复杂的状态管理。用户可以无负担的将自己搭建的应用呈现在用户面前,这一切的背后工作都是解释器在完成。解释器会根据协议处理好属性,状态,逻辑表达式等一系列的问题。

但是就目前而言,AST 的方案会更加的完善和智能,同样的解析成本和对编辑器的工作要求也是相当之高的。所以说是未来解决方案的一种考量。

总结


在本章节,主要的内容是来设计一个低代码平台的通用化状态管理的过程方案以及组件联动的过程,在接下来的实战当中,会主要使用 Redux 来完成低代码平台状态的管理和事件派发相关。

在未来不久,通过动态逻辑执行与在线代码执行 Vm 的帮助,一举来打通整个事件 + 状态 = 视图变化的一个完整体系,真正意义上做到低代码级别的搭建效果。

资源推荐

medium.com/dailyjs/whe… github.com/prevwong/re… juejin.cn/post/720463… zhuanlan.zhihu.com/p/373545726

写在最后

如果你有什么疑问或者更好的建议,欢迎在评论区提出。 👏

10 架构:组件通信设计

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

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

相关文章

应用级监控方案Spring Boot Admin

1.简介 Spring Boot Admin为项目常用的监控方式&#xff0c;可以动态的监控服务是否运行和运行的参数&#xff0c;如类的调用情况、流量等。其中分为server与client&#xff1a; server&#xff1a; 提供展示UI与监控服务。client&#xff1a;加入server&#xff0c;被监控的…

C语言王国探险记之函数的简单概念

王国探险记系列 文章目录&#xff08;5&#xff09; 目录 王国探险记系列 文章目录&#xff08;5&#xff09; 前言 一&#xff0c;函数的基本概念 二&#xff0c;调用外部函数和main()函数区别 2.1如果我们将函数的定义放到后面&#xff0c;可不可以呢&#xff1f; 总结…

插值应用案例1

案例1 一阶线性插值 待加工零件外形根据工艺要求在一组数据(x,y)给定&#xff08;如下表&#xff09;&#xff0c;用程控铣床加工时每一刀只能沿着x方向或y方向走非常小的一步&#xff0c;需要从已知数据得到加工步长很小的(x,y)的坐标。 下表中所给x,y数据位于机翼断面的下…

使用Vue脚手架

(193条消息) 第 3 章 使用 Vue 脚手架_qq_40832034的博客-CSDN博客 初始化脚手架 说明 1.Vue脚手架是Vue官方提供的标准化开发工具&#xff08;开发平台&#xff09; 2.最新的版本是4.x 3.文档Vue CLI脚手架&#xff08;命令行接口&#xff09; 具体步骤 1.如果下载缓慢…

Libvirt Event Loop简介

文章目录 前言实现原理处理框架编程接口 原理验证事件订阅服务监听验证流程 前言 Event Loop顾名思义就是事件循环&#xff0c;整个程序是一个大的循环&#xff0c;通过事件来驱动程序要做的事情。传统编程模型是顺序的&#xff0c;程序运行一次然后终止&#xff0c;这种模型简…

JavaScript Day10 DOM详解

DOM DOM是JS操作网页的接口&#xff0c;全称为“文档对象模型”&#xff08;Document Object Model&#xff09;。它的作用是将网页转为一个JS对象&#xff0c;从而可以用脚本进行各种操作&#xff08;比如增删内容&#xff09;。 • 文档 – 文档表示的就是整个的HTML网页文档…

19-Linux 权限

目录 1.用户操作 1.1.创建用户 1.2.配置密码 1.3. 切换用户 2.三种角色 3.文件类型和访问权限 3.1.文件类型 3.2.基本权限 4.修改文件权限 1.用户操作 Linux下有两种用户&#xff1a; 超级用户&#xff08;root&#xff09;普通用户 超级用户&#xff1a;可以再lin…

【Cache】Redis主从复制哨兵模式集群

文章目录 一、Redis 持久化1. 主从复制2. 哨兵模式3. 集群 二、 Redis 主从复制1. 概述2. 主从复制的作用3. 主从复制流程4. 搭建 Redis 主从复制4.1 环境准备4.2 安装 Redis4.3 修改 Master 节点配置文件4.4 修改Slave节点配置文件&#xff08;Slave1和Slave2配置相同&#xf…

【vant移动端表格数据排版】用vant2简单实现一个把PC端表格数据展示在移动端的排版。上拉加载更多,下拉刷新页面,新增,编辑,删除功能

前言 上次做了一个移动端的表格功能&#xff0c;纯表格的那种。 跟PC一样&#xff0c;但是我一直觉得在移动端上写表格很糟糕的体验&#xff0c;毕竟手机就那么大。这不合理。 但是我这公司又需要把PC端的表格的数据展示在移动端。 导致我只能去试试看怎么排版比较好。由于网上…

【Qt-14】QT小知识点

1、关闭程序时报错 解决方案&#xff1a; 报这个错误可能是内存溢出&#xff0c;申请的空间与注销的空间不一致导致&#xff0c;排查了好久&#xff0c;我不是因为这个原因&#xff0c;我的问题如下&#xff0c;没有new窗体。 2、固定QT窗体大小 this->setMinimumSize(QSi…

NLP实战6:seq2seq翻译实战-Pytorch复现-小白版

目录 一、前期准备 1. 搭建语言类 2. 文本处理函数 3. 文件读取函数 二、Seq2Seq 模型 1. 编码器&#xff08;Encoder&#xff09; 2. 解码器&#xff08;Decoder&#xff09; 三、训练 1. 数据预处理 2. 训练函数 四、训练与评估 &#x1f368; 本文为[&#x1f51…

【算法集训之线性表篇】Day 02

文章目录 题目一思路分析代码实现效果 题目二思路分析代码实现效果 题目一 01.设置一个高效算法&#xff0c;将顺序表L的所有元素逆置&#xff0c;要求其空间复杂度为O(1)。 思路分析 首先&#xff0c;根据题目要求&#xff0c;空间复杂度度为O(1),则不能通过空间换时间的方…

为什么编程更关注内存而很少关注CPU?

我们知道&#xff0c;我们编写的程序&#xff0c;不管是什么编程语言&#xff0c;最后执行的时候&#xff0c;基本上都是CPU在完成。之所以说基本上&#xff0c;是因为还有GPU、FPGA等特殊情况。 但不知道大家发现没有&#xff0c;我们编程的时候&#xff0c;经常在关注内存问…

大促转化率精准预估优化论文随笔记

这是一篇阿里妈妈的论文【KDD’23 | 转化率预估新思路&#xff1a;基于历史数据复用的大促转化率精准预估】 常规的销量预测&#xff0c;遇到一些特大事件&#xff0c;直播、大促&#xff0c;一般很难预估得准确。而且现在电商机制也比较多样&#xff0c;预售、平台折扣等。 本…

初识MySQL:了解MySQL特性、体系结构以及在Linux中部署MySQL

目录 MySQL简介 MySQL特性 MySQL体系结构 SQL的四个层次&#xff1a; 连接层&#xff1a; SQL层&#xff1a; 插件式存储引擎&#xff1a; 物理文件层&#xff1a; 一条SQL语句的执行流程&#xff1a; MySQL在Linux中的安装、部署 首先需要下载mysql软件包&#xff…

月入9000+的CSGO游戏搬砖项目操作细节和疑问 ?给您一一解答

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 01 海外CSGO游戏搬砖项目是什么&#xff1f; csgo搬砖是在外服steam上购买包含印花枪皮等等…

9.2、增量表数据同步

1、数据通道 2、Flume配置 1&#xff09;Flume配置概述 Flume需要将Kafka中topic_db主题的数据传输到HDFS&#xff0c;故其需选用KafkaSource以及HDFSSink&#xff0c;Channel选用FileChannel。 需要注意的是&#xff0c; HDFSSink需要将不同mysql业务表的数据写到不同的路径…

2023.7.4 Dataloader切分

一、 如果文件夹路径是 path/to/folder with spaces/&#xff0c;使用以下方式输入 path/to/folder\ with\ spaces/或者使用引号包裹路径&#xff1a; "path/to/folder with spaces/"这样可以确保命令行正确解析文件夹路径&#xff0c;并将空格作为路径的一部分进…

ADB自动化测试框架

一、介绍 adb的全称为Android Debug Bridge&#xff0c;就是起到调试桥的作用&#xff0c;利用adb工具的前提是在手机上打开usb调试&#xff0c;然后通过数据线连接电脑。在电脑上使用命令模式来操作手机&#xff1a;重启、进入recovery、进入fastboot、推送文件功能等。简单来…

Intellij IDEA 初学入门图文教程(八) —— IDEA 在提交代码时 Performing Code Analysis 卡死

在使用 IDEA 开发过程中&#xff0c;提交代码时常常会在碰到代码中的 JS 文件时卡死&#xff0c;进度框上显示 Performing Code Analysis&#xff0c;如图&#xff1a; 原因是 IDEA 工具默认提交代码时&#xff0c;分析代码功能是打开的&#xff0c;需要通过配置关闭下就可以了…