首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当我从第一个compbox中选择一个值时,其余compbox的值将发生更改

这个问题涉及到前端开发中的组件交互和状态管理。以下是对这个问题的详细解答:

基础概念

  1. ComboBox(下拉选择框):一种用户界面元素,允许用户从预定义的选项列表中选择一个值。
  2. 状态管理:在前端开发中,状态管理是指如何跟踪和控制应用程序中的数据变化。

相关优势

  • 用户体验:通过联动下拉框,可以简化用户操作流程,提高用户体验。
  • 数据一致性:确保相关组件之间的数据保持一致,减少错误输入的可能性。

类型

  • 单向数据流:数据从父组件流向子组件,子组件通过事件通知父组件状态变化。
  • 双向绑定:数据在组件之间双向流动,常见于表单元素。

应用场景

  • 表单填写:如地址选择,选择国家后自动更新省份和城市选项。
  • 配置管理:在复杂系统中,选择一个配置项可能会影响其他相关配置项。

问题原因

当你从第一个ComboBox中选择一个值时,其余ComboBox的值发生更改,通常是因为这些ComboBox之间存在数据依赖关系。这种依赖关系可能是通过以下方式实现的:

  • 事件监听:第一个ComboBox的选择事件触发了其他ComboBox的更新。
  • 状态共享:所有ComboBox共享同一个状态对象,当一个组件更新状态时,其他组件也会响应变化。

解决方法

假设我们使用React框架来实现这一功能,以下是一个简单的示例代码:

代码语言:txt
复制
import React, { useState } from 'react';

const ComboBox = ({ options, onChange }) => (
  <select onChange={onChange}>
    {options.map(option => (
      <option key={option.value} value={option.value}>
        {option.label}
      </option>
    ))}
  </select>
);

const App = () => {
  const [selectedValue, setSelectedValue] = useState('');
  const [options, setOptions] = useState([
    { value: 'option1', label: 'Option 1' },
    { value: 'option2', label: 'Option 2' },
    { value: 'option3', label: 'Option 3' }
  ]);

  const handleFirstComboBoxChange = (event) => {
    const selected = event.target.value;
    setSelectedValue(selected);
    // 根据选择的值更新其他ComboBox的选项
    if (selected === 'option1') {
      setOptions([
        { value: 'subOption1', label: 'Sub Option 1' },
        { value: 'subOption2', label: 'Sub Option 2' }
      ]);
    } else if (selected === 'option2') {
      setOptions([
        { value: 'subOption3', label: 'Sub Option 3' },
        { value: 'subOption4', label: 'Sub Option 4' }
      ]);
    } else {
      setOptions([
        { value: 'option1', label: 'Option 1' },
        { value: 'option2', label: 'Option 2' },
        { value: 'option3', label: 'Option 3' }
      ]);
    }
  };

  return (
    <div>
      <ComboBox options={options} onChange={handleFirstComboBoxChange} />
      <ComboBox options={options} />
      <ComboBox options={options} />
    </div>
  );
};

export default App;

解释

  1. 状态管理:使用useState钩子来管理选中的值和选项列表。
  2. 事件处理handleFirstComboBoxChange函数在第一个ComboBox的值变化时被调用,根据选择的值更新其他ComboBox的选项。
  3. 组件复用:通过传递不同的options属性,实现多个ComboBox的联动效果。

通过这种方式,可以有效地管理多个ComboBox之间的数据依赖关系,确保用户选择时其他相关组件的值能够正确更新。

