机器人过程自动化(RPA)入门 3. 顺序、流程图和控制流程

news/2024/5/20 9:02:32 标签: 机器人, 自动化, rpa

到目前为止,我们已经了解了RPA是什么,并且我们已经看到了通过记录任务的活动并运行它来训练UiPath机器人是多么简单。使用记录器的UiPath可以很容易地自动化日常任务。在我们开始自动化复杂的任务之前,让我们学习如何控制从一个到另一个的活动流。

在本章中,我们将学习如何有序地安排活动以及如何控制流程。这些是任何编程的基础。我们将学习如何将活动放入序列、流程图和循环中。我们还将使用if-else来研究逻辑控制。

为了训练机器人处理一种类型的事务,有条理的流程中的指令是非常重要的。大多数情况下,这些指令是按顺序执行的。让我们详细了解这一点。

本章将涵盖以下主题:

  • 顺序工作流
  • 活动
  • 流程图是什么以及何时使用
  • 控制流、各种类型的循环和决策
  • 使用序列和流程图的示例

顺序工作流

UiPath提供了四种类型的项目:

  • 序列
  • 流程图
  • 用户事件
  • 状态机

这些都是用来设计一个基于类型和方便的项目。这四种类型的项目在处理不同类型的过程时非常有用。流程图和序列主要用于简单的自动化。用户事件有利于实现前台机器人,而状态机则用于处理复杂的业务流程。

什么是序列?

序列是一组逻辑步骤。每一步都代表一个动作或一件工作。序列用于线性连续发生的过程,即一个接一个的过程。UiPath中的三种类型的项目中,Sequences是最小的。下一节介绍了如何在UiPath Studio中构建序列。

在下面的例子中,我们将制作一个简单的项目,询问用户的姓名,然后显示他或她的回答:

  1. 打开UiPath Studio并单击“空白”以启动新项目。给它取一个有意义的名字。从左侧“活动”面板中拖放流程图活动。
  2. 在Activities(活动)面板中搜索序列,然后将其拖放到流程图中,如以下屏幕截图所示:
  3. 双击序列。我们现在必须添加我们想要执行的步骤。将每一步都视为一项行动。
  4. 我们可以在序列中添加许多步骤。为了简单起见,我们将添加两个步骤:
    1. 在输入对话框中询问用户名
    2. 在消息框中显示用户名
  5. “活动”面板的“搜索”面板中的搜索“输入”对话框。在序列中拖放输入对话框活动(输入对话框活动是一个显示消息或问题的对话框,要求用户在回复中填写):

    在“输入”对话框的“标签”上写下相应的消息,询问用户名。在我们的案例中,我们写入“what's your name?”。
  6. 将消息框活动拖放到序列中。(顾名思义,消息框显示给定的文本。在这种情况下,我们将使用它来显示用户在被问及姓名时在“输入”对话框中给出的文本/回复。)
  7. 接下来,创建一个变量并为其指定所需的名称。此变量将接收用户在“输入”对话框中输入的文本,以回答我们的问题,即用户名:
  8. 现在,我们必须指定“输入”对话框的“结果”属性(在“属性”面板中)。在那里指定变量名后,它将接收用户输入的文本。单击显示在Result属性右侧的虚线图标。现在,指定变量名:
  9. 指定我们在消息框的文本区域中创建的变量名称(消息框的“文本”区域用于输入将在消息框中显示的文本)。我们只需要将序列连接到开始图标。这可以通过右键单击“序列”活动并选择“设置为开始节点”选项来完成。
  10. 点击Run(运行)按钮,查看结果。

活动

在UiPath Studio中,一个活动表示一个操作单元。每个活动都执行一些操作。当这些活动结合在一起时,就变成了一个过程。

每个活动都位于设计器主面板的“活动”面板上。您可以搜索特定的活动并将其用于您的项目中。例如,当我们搜索浏览器时,所有浏览器活动都将显示在“活动”面板中,如以下屏幕截图所示:

将活动与工作流一起使用

我们已经了解了如何轻松地搜索特定的活动。现在,让我们看看如何在工作流中使用它们:

  1. 以与我们在“活动”面板搜索栏中搜索浏览器活动相同的方式搜索“流程图”。将流程图活动拖放到“设计器”面板内。
  2. 流程图显示在“设计器”面板中,并且我们有一个给定的“开始”节点。“开始”节点指定执行的开始位置。
  3. 我们准备在流程图中使用不同的活动。您可以使用流程图中的任何活动。为了简单起见,让我们只使用Write Line活动。
  4. 在流程图中拖放“Write Line”活动。通过提供字符串值来设置其文本属性。通过右键单击“Write Line”活动并选择“设置为起始节点”,将此Write Line活动与“开始”节点连接起来。

你可能想知道工作流的作用是什么。假设你有一个由数百个活动组成的大项目。您将如何调试它?处理这样的情况是开发人员的噩梦。在这里,工作流程开始发挥作用。要构建这样一个大项目,开发人员只需将其划分为较小的模块,并将其提取为工作流。现在,每个工作流都可以单独测试。因此,很容易发现bug和错误。创建不同的工作流并将它们组合成一个逻辑序列将提高我们的代码质量、可维护性、可靠性和可读性

我们制作了一个较小的模块,现在是时候将其提取为工作流了。右键单击“设计器”主面板,然后选择“提取为工作流”:

会弹出一个窗口询问姓名。给它一个有意义的名称,然后单击“创建”。这将是您的工作流名称:

我们刚刚使用了活动,并在工作流中提取了它们。如果检查设计主面板,它看起来像下面的屏幕截图:

它会自动生成“调用工作流”活动。现在,当我们运行程序时,它将调用我们提取的工作流(双击“调用工作流”活动,查看它将调用哪个工作流以及它在哪里生成)。

流程图是什么以及何时使用

流程图通常用于复杂的业务流程。它提供决策便利,可用于小型和大型项目。在这里,我们可以通过不同的方式添加活动:

流程图提供了多个分支逻辑运算符来进行决策。流程图可以反向运行。此外,它也可以在序列中使用。流程图有助于不同项目的可重用性。一旦我们创建了它用于项目,它就可以用于不同但相似的项目。

流程图的分支默认设置为true/false。但是,可以从“属性”面板手动更改其名称。

例如,输入两个数字并检查它们的总和是否小于20。

执行以下步骤:

  1. 首先,将“活动”面板中的流程图添加到“设计器”面板中。
  2. 在流程图中添加序列活动。
  3. 在“序列”活动中执行两个“输入”对话框活动(用于输入要添加的数字)。
  4. 创建变量x和y以保存值。
  5. 接下来,添加一个消息框活动以执行数学运算。在我们的例子中,这两个数字之和小于20:
    int.Parse(X)+int.Parse(Y)<20
  6. 现在,添加一个Flow Decision活动来检查数学运算。
  7. 如果为true,则Flow Decision将流向true分支。否则,它将流向假分支。


控制流、各种类型的循环和决策

控制流是指在自动化中执行操作的顺序或特定方式。UiPath为执行决策过程提供了许多活动。“活动”面板中的这些活动使用双击方法或拖放方法放入工作流中。

不同类型的控制流活动如下:

  • 分配活动
  • Delay活动
  • 中断活动
  • 先条件循环活动
  • 后条件循环活动
  • 遍历循环
  • if 活动
  • 切换活动

分配活动(Assign)

Assign活动用于为变量指定一个值。Assign活动可以用于不同的目的,例如增加循环中变量的值,或者使用变量的和、差、乘或除的结果并将其分配给另一个变量。

Delay活动

顾名思义,Delay活动用于通过将自动化暂停一段定义的时间来延迟或减缓自动化。工作流在指定的时间段后继续。它采用hh:mm:ss格式。当我们在自动化过程中需要一段等待期时,这个活动发挥着重要作用,比如说,打开特定应用程序所需的等待期。

示例

为了更好地理解Delay活动是如何工作的,让我们看一个自动化的例子,它向Output面板写入两条延迟50秒的消息。

执行以下步骤:

  1. 首先,创建一个新的流程图。
  2. 从Activities(活动)面板添加Write line(写入行)活动,并将其连接到Start(开始)节点。
  3. 选择写入行活动。现在,在文本框中键入以下文本:“Hey,What's your name?”。
  4. 接下来,添加一个Delay活动,并将其连接到Write line活动。
  5. 选择Delay活动,然后转到属性面板。在“持续时间”字段中,设置00:00:50。这是两条记录消息之间的50秒延迟。
  6. 采取另一个写入行活动,并将其连接到延迟活动。在文本字段中,写入My Name is Andrew Ng.。
  7. 单击Run(运行)按钮后,Output(输出)面板会显示一条消息,将其延迟50秒:

中断活动(Break)

中断活动用于在特定点中断/停止循环,然后根据要求继续进行下一个活动。它不能用于除对于遍历循环的任何其他活动。当我们想要打破循环以继续到对于遍历循环活动中的下一个活动时,这很有用。

示例

在本例中,我们将使用中断活动只执行一次迭代。

执行以下步骤:

  1. 将序列活动添加到设计器面板中。
  2. 下一步,在序列中添加遍历循环活动(如前一节所述,要使用Break活动,我们需要遍历循环):
  3. 创建两个变量;名为item的整数变量和名为X的数组整数变量。然后,将它们设置为文本字段。
  4. 在循环正文中添加中断活动。
  5. 在遍历循环活动下,添加一个Write line活动。
  6. 在Write Line活动中,在文本字段中键入item.ToString()。
  7. 当我们单击Run按钮时,它将显示一个元素,如下面的屏幕截图所示。这是由于Break活动,该活动在第一次迭代后已停止执行:

在进行其他控制流活动之前,我们将了解循环,这是自动化的一个重要方面。自动化最常被提及的优点之一是它能够执行重复的功能,并且能够毫无错误地执行这些功能。循环正是用于此类函数的。比方说,一个人想要针对不同的情况或当满足某个标准时重复工作流程的某个部分。在这种情况下,循环非常方便。可以简单地通过将工作流的末端连接到我们希望工作流恢复的点来创建循环。

在进行这样的循环时,需要记住的一件事是确保也有一个出口点。否则,循环将无限继续!

在各种控制流活动中提到的While先条件循环、Do While后条件循环和For each遍历循环活动就是循环的示例。现在让我们看看它们在哪里使用以及它们是如何工作的。

先条件循环活动(while)

While活动在自动化中用于根据特定条件执行语句或流程。如果结果为true,则执行循环;即重复执行该处理。只有当条件不成立时,项目才会退出循环。在遍历元素数组时,此活动非常有用。

示例

在下面的例子中,我们将看到一个整数变量如何以5为增量从5增加到50。

执行以下步骤:

  1. 在Blank项目中,添加Sequence活动(默认)。
  2. 现在,创建一个整数类型的变量X。将其默认值设置为5。
  3. 接下来,将先条件循环While活动添加到序列中。
  4. 在条件字段中,设置x<50。
  5. 将Assign活动添加到While循环的Body部分。
  6. 现在,转到Assign活动的Properties面板,在文本字段integer variable中键入value字段integer x+5
  7. 拖放Write line活动并指定变量名称X并应用ToString方法:
  8. 现在,单击Run(运行)按钮。输出将显示在输出面板中,如以下屏幕截图所示:

Do while后条件循环活动

Do while活动用于自动化中,当需要根据特定条件的满足执行语句时。它与While活动的不同之处在于,它执行一条语句,然后检查条件是否满足。如果条件未满足,则退出循环。

示例

让我们举一个例子来了解Do while活动在自动化中是如何工作的。取一个整数变量。从这个变量开始,我们将生成2的所有倍数,小于20。

执行以下步骤:

  1. 将Sequence(默认)添加到设计器面板。
  2. 从Activities面板添加Do while活动。
  3. 在Do while活动的正文部分中,添加一个Assign(分配)活动。
  4. 现在,选择分配活动。转到“属性”面板,创建一个整数变量Y。将其默认值设置为2。
  5. 在Assign活动的value部分设置Y+2,以每次将结果递增,直到执行循环为止。
  6. 在Assign活动中添加WriteLine活动。
  7. 在WriteLine活动的文本字段中,键入Y.ToString()。
  8. 在条件部分中,设置条件Y<209。循环将继续,直到条件成立:
  9. 单击Run(运行)按钮后,显示的输出如下:

For each遍历循环活动

For each活动的工作方式是一次迭代项集合或元素列表中的每个元素。在这个过程中,它将执行身体内部可用的所有操作。因此,它遍历数据并分别处理每条信息。

示例

在下面的示例中,我们将使用For each活动来遍历偶数集合,并一次显示一个元素。