相关搜索:当我使用js从select input中选择一个值时,如何更改checkbox的值为什么当我尝试更改特定单元格值时,ndarray中的其他值会发生更改?当我更改另一个数组中的值时,数组中的值会发生变化吗?当我在AutoHotKey中更改comboBox值时,编辑字段中的值将一直更改为默认值为什么当我将它赋值给list的第一个索引时,我的值发生了变化?如何将数组中从最后一个值到第一个值的值相加当我将值写入ComboBox时,SelectedIndexChanged事件不会激发。当我从comboBox.Items列表中选择一个值时,它确实会触发当我从下拉列表中选择一个值来求解网格中的值时,它会覆盖该值当我有某些值从数据库中流出时,如何从VB中选择一个列表框中的多个值?在jquery中从查询字符串中选择一个值将返回多个值。如何选择正确的值如何在选择另一个单元格中的值时更改单元格的值获取dropdown第一个结果的返回值[object Object]。当我选择一个选项并工作时,它会发生变化。如何修复默认结果当我从上一个微调器中选择值时,如何在微调器中获得某个子节点的值?当我尝试将一个对象添加到集合中时,所有对象的值都被更改为当前对象,是如何更改的?当我多次单击该按钮时,数组将获得一个值。我希望它接受函数中的所有值如果单元格值发生更改,则仅将单元格值发生更改列复制到另一个工作表中,但不复制两个工作表中的公共值我们有一个2下拉列表,在选择第一个下拉列表的多个值时具有相同的值,第二个下拉列表中的值是自动选择的如何从我在textbox C# selenium中提供的列表中从第一个到最后一个顺序选择值当我从硬编码的下拉列表中选择值时,它不会拾取值,也不会将值发送到数据库中以编程方式将一个函数中的javascript值从另一个javascript函数更改
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Excel实战技巧111:自动更新的级联组合框

如何克服级联数据验证列表的问题,即一旦第一个列表的值发生更改,其关联的列表就不会自动重置——你将学习一种替代方法来克服自动重置失败的问题(一旦第一个列表的值发生变化,将自动刷新关联的列表) 通过使用组合框表单控件...图5 从图5中可以看到,组合框的选择与单元格K4链接,当我们选择组合框中的下拉列表项时,将会在该单元格中放置所选项在列表中的位置值。 下面,我们来创建级联的组合框。...我们想根据用户从第一个组合框中所做的选择创建一个动态的“App内容”列表,在此,将使用存储第一个组合框的单元格链接(K4)中的值。 图7 使用INDEX函数创建相关App的列表。...图9 设置第二个组合框的源数据区域为N4:N18,单元格链接到M4以存储代表所选项位置的数字。 此时,你可以试试,当你在第一个组合框中选择时,第二个组合框中的列表项也随之发生更改。...注意到,当我们选择不同部门时,由于其对应的App列表长度不同,列表底部会存在空,如下图12所示。 图12 在此,我们通过定义名称来解决。

8.5K20

Excel实战技巧108:动态重置关联的下拉列表

在相互关联的数据验证(即“数据有效性”)列表中常见的问题是:当更改第一个数据验证的值时,与其相关联的数据验证的值会一直保留,直到你激活其下拉列表。这可能会产生误导。...下面将介绍如何在第一个下拉列表中的值发生变化时自动重置与其关联列表的值,这里使用ExcelVBA执行此操作,使用了工作表对象的Change事件过程。...在这种情况下,最好使用工作表对象的Change事件并确保它仅在特定单元格的值发生更改时运行,而不是每次更改任何单元格值时都触发该事件过程。...如下图1所示,我们创建了一个级联列表,当单元格C2中选择不同的分类时,在单元格C6中会出现不同的下拉列表项。例如,在单元格C2中选择“水果”,单元格C6中将显示相关的水果名称,可以从中选择水果名。...End If End Sub 至此,当更改单元格C2中的选择项时,单元格C6中的内容将更新为“请选择…”,如下图4所示。 图4

4.6K20
  • Python 列表操作指南1

    列表项具有索引,第一项的索引为0,第二项的索引为1,依此类推。有序:当我们说列表是有序时,意味着项目有一个定义的顺序,而且该顺序不会改变。...)要更改特定范围内项目的值,请定义一个具有新值的列表,并引用要插入新值的索引范围:示例:使用值 "banana" 和 "cherry" 替换值 "blackcurrant" 和 "watermelon"...,则新项目将插入到您指定的位置,并且其余项目将相应移动:示例,通过用两个新值替换它来更改第二个值:thislist = ["apple", "banana", "cherry"]thislist[1:2...] = ["blackcurrant", "watermelon"]print(thislist)注意:当插入的项目数量与替换的项目数量不匹配时,列表的长度将发生变化。...如果插入的项目数量少于替换的项目数量,则新项目将插入到您指定的位置,并且其余项目将相应移动:示例,通过用一个新值替换第二个和第三个值来更改:thislist = ["apple", "banana",

    18920

    FPGA的调试-在线存储器内容编辑工具(In-system Memory Content Editor)

    这样当我通过In-System Memory Content Editor更新了一个常数值,即更新了ram的读地址。而ram默认写wren使能为低,则为读我更新地址的数值。...Mem Init 注意:该页设置时,需要勾选上红框1 ,表示允许In-System Memory Content Editor独立地去读取和修改RAM中的数据。...加入需要抓取的信号,第一个即是常数值信号。采样时钟就用系统时钟clk。深度为512,其余设置保持默认。 ? (7)再次全编译,完成后将.sof文件通过JTAG下载到FPGA芯片中。...(10)更改数值操作 首先把ram里地址从0x00到0x04 5个地址的值更新为0x01,0x02,0x03,0x04,0x05。 ?...通过JTAG将ram里地址从0x00到0x04存储的值修改成0x01,0x02,0x03,0x04,0x05。 ?

    1.6K10

    Swift入门:类

    您可以将一个类定义为基于另一个类,添加任何您想要的新内容。 当你创建一个类的实例时,它被称为一个对象。如果复制该对象,默认情况下,两个副本都指向同一个数据——更改一个,副本也会更改。...有三种解决方案: 1、使这两个值成为可选字符串; 2、为它们提供默认值; 3、编写自己的初始化器。 第一个选项很笨拙,因为它在我们的代码中引入了不需要的选项。...值与引用 当您复制一个结构体时,整个东西都是重复的,包括它的所有值。这意味着更改结构体的一个副本不会更改其他副本——它们都是单独的。...您可以将它们传递到函数中,或者将它们存储在数组中,在其中进行修改,并将这些更改反映到程序的其余部分中。 如果要避免一个副本不能影响所有其他副本的共享状态,则需要使用结构体。...您可以将它们传递到函数中,或者将它们存储在数组中,在其中进行修改,并且它们不会在引用它们的其他位置发生更改。

    75410

    「微服务架构」Medium的微服务架构实践

    高内聚性 - 每项服务将所有相关行为和数据封装在一起。如果我们需要构建新功能,则所有更改应仅本地化为一个服务。 ?...如果没有高凝聚力,我们将最终得到一个分布式单片系统 - 一组混乱的服务,必须同时进行更改和部署才能构建单一功能。...它的工作方式是让每个服务提供基本信息,例如,要监听的端口,构建/测试/启动服务的命令等,BBFD将负责其余的工作。...当我们从单个服务迁移到具有许多服务的分布式系统时,可能会发生两件事: 我们失去了可观察性,因为它变得更难或更容易被忽视。...如果Node.js是一个很好的技术选项并且现有的实现很好,我们将代码从单片应用程序中删除,并用它创建一个微服务。即使采用相同的实现,我们仍将获得微服务架构的所有好处。

    62421

    添加多个屏幕-创建格线布局

    MultipleScreens02 转场 让我们将这两个View Controller连接在一起。在第一个图标的顶部,Control +从第一个图标(黄色圆圈)拖动到第二个图标的视图。...关闭 Collection View 当我们点击按钮时,我们想要关闭Collection View。转到主故事板,启用Assistant Editor,从按钮创建IBAction。...我们遇到的问题是按钮位于cell中,但操作发生在DialogCollectionView中。我们必须设立委托。委托将允许我们向View Controller发送消息。...在 Cell 文件中,为索引声明一个变量并使其为0.然后,在screenImageButtonTapped的值内,调用索引及其类型Int。因此,它上面的代理将具有相同的值,它将返回一个索引。...cell.index = indexPath.row 返回UIImage 当我们点击按钮时,它将在函数中返回UIImage类型的图像。为ARScreen的图像声明一个新数组。

    2.9K40

    Akka 指南 之「集群规范」

    Failure Detector 故障检测器(failure detector)负责检测一个节点是否无法从集群的其余部分访问。...的“是”或“否”的问题“,它返回一个phi值,表示节点关闭的可能性。 作为计算基础的阙值(threshold)可由用户配置。低阙值容易产生许多错误的怀疑,但可以确保在发生真正的崩溃时快速检测。...在集群中,每个节点都由几个(默认最多 5 个)其他节点监控,当其中任何一个节点检测到无法访问该节点时,信息将通过流言传播到集群的其余部分。...换句话说,只要一个节点需要将一个节点标记为不可访问,则集群的其余部分都将该节点标记为不可访问。 要监视的节点是在散列有序节点环中从相邻节点中挑选出来的。...如果消息接收者和消息的版本相同,则不会发送或请求消息状态。 消息的周期性具有状态更改的良好批处理效果,例如,将几个节点快速地彼此连接到一个节点之后,只会导致一个状态更改传播到集群中的其他成员。

    1.3K20

    React.memo() 和 useMemo() 的用法与区别

    简单来说,memoization 是一个过程,它允许我们缓存递归/昂贵的函数调用的值,以便下次使用相同的参数调用函数时,返回缓存的值而不必重新计算函数。...换句话说,如果组件中的任何值更新,整个组件将重新渲染,包括尚未更改其 values/props 的函数/组件。 让我们看一个发生这种情况的简单示例。...我们将构建一个基本的应用程序,告诉用户哪种酒最适合与它们选择的奶酪搭配。 我们将从设置两个组件开始。第一个组件将允许用户选择奶酪。然后它会显示最适合该奶酪的酒的名称。第二个组件将是第一个组件的子组件。...想象一下,有一个组件显示数以千计的数据,每次用户单击一个按钮时,该组件或树中的每条数据都会在不需要更新时重新渲染。...useMemo() 是一个 React Hook,我们可以使用它在组件中包装函数。我们可以使用它来确保该函数中的值仅在其依赖项之一发生变化时才重新计算。

    2.7K10

    价值1500€的逻辑漏洞挖掘思路分享

    1 绕过前端校验更改地址 当我访问学生个人资料的页面时发现没有权限更改学生的地址等信息,但是Save按钮是处于活动状态,但是点击后并不会发生任何改变,因为所有表单字段已经被锁定。...例如姓名和地址等信息,但是当我们单击编辑按钮时,只能更改联系人字段。 当我以这种方式发送请求时,我遇到了以下 PUT 请求。 如图所示,还有其他字段无法更改如名称、地址等。...但当我发送编辑联系人表的请求时,更改参数中的所有 ID 值,就能够创建新的联系人表。 图片中的请求与第二个报告中的 PUT 请求相同。...当我们尝试将居住地址更改为官方地址时,应用程序将抛出错误,并且我们的请求将无法完成。 我记得第一个报告中的保存按钮对于地址仍然有效。因此,我编辑了一个住宅地址,发送并遇到了以下请求。...我将“postalTitle”参数更改为官方参数。(同样,我可以将其更改为官方地址的住宅。) 在应用程序中,只有一个地址可以是官方地址,但您可以看到两个地址都已更改为主地址。

    1.2K20

    约束编程示例【Programming】

    当一个值发生更改时,该特定连接器将更改通知其所有连接的节点。反过来,节点满足约束,计算新值,并通过“请求”它们设置一个新值,将它们传播到系统中的其他连接器。...当所有连接器都链接到由约束定义的节点时,系统已完全设置并准备好在四个连接器中的任何一个上获取值。 设置完成后,系统会自动计算并设置其余连接器上的值。...如果第一个连接器上有更新,则将调用第一个函数来计算另一个连接器(变量)的值。 如果第二个连接器的值更改,也会发生相同的情况。...,为另一个连接器计算新值,依此类推,直到整个系统发生更改。...如果你发现自己面对的是一个似乎很难在代码中可靠地解决的问题,试着从另一个角度来看待它。 如果最好的角度是约束编程,那么你现在就有了一个如何实现它的例子。

    2.5K00

    从Jupyter Notebook切换到Script的5个理由

    使用脚本可以帮助我实现Jupyter Notebook的缺点 ? 动机 与大多数人一样,我开始学习数据科学时使用的第一个工具是Jupyter Notebook。...当我们输入“ Shift + Enter”时,我们将立即看到代码的结果,这使我们很容易确定我们的代码是否有效。...这些是我在使用脚本时发现的好处: 有组织的 Jupyter Notebook中的单元格使得很难将代码组织成不同的部分。使用脚本,我们可以创建几个小函数,每个函数指定代码的功能,如下所示 ?...更好的是,如果可以将这些函数归为同一类,例如处理数据的函数,我们可以将它们归为同一类! ? 每当我们要处理数据时,我们都知道该类中的函数Preprocess可用于此目的。...这样可以避免我们浪费时间跟踪代码中的特定变量以更改其值。

    1.2K20

    【19】进大厂必须掌握的面试题-50个React面试

    当我们需要DOM测量或向组件添加方法时,它们会派上用场。...以下是应使用ref的情况: 当您需要管理焦点时,选择文本或媒体播放 触发命令式动画 与第三方DOM库集成 27.如何在React中模块化代码?...这对于初始渲染非常有用,并在优化应用程序性能时提供了更好的用户体验。 开发人员工具–从操作到状态更改,开发人员可以实时跟踪应用程序中发生的所有事情。...当您只想显示几个定义的路径中要渲染的单个路径时,可以使用 “ switch”关键字 。所述 标签在使用时匹配以在顺序次序中的定义的路由类型化URL。找到第一个匹配项后,它将呈现指定的路线。...从而绕过其余 路线。 48.为什么我们在React中需要一个Router?

    11.2K30

    Unity可编程渲染管线系列(九)烘焙阴影(混合光照)

    我们现在将使用常规模式,这是在项目设置下找到的质量设置。 ? (Shadowmask 模式) 现在,在检查烘焙的光照贴图时,你可以从右上角的下拉菜单中选择“Baked Shadowmask”。...向MyPipeline添加一个着色器标识符和向量数组。 ? 有四个可能的遮罩,我们可以在静态数组中预定义它们。但是也有可能某些灯光不使用阴影遮罩。通过将第一个遮罩分量设置为-1来标识。...仅当我们拥有有效的烘焙数据时,才将实时阴影和烘焙阴影混合在一起。 ? 在LitPassFragment中添加所需的light index参数。 ? ?...将颜色添加到阴影缓冲区。 ? 在SubtractiveLighting中,采用减去的光照和阴影颜色中的最大值,以限制移除的光量。但这可能使烘焙的照明变亮,它应该永远不会发生。...当忽略实时阴影时会发生这种情况,因为没有一个最终会落在阴影距离之内。在那种情况下,我们可以直接返回烘焙阴影衰减就足够了。但是因为没有单独的主光源,所以我们必须检查是否正在处理第一个光源索引。 ?

    2.9K10

    是时候系统学习一下Vue3在Web前端中的用法了!

    此外,我们从 setup 返回的所有内容都将暴露给组件的其余部分 (计算属性、方法、生命周期钩子等等) 以及组件的模板。...} // 组件的“其余部分” } 现在让我们从提取第一个逻辑关注点开始 (在原始代码段中标记为“1”)。...现在,每当我们调用 getUserRepositories 时,repositories 都将发生变化,视图将更新以反映更改。...剩下的就是在 mounted 钩子中调用 getUserRepositories,并设置一个监听器,以便在 user prop 发生变化时执行此操作。...这是为了确保我们的侦听器能够对 user prop 所做的更改做出反应。 有了这些变化,我们就把第一个逻辑关注点移到了一个地方。

    2.1K10

    利用SIMD指令加速向量搜索

    当我们在支持 AVX 512 的 CPU 上运行此代码时,我们看到 HotSpot C2 编译器发出 AVX 512 指令。...下面的代码片段包含主循环体,其中rcx和rdx寄存器保存指向第一个和第二个浮点数组的地址。...首先,我们看到一条vmovdqu32指令,该指令将 512 位打包双字值从内存位置加载到zmm0寄存器中,即从偏移量到第一个 float[] 的 16 个值。...第三,我们看到vaddps将zmm0中的 16 个打包单精度浮点值与zmm4相加,并将打包单精度浮点结果存储在zmm4中- zmm4是我们的循环累加器。最后,有一个小的计算来递增并检查循环计数器。...Lucene 仍然保留了这些低级底层操作的标量实现版本。实现的版本可在启动时选择(请参见Lucene更改日志)。

    2.1K10

    SAP最佳业务实践:使用看板的生产制造(233)-6经典看板:使用数量信号及触发点的内部生产(重复制造)

    系统将从实际看板数量中减去每个提取数量,当看板数量为零时,系统会自动将看板状态设置为空。 第一次从看板中提取数量时,系统会将状态设置为使用中。当看板完全为空时,状态将被设置为空,并将触发补货。...将物料 S233-2 的一个看板设置为空。要执行此操作,请选择一个看板 ( ? ),然后选择为空。 ? 看板状态将设置为 空 ( ? )。计划订单已创建。...选择后退返回至看板:需求源视图从--:-- 时间 屏幕,通过选择所有看板并选择 为空,将其余所有实际状态为 等待 的看板设置为空。 ? 将可用看板设置为 空 会生成物料 S233-2 的计划订单。...5、PK22从状态发生变化的看板中提取 在此活动中,您将针对某看板进行部分提取。只要容器不为空,这些确认便与库存不相关。因为使用了触发点,所以当第一个容器为空时,状态将设置为 等待。...使用事务 PK22 从看板中进行部分提取不会引起库存相关的登记。此事务仅与供应控制相关。只有看板状态更改为空 时才会进行状态更改和登记。

    1.9K50

    Unity基础教程系列(八)——更多工厂(Where Shapes Come From)

    1.2 复合胶囊体 通过组合三个旋转的胶囊可以制成更复杂的形状。从默认胶囊开始,然后给它两个子胶囊。将子节点旋转90°,一个围绕其X轴旋转,另一个围绕其Z轴旋转。...当我们配置一个新生成的形状时,我们不需要统一的颜色,而是为每个颜色索引选择一个随机的颜色。 ? ? ? (不一致颜色的形状) 每个形状是否可以使用相同的色调?...发生这种情况时,颜色量会发生变化,但是旧的保存文件中存储的颜色数保持不变。这将导致不匹配,从而导致加载失败。为避免这种情况,我们可以像保存形状列表一样,通过存储保存的颜色数量来使保存格式。 ?...生成时,我们将随机选择其中一个工厂。 ? (生成区的工厂配置) 你还可以不止一次包含一个工厂。这使得它更有可能被选择。...我们可以通过检查第一个ID是否设置正确来避免这种情况。 ? 保存形状时,我们现在还必须保存其原始工厂的ID。由于选择工厂是创建形状的第一步,因此也使它成为我们为每个形状写入的第一件事。 ?

    1.4K10

    Unity Demo教程系列——Unity塔防游戏(三)塔(Shooting Enemies)

    敌方预制件的其余部分可以在其他层上,但是最好保持一致,将整个预制件放置在enemy层上。如果你要更改根对象的层,则可以选择更改其所有子对象。 ?...可以通过使用OR运算符将两个方法调用都放入if校验中来完成此操作,因为如果第一个操作数的结果为true,则不会对第二个操作数求值,因此将跳过其调用。AND运算符的行为类似。 ? ?...OverlapCapsuleNonAlloc不是数组,返回发生的命中次数(达到允许的最大值),我们必须检查这个而不是数组的长度。 ? 3 射击敌人 现在我们有了一个有效的目标,该射击它了。...为了支持敌人可以遭受伤害,请添加一个公共ApplyDamage方法,该方法将从运行状况中减去其参数。我们假设损害不是负的,所以需要断言。 ? 当敌人的生命值达到零时,我们不会立即销毁它。...这可能不足以让所有的潜在目标进入一个非常拥挤的游戏面板,但应该给我们足够的空间来改进目标行为。 ? 现在,不再总是选择第一个潜在目标,而是从数组中选择一个随机元素。 ? ?

    2.5K20

    送你43道JavaScript面试题

    由于第一个循环中的变量i是使用var关键字声明的,因此该值是全局的。在循环期间,我们每次使用一元运算符++都会将i的值增加1。因此在第一个例子中,当调用setTimeout函数时,i已经被赋值为3。...当我们使用方括号表示法时,它会看到第一个左括号[,然后继续,直到找到右括号]。只有在那个时候,它才会对这个语句求值。...首先,变量c为对象保存一个值。之后,我们将d指定为c与对象相同的引用。 ? 更改一个对象时,可以更改所有对象。 ---- 7. 下面代码的输出是什么?...其余参数获取传递到模板字符串中的表达式的值! ---- 17. 下面代码的输出是什么?...foo从堆栈弹出,baz被调用,并打印Third。 ? WebAPI不能只是在准备就绪时将内容添加到堆栈中。相反,它将回调函数推送到一个称为任务队列的东西。 ? 这是事件循环开始工作的地方。

    1.5K10
    领券