执行以下步骤:

  1. 从UiPath中的空白项目开始。
  2. 将Sequence活动添加到设计器面板中。
  3. 接下来,在Sequence中添加For each活动,并创建一个整数类型的数组变量X。
  4. 在变量的默认值中,放入new int[]{2,4,6,8,10,12,14,16,18,20}
  5. 将“WriteLine”活动添加到设计器面板(此活动用于显示结果)。
  6. 在“WriteLine”活动的“文本”字段中,键入currentItem.ToString()
  7. 现在,运行程序。您将看到,由于使用了For each活动,数组中的每个数字都会逐一显示:

控制流还促进决策机制,有助于对特定活动的步骤做出决策。例如,假设我们使用的是一个循环,并且我们只想显示一个所需的值,那么我们可以通过实现If活动来过滤掉所有的所需值,并根据If活动的结果做出决定,即true或false。在执行所需元素后,决策过程将需要一些时间来中断操作。接下来是休息活动,这将发挥重要作用。如果要从任务中选择执行,则需要切换活动才能做出这样的决定。

If活动和Switch活动是控制流的决策活动。

If活动

If活动由一个具有两个条件的语句组成:true或false。如果该语句为true,则执行第一个条件;如果不是,则执行第二条件。当我们必须根据陈述作出决定时,这是有用的。

为了更好地理解If活动是如何工作的,让我们看一个检查任意两个数字之和是否小于6的示例。

执行以下步骤:

  1. 从“活动”面板添加流程图。
  2. 添加两个“输入”对话框活动。创建两个整数变量x和y。
  3. 在“属性”面板中,更改“输入”对话框活动的标签名称和标题名称。
  4. 现在,在两个“输入”对话框活动的“结果”属性中指定这两个变量的名称。
  5. 现在将If活动添加到Designer面板:

  6. 单击Run(运行)按钮以检查输出。如果条件成立,那么它将显示真实值;否则,它将显示false值,如第二个屏幕截图所示(在我们的情况下,我们将x和y的值分别作为和,从而得到13的和,该和不小于;因此,输出将其显示为false值):

(切换)活动

切换活动可用于进行选择。当我们有各种可用的选项并且想要执行一个选项时,我们经常使用Switch活动。

默认情况下,Switch活动接受一个整数参数。如果我们想要获取所需的参数,那么我们可以从属性面板的类型参数列表中对其进行更改。Switch活动在根据自己的选择对数据进行分类时非常有用。

示例

让我们看一个例子,我们必须检查给定的数字是奇数还是偶数。

我们知道,所有奇数除以2,都会留下1的余数。另一方面,偶数除以2后,余数为0。因此,我们将有两个情况得到1或0的余数。

执行以下步骤:

  1. 添加Sequence活动。
  2. 在Sequence中添加输入对话框活动。
  3. 现在,创建一个整数类型的变量k。
  4. 在“属性”面板内的“结果”属性中指定新创建的变量的名称。
  5. 在“输入”对话框活动下添加“切换”活动。
  6. 在表达式字段中,设置 C# k %2, VB k mod 2, 以检查数字是否可被2整除。
  7. 将“WriteLine”活动添加到“默认”部分,然后键入K.ToString()+" is an even number"在文本字段中。
  8. 现在,创建Case 1,向其中添加另一个Write行活动,然后键入K.ToString()+" is an odd number"

使用Sequence和流程图的示例

Sequence和流程图是相似的概念。它们都用于包含逻辑步骤或操作。每个人都应该知道何时使用它们。它们的不同之处在于,序列通常用于包含执行一个操作的多个步骤。另一方面,流程图适用于特定任务。当我们有很多类似的步骤时,我们将它们包含在序列中。可能有不同的序列在执行它们的工作。我们可以很容易地将类似的序列放入工作流中;每个工作流代表一个任务。单独测试单独的工作流非常容易。让我们通过一个例子来更好地理解它们。

如何使用Sequence

可能有不同的序列在执行它们的工作。我们可以很容易地将类似的序列放入工作流中;每个工作流代表一个任务。单独测试单独的工作流非常容易。让我们通过一个例子来更好地理解它们。

执行以下步骤:

  1. 将流程图拖放到“设计器”面板上。拖放序列活动。将“序列”活动与“Start”节点连接。
  2. 双击序列活动。拖放“输入”对话框活动和“消息框”活动。在“输入”对话框活动的标签属性中指定消息。

点击Run(运行)按钮或按F5键查看结果。

我们可以清楚地看到,我们在序列中使用了两个逻辑相关的活动(一个用于输入名称,另一个用于弹出名称)。在这里,序列包含两个活动。当然,您可以在序列中放置任意数量的活动;它将根据您定义它的顺序执行。

如何使用流程图

之前,我们已经了解了如何使用序列和活动。我们现在将学习如何使用流程图。流程图是一个容器。它可以包含其中的活动。

我要使用电子邮件活动,例如,请安装UiPath.Mail.activities。您可以通过单击管理程序包图标或按Ctrl+P找到它,然后在所有程序包中搜索邮件。您将在第六章中了解有关软件包的更多信息。

让我们在流程图中拖放一个消息框活动。双击消息框,在要引用文本的区域键入)“Hello world"。按F5键查看结果):

因此,当程序只有几个步骤时,我们可以直接在流程图中使用活动。然而,当我们有大量的步骤时,它会变得更加复杂。这就是为什么有必要将相关活动安排到序列中,然后将序列分组到流程图中。

让我们举一个例子来看看如何在流程图中使用序列。

我们不会实现发送电子邮件的实际代码。稍后将详细介绍。本案例的目的是清楚地了解我们在何处以及如何使用工作流和序列。

执行以下步骤:

  1. 在主流程图上拖放两个流程图活动。并且重命名为Send Email 和Message。
  2. 我们有两种不同的工作流程。“Send Email”工作流会将邮件发送到电子邮件地址。邮件工作流具有该电子邮件的邮件正文,并将要求用户输入姓名、邮件、发件人和收件人。
  3. 我们必须在两个工作流程中实施所需的步骤。
    为此,我们在流程图中使用序列。双击流程图。在两个流程图中拖放一个序列活动。通过右键单击“序列”并选择“设置为开始节点”选项,将“序列”连接到“开始”节点。
  4. 双击Message流程图中的序列。拖放名称、消息、发送者和接收者的四个输入对话框活动(在此序列中,我们不设置消息框的任何属性,因为本课程的目的是清楚地了解我们在何处以及如何使用工作流和序列):
  5. 双击“Send Email流程图”。双击序列。您可以在此处拖放电子邮件活动。(我们不会拖动任何邮件活动,尽管您可以自由拖动。那是另一章节的内容)。
  6. 就是这样。现在,转到主流程图。将Message流程图连接到“开始”节点。此外,请将“发送邮件”活动连接到“Send Email流程图”:

使用序列和控制流的示例

在本节中,我们将通过一个示例讨论控制流。我们将看到如何在序列中使用控制流。如前所述,存在各种控制流活动。

考虑一个名称数组。假设我们必须找出其中有多少名字以字母a开头。然后我们将创建一个自动化系统,计算以a开头的名字的数量,并显示结果。

执行以下步骤:

  1. 从活动面板中拖放流程图活动。
  2. 在流程图中拖放序列活动。通过右键单击“序列”活动并选择“设置为开始节点”选项,将“序列”连接到“开始”节点。
  3. 双击序列活动。创建一个变量,给它一个名称(在我们的例子中,我们将创建一个类型字符串的数组,并将变量命名为names)。将变量类型设置为[T]的数组。当询问数组的类型时,请选择字符串。
    此外,在变量的Default部分中,通过给数组一个默认值来初始化数组。例如,
    new string[]{"John","sam","Andrew","Anita"}

  4. 创建整型的变量Count以存储结果。将变量类型设置为Int32:
  5. 在序列中拖放Foreach活动。此外,在Foreach活动的表达式框中指定数组名称。Foreach活动用于对数组进行迭代。它每次都会从数组中提取一个名称,直到到达末尾:
  6. 从Activities(活动)面板拖放If(如果)活动,并将其放置在For each(对于每个活动)中提到drop activity here(将活动拖到此处)的位置。在If活动的表达式框中指定条件。If活动用于检查特定条件/表达式。如果满足该表达式,则将执行Then块。否则,Else块将被执行。
    我们已将表达式指定为currentItem.ToString().StartsWith('a'), 此表达式指定项变量中以字母开头的名称为a, For each活动在数组上迭代,一次获取一个名称,并将其存储为变量currentItem。
  7. 现在,我们将使用Count变量,并在每次数组中的名称以字母B开头时将其递增。为此,我们必须使用a+B Assign活动。将A+B Assign活动拖放到If活动中。将A+B Assign活动的To属性设置为Count(变量名),将Value属性设置为Count+1(以增加其值):
  8. 只需将“消息框”活动拖放到“序列”活动中即可。在“消息框”活动的表达式框中指定计数变量。但请记住,我们创建的变量的类型是Int32,因此,如果不将其转换为字符串,就无法将其用于Message box活动。为了将其转换为字符串,我们在UiPathStudio中提供了ToString方法。只需将其应用于变量并选择Count.ToString():

点击Run(运行)按钮或按F5键查看结果。

总结

在本章中,我们检查了记录器生成的项目,并看到了对程序流(工作流)结构的解释。我们了解序列的使用和活动的嵌套。我们学习了如何使用工作流、流程图和控制流的构建块(循环和决策)。

在下一章中,我们将学习使用内存和变量的技术,还将学习如何使用数据表在内存中存储和轻松操作数据。下一章还将展示如何使用磁盘文件(CSV、Excel等)来保存数据。


http://www.niftyadmin.cn/n/5052918.html

相关文章

国内大语言模型的相对比较:ChatGLM2-6B、BAICHUAN2-7B、通义千问-6B、ChatGPT3.5

一、 前言 国产大模型有很多&#xff0c;比如文心一言、通义千问、星火、MOSS 和 ChatGLM 等等&#xff0c;但现在明确可以部署在本地并且开放 api 的只有 MOOS 和 ChatGLM。MOOS 由于需要的 GPU 显存过大&#xff08;不量化的情况下需要80GB&#xff0c;多轮对话还是会爆显存…

Java 接口多实现动态调用

简单定义一个接口,做数据插入 public interface ImportingData<T> {AjaxResult addData(T t); }目前本文使用的是根据泛型类实现动态调用,在引入时必须明确是那个实体类, 还有种方法就是给每一个实现类定义业务类型的枚举,这时候子啊接口里面就得多写一个返回枚举的实现…

基于VR元宇宙技术搭建林业生态模拟仿真教学系统

随着科技的飞速发展&#xff0c;教学方式也正在经历着巨大的变革。林业经济学元宇宙虚拟教学系统作为一种新兴的教学方式&#xff0c;为学生和教师提供了一个全新的、沉浸式的学习和教学环境。 森林管理和监测 元宇宙技术可以用于森林管理和监测。通过无人机、传感器和虚拟现实…

如何在前端项目中管理依赖关系?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用包管理工具⭐ 使用版本控制系统⭐ 使用依赖管理工具⭐ 使用CDN⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对W…

TCP/UDP

TCP&#xff1a;可靠的有序传输 TCP是一种面向连接的协议&#xff0c;旨在提供可靠、有序的数据传输。它通过以下方式实现这一目标&#xff1a; 1. 连接建立和维护 在使用TCP传输数据之前&#xff0c;必须先建立连接。这个过程包括三次握手&#xff0c;即客户端和服务器之间…

信息学奥赛一本通 2075:【21CSPJ普及组】插入排序(sort) | 洛谷 P7910 [CSP-J 2021] 插入排序

【题目链接】 ybt 2075&#xff1a;【21CSPJ普及组】插入排序&#xff08;sort&#xff09; 洛谷 P7910 [CSP-J 2021] 插入排序 【题目考点】 1. 排序&#xff1a; 插入排序 插入排序示例&#xff1a; #include <bits/stdc.h> using namespace std; int main() {int…

Rust 围炉札记

文章目录 一、安装 一、安装 Rust in Visual Studio Code Rust 官网 windows系统下Rust环境搭建以及vscode调试环境配置 123

Vue - 虚拟DOM的简单理解

目录 虚拟DOM虚拟DOM树生成流程 因为直接操作真实的 DOM 会比较影响效率。所以 vue 使用了 虚拟DOM&#xff08;VNode&#xff09;来描述要渲染的内容。 虚拟DOM 它是一个 js 对象&#xff0c;比如&#xff1a; const vnode {tag: "h1",children: [{ tag: undefi…