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

我怎么才能让我的React应用程序只在一个昂贵的计算完成时渲染?

要使React应用程序在只有昂贵计算完成时进行渲染,你可以使用React的懒加载(lazy loading)和代码分割(code splitting)特性。这些特性使你能够按需加载组件和模块,从而优化应用程序的性能并减少不必要的计算和渲染。

首先,你可以使用React的Suspense组件和React.lazy函数来实现懒加载。通过将组件包装在React.lazy函数中并传入一个返回Promise的函数,你可以在需要时按需加载该组件。例如,假设你有一个昂贵计算的组件叫ExpensiveComponent,你可以这样懒加载它:

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

const ExpensiveComponent = React.lazy(() => import('./ExpensiveComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <ExpensiveComponent />
      </Suspense>
    </div>
  );
}

export default App;

在上面的例子中,当ExpensiveComponent被渲染时,React.lazy会异步加载该组件的代码。fallback prop指定在组件加载过程中显示的加载指示器。

其次,你可以使用React的代码分割功能将React组件和JavaScript模块按需加载到不同的文件中。通过将应用程序的代码拆分为较小的块,只有在需要时才加载这些块,你可以减少应用程序的初始加载时间并提高性能。例如,你可以使用React Router的动态导入(dynamic import)来实现代码分割:

代码语言:txt
复制
import React, { Suspense } from 'react';
import { BrowserRouter as Router, Route, Switch } from 'react-router-dom';

const HomePage = React.lazy(() => import('./HomePage'));
const AboutPage = React.lazy(() => import('./AboutPage'));
const ContactPage = React.lazy(() => import('./ContactPage'));

function App() {
  return (
    <Router>
      <div>
        <Suspense fallback={<div>Loading...</div>}>
          <Switch>
            <Route exact path="/" component={HomePage} />
            <Route path="/about" component={AboutPage} />
            <Route path="/contact" component={ContactPage} />
          </Switch>
        </Suspense>
      </div>
    </Router>
  );
}

export default App;

在上面的例子中,HomePage、AboutPage和ContactPage组件会在用户浏览到相应的路由路径时按需加载。

总结起来,要使React应用程序在只有昂贵计算完成时渲染,你可以使用React的懒加载和代码分割特性。这样,你可以根据需要按需加载组件和模块,提高应用程序的性能和用户体验。

腾讯云提供的相关产品和服务包括:

  1. 云函数(Serverless):腾讯云云函数是一种事件驱动的无服务器计算服务,能够帮助你在不需要管理服务器的情况下运行代码。你可以使用云函数来执行昂贵的计算任务,并根据需要触发执行。了解更多信息,请访问云函数
  2. 弹性容器实例(Elastic Container Instance,简称 ECI):腾讯云弹性容器实例是一种无需管理基础设施的高性能容器实例服务。你可以在ECI中运行容器化的应用程序,并根据需要调整计算资源的配置。通过将昂贵计算的应用程序容器化并在ECI中运行,可以更好地利用计算资源并提高性能。了解更多信息,请访问弹性容器实例

请注意,以上只是腾讯云提供的一些相关产品和服务,你可以根据实际需求选择合适的产品和服务。

相关搜索:我怎么才能让片段只在我在的时候开始呢?React :可能只在一个状态渲染完成时才执行另一个状态渲染吗?我怎么才能让我的黑暗模式在全屏时工作?为什么我的计时器只在达到1时才更新我怎么才能让一个while true循环只在程序关闭或崩溃时才重新启动程序/minecraft服务器?HTML:我怎么能让弹出窗口只在特定的操作系统上显示?为什么我的React组件在使用React-Router时不能渲染?React -在初始加载时,我的状态数组只保存最后一个元素为什么我的应用程序在状态改变时不能渲染?当我改变状态时,为什么我的React应用程序不能重新渲染?为什么我的clear按钮只在验证为真时才清除文本框?当我的TableData react组件只在我的表下发布一个onClick时,我该如何让它可重用呢?为什么我的GTK CSS按钮颜色只有在我的应用程序未被选中时才起作用?我怎么做才能让很多元素在悬停时做同样的事情?我怎么才能让命令只在不一致的服务器上工作呢?为什么我的React应用程序菜单在我只更改状态而不使用任何CSS时打开?我在我的应用程序中使用了导航,我如何启动一个片段,当它完成时我会得到一个结果?在我的React应用程序中使用@emotion/core时出错为什么我的react应用程序在我单击链接时不能导航到页面?我在哪里放置一个只在我的片段的Firebase实时数据库中有更改时才触发的addValueEventListener?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

探究React的渲染

最终,一旦React完成了对新state的计算,它就会发现新状态1与快照中的状态0不同。一旦理解了渲染的工作原理,这类问题很容易理解。但在看了上一个例子后,可能会有一个问题。...React只在考虑到事件处理程序内部的每个更新器函数后才重新渲染,这意味着React有某种内部算法用来计算新的状态。React把这种算法称为 “批处理”。这个概念很容易理解。...就是说React对每个事件处理程序只重新渲染一次,即使该事件处理程序包含多个状态的更新。这是另一个例子,说明React只有在绝对必要时才会重新渲染一个组件。...要知道,我们不能只是假设一个组件只在其props改变时才重新渲染。...第三,如果你确实有一个昂贵的组件,并且你想让这个组件选择脱离这个默认行为,只在其props改变时重新渲染,你可以使用React的React.memo高阶组件。

17930

深入了解 useMemo 和 useCallback

这意味着当用户尝试做其他事情时,应用程序可能会感到迟缓,特别是在低端设备上。 但如果我们可以“跳过”这些计算呢?如果我们已经有了一个给定数字的质数列表,为什么不重用这个值而不是每次都从头计算呢?...这里有一个视角转换:之前,我们在记忆一个特定计算的结果,计算质数。然而,在本例中,我记住了整个组件。无论哪种方式,只有当用户选择一个新的 selectedNum 时,昂贵的计算才会重新运行。...这意味着它应该只在它的props改变时重新渲染。然而,每当用户更改其名称时,Boxes 也会重新呈现。 为什么我们的 React.memo() 没有保护我们?...我想如果我们先不谈 React,只谈普通的 JavaScript,会很有帮助。...在我个人看来,将每个对象/数组/函数包装在这些钩子中是浪费时间。在大多数情况下,好处是可以忽略不计的;React 是高度优化的,重新渲染通常不像我们通常认为的那样缓慢或昂贵!

9.1K30
  • 成为一名高级 React 需要具备哪些习惯,他们都习以为常

    你可以在状态中存储两个数组,一个数组包含所有的待办事项,另一个数组只包含完成的任务: const [todos, setTodos] = useState([]) const [completedTodos...完成的待办事项被存储在状态中两次,所以如果用户编辑待办事项的文本内容,你只调用setTodos, completedTodos现在包含旧的文本,这是不正确的! 有一些方法可以去复制你的状态。...未充分使用 React.memo, useMemo 和 useCallback 在许多情况下,React支持的用户界面可能会变得滞后,特别是当你将频繁的状态更新与渲染成本昂贵的组件(React Select...在对抗糟糕的渲染性能时,你最强大的武器是React.memo,它只在组件的道具更改时才重新呈现组件。这里的挑战是确保道具不会在每次渲染中改变,在这种情况下React。备忘录不起作用。...只有在真正需要时才使用服务器渲染 服务器端呈现(SSR)是React最酷的功能之一。它还增加了应用程序的大量复杂性。

    4.7K40

    React 项目性能分析及优化

    性能优化不是一个简单的事情,但在 95% 以上的 React 项目中,是不需要考虑的,按自己的想法奔放的使用就可以了。 我认为性能优化最好的时候是项目启动时。...React Profiler React.Profiler 是 React 提供的,分析组件渲染次数、开始时间及耗时的一个 API,你可以在官网找到它的文档(https://zh-hans.reactjs.org...善用 React.useMemo React.useMemo 是 React 内置 Hooks 之一,主要为了解决函数组件在频繁 render 时,无差别频繁触发无用的昂贵计算 ,一般会作为性能优化的手段之一...React.useMemo 就是为了解决这个问题诞生的,它可以指定只有当 start 变化时,才允许重新计算新的 result 。...有几点关于 Context 的建议: Context 只放置必要的,关键的,被大多数组件所共享的状态。 对非常昂贵的组件,建议在父级获取 Context 数据,通过 props 传递进来。

    1.9K20

    你真的应该使用useMemo 吗? 让我们一起来看看

    react 官方是怎么介绍useMemo的? 我们咋一看一下 的 React 文档,关于 useMemo,它在应该使用它的时候并没有被提及。他们只是简单地提到它的作用和使用方法。...在所有情况下,为了建立备忘缓存并存储值,我预计在初始呈现期间会有大约5-10% 的开销。当 n 时,我期望看到 useMemo 的性能下降。...随后的渲染仍然很慢,因为通过 useMemo 缓存的开销比重新计算实际值的开销更大。 总之,对于复杂度 n = 1,不使用 useMemo 总是更快,因为开销总是比性能增益更昂贵。...总之,使用 useMemo 的初始渲染更加昂贵,但是随后的重新渲染会有更大的性能提升。如果您的应用程序的数据/处理复杂度大于5000并且有一些重新渲染,我们可以看到使用 useMemo 的好处。...对于使用 useMemo 缓存实际计算的情况,其主要目标不是避免在子组件中重新渲染: 当处理量很大时,应该使用 useMemo 从什么时候 useMemo 变得有用以避免额外处理,阈值在很大程度上取决于您的应用程序

    1.2K30

    来来来,尝试一下 React 18 !

    这个版本主要是增强 React 应用程序的 并发渲染 能力,你可以在 React 18 中尝试体验以下几个新特性: 新的 ReactDOM.createRoot() API(替换 ReactDOM.render...> 组件) 这不,这个版本才刚刚发布社区里已经有很多小伙伴已经跃跃欲试了,我也迫不及待跟着社区的大佬们一起尝试了一下。...渲染的自动批处理 React 有一道经典面试题,setState 到底是同步的还是异步的,我面试的时候也会经常问,具体的我在两年前的一篇文章中有介绍过: 由实际问题探究setState的执行机制 class...SSR 下的懒加载支持 React.lazy 函数能让你像渲染常规组件一样处理动态引入组件。React.lazy 接受一个函数,这个函数需要动态调用 import()。...一旦 组件加载完成后,React 会才将其发送到浏览器,替换 组件。

    1.4K20

    什么时候使用 useMemo 和 useCallback

    它通过接受一个返回值的函数来实现这一点,然后只在需要检索值时调用该函数(通常这只有在每次渲染中依赖项数组中的元素发生变化时才会发生一次)。...actually uses Object.is, but it's very similar to === 我不打算深入研究这个问题,但是当你在React函数组件中定义一个对象时,它跟上次定义的相同对象...在React中,有两种情况下引用相等很重要,让我们一个个地来看。 依赖列表 让我们来回顾一个例子。 “警告,你将看到一些人为故意设计的代码。请不要吹毛求疵,只关注概念,谢谢。...正如我们上面所说的那样,一直保持正确是一件很困难的事情,所以你可能无法获得任何好处。 昂贵的计算 这是 useMemo 内置于 React 的另一个原因(注意这个不适用于 useCallback)。...{primes} } 可以这样做的原因是,即使你在每次渲染时定义了计算素数的函数(非常快),React只在需要值时才调用该函数。

    2.5K30

    基础 | React怎么判断什么时候该重新渲染组件?

    前端爱好者的知识盛宴 React因为他的性能而著名。因为他有一个虚拟DOM层并且只有在需要时才更新真实DOM。即使是同样地信息这也比一直直接更新DOM要快很多。...你可以在CodePen点击预览里查看这个例子的实际版本。 好吧,但是每次都重新渲染没有什么帮助。 我的意思是,我非常感谢React的细心谨慎。如果状态改变但是组件没有正确渲染的话更糟。...权衡之下,每次都重新渲染绝对是一个安全的选择。 但是重新渲染的时间成本看起来非常昂贵(例子里非常夸张地表现了出来)。 是的,在不必要的时候重新渲染会浪费循环并且不是一个好的想好。...额外内容:简单性能测试 编写并且在shouldComponentUpdate方法中运行计算的时间成本可能会很昂贵,所以你需要确保值得做。...使用React的性能工具去发现浪费的周期: 哪一个组件浪费了很多渲染周期?你怎么通过shouldComponentUpdate方法让他们更智能?试着使用性能测试工具来比较他们的性能。

    2.9K10

    React Hooks - 缓存记忆

    React Hooks几乎在所有方面都能让我们在编程中获得好处。但是某些时候的性能问题,也需要使用一些技巧来解决。我们可以使用Hooks编写快速的应用程序,但是在动手之前需要注意一两件事。...在大多数情况下,React速度非常快。如果您的应用程序足够快并且没有任何性能问题,那么本文不适合您。解决"虚幻"的性能问题是一件实用的事情,在开始优化之前,请先熟悉React Profiler。 ?...useCallback 幸运的是,React为此有两个内置的钩子:useMemo和useCallback。useMemo用于昂贵的计算,useCallback用于传递优化的子组件所需的回调。...每次按inc时都会调用renderList。useCallback的默认行为是在传递新的函数实例时计算新值。...我建议的经验法则是,对于只在组件内部使用的数据,主要使用useState;对于需要在父级和子级之间进行双向数据交换,则useReducer是一个更好的选择。

    3.6K10

    React 19 差点拖慢整个互联网!核心团队紧急叫停

    就是说,我们尝试渲染第一个组件时,它会挂起且直到其数据获取完毕并渲染完成后,下一个兄弟组件才会开始处理。之后再次挂起,依此类推。...这些组件不再并行获取,所以加载时间会是现在两次获取的总和,而非只取二者中的大者。考虑到后者开放时间更早,所以应用也更为广泛。“这无疑是一次重大的倒退。” React 核心团队怎么想的?...Suspense 是 React 中的一个组件,用于显示回退直到其子组件完成加载——这要么是因为这些子组件采取延迟加载,要么是因为它们在使用由 Suspense 实现的数据获取机制。...在配合 React.lazy 使用时,当首次尝试渲染延迟加载的组件时(即在延迟加载之前),其会触发 Suspense 边界(即包裹组件的 Suspense)并渲染回退,直到负责获取组件的代码执行完成,接下来再渲染组件本身...长久以来,React 核心团队一直承诺在客户端上为 Suspense 提供官方数据获取支持(在使用 RSC 时,此支持已经在服务器端实现),但直到现在才真正实现。

    48010

    SPA和React: 并不总是需要服务器端渲染

    当您导航到一个新的路由时,React接管并使用客户端HTTP请求获取的HTML和(通常是)数据来“激活”“页面”。 什么是SSR? 与SPA不同,服务器端渲染的应用程序确实有页面。...SPA存在的问题 反复出现的一个问题是“spinner-geddon”;每次您导航到一个新的“页面”时,都会显示一个加载动画来指示正在请求数据,只有在HTTP请求成功完成后,页面才会用内容进行渲染。...对SEO(搜索引擎优化)来说,SPA也不是很好,因为就谷歌而言,页面是空的。当谷歌爬行一个网页时,它不会等待HTTP请求完成,它只看页面中的内容/HTML,如果没有HTML那么谷歌如何给页面排名?...Margaret, Celia和Evelyn非常喜欢它,她们不介意偶尔出现的加载动画-因为该应用程序为她们解决了一个问题。它还为公司解决了一个问题: 不再需要昂贵的软件许可。据我所知,它至今仍在使用。...浏览器需要这个巨大的JavaScript文件来运行应用程序。 每当保存一个文件时(在开发过程中会发生数十万次),打包就会发生。

    15510

    【译】你真的应该使用useMemo吗? 让我们一起来看看

    这是一个非常好的问题。在本文中,我将使用一种科学的方法,先定义一个假设,并在 React 中对其进行测试。 请继续阅读,了解 useMemo 对性能的影响。 什么是 useMemo?...当 n 时,我预计使用 useMemo 的性能下降。对于 n > 1000,使用 useMemo 我预计重新渲染有更好的性能,但初始渲染应该仍然略慢,因为需要额外的缓存算法。...随后的渲染仍然很慢,因为通过 useMemo 缓存的开销比重新计算实际的开销更大。 总之,对于复杂度 n = 1,不使用 useMemo 总是更快,因为缓存计算总是比性能增益更昂贵。...总之,使用 useMemo 的初始渲染更加昂贵,但是随后的重新渲染会有更大的性能提升。如果您的应用程序的数据/处理复杂度大于 5000 并且有一些重新渲染,我们可以看到使用 useMemo 的好处。...对于使用 useMemo 缓存的作用,其主要目标不是避免在子组件中重新渲染: 当处理量很大时,应该使用 useMemo 从什么时候 useMemo 来避免额外处理,阈值在很大程度上取决于您的应用程序 数据在处理非常低的情况下使用

    2.1K10

    优化 React APP 的 10 种方法

    如何优化性能以提供出色的用户体验。 在开发任何软件(尤其是Web应用程序)时,优化是每个开发人员考虑的第一件事。像Angular,React等其他JS框架都包含了一些很棒的配置和功能。...该函数占用大量CPU,我们将看到在每次重新渲染时都会调用该函数,React将不得不等待其完成才能运行其余的重新渲染算法。...在同一线程上运行一个长进程将严重影响UI呈现代码,因此最好的选择是将进程移至另一个线程。这是由Web工作人员完成的。它们是我们可以在其中创建线程并与主线程并行运行而不妨碍UI流程的网关。...现在,在这里我们将其移至Web worker,我们的主线程将与web worker线程并行运行,同时将计算1M元素数组的总和。完成后将传达结果,并且主线程将仅呈现结果。快速,简单和高性能。...这里引用我之前博客的内容: React.lazy是Reactv16.6发布时添加到React的新功能,它为延迟加载和代码拆分React组件提供了一种简单明了的方法。

    33.9K20

    为什么Vue(默认情况下)比React性能更好

    它将在应用程序的每次状态更新时重新渲染所有静态元素。 再来看看 Vue 中是怎么做的: 图片 可能看起来有些复杂,但这里注意一下 hoisted_1 变量和 setup 方法。...当我们在文本输入中输入 "TEST "时,React 应用程序的控制台: 图片 我们可以看到,MyFruits组件被渲染了五次。...在父组件的第一次渲染时一次 在输入中每按一次键,就有四次(test 的个数)。 再来看看 Vue 的情况: 图片 MyFruits 组件只渲染了一次。...可以通过下面的代码来完成: 图片 然而,这需要额外的代码来达到相同的性能。 测试 3:计算属性 在Vue中,一个计算属性是一个将根据其他属性而被重新计算粜的的值。...例如,一个 hashed password 只有在 password 被改变时才会被重新计算。 在 React 中: 图片 每次渲染时都会调用 hash 。

    64820

    React性能优化的8种方式了解一下

    react凭借virtual DOM和diff算法拥有高效的性能,除此之外也有很多其他的方法和技巧可以进一步提升react性能,在本文中我将列举出可有效提升react性能的几种方法,帮助我们改进react...缓存大量的计算 有时渲染是不可避免的,但如果您的组件是一个功能组件,重新渲染会导致每次都调用大型计算函数,这是非常消耗性能的,我们可以使用新的useMemo钩子来“记忆”这个计算函数的计算结果。...这样只有传入的参数发生变化后,该计算函数才会重新调用计算新的结果。 通过这种方式,您可以使用从先前渲染计算的结果来挽救昂贵的计算耗时。...当然,有时内联匿名函数是最简单的方法,实际上并不会导致应用程序出现性能问题。这可能是因为在一个非常“轻量级”的组件上使用它,或者因为父组件实际上必须在每次props更改时重新渲染其所有内容。...因此,如果您的初始渲染感觉相当粗糙,则可以在初始安装完成后通过在需要时加载组件来减少加载的组件数量。同时,这将允许用户更快地加载您的平台/应用程序。

    1.5K40

    性能优化之关键渲染路径

    相反,可以为一个button添加一个事件监听,只有在用户点击按钮时才加载脚本。 使用Webpack来完成懒加载功能。 这里有一些利用纯JavaScript实现懒加载的技术。...脚本的执行只发生在渲染完成之后。 Defer 可以使你的JavaScript资源绝对不会阻断渲染 ...执行脚本之前,能看到的内容......当有太多的预载文件时,使用预载的固有优先权将受到影响。 「只有在首屏页面需要的文件才可以预载」。 预载文件会在其他文件被渲染时才会被发现。例如,你在一个CSS文件内添加一个字体的引用。...在HTTP响应头中给内容提供过期信息,只有在它们过期时才加载。 HTTP缓存 我们之前在网络拾遗之Http缓存就介绍过,关于http缓存的知识点,我就直接拿来主义了。...Suspense 的作用是在懒加载的组件被加载时,为应用程序提供一个「后备内容」。后备内容可以是任何东西,比如一个,或者一条消息,告诉用户为什么页面还没有被画出来。

    1.2K20

    我是怎样克服对 React 的恐惧,然后爱上 React 的

    如果你在两个月前问我对React的看法,我很可能这样说: 我的模板在哪里?javascript中的HTML在做些什么疯狂的事情?JSX开起来非常奇怪!快向它开火,消灭它吧! ?...那是因为我没有理解它. 我发誓,React 无疑是在正确的轨道上, 请听我道来. Good old MVC 在一个交互式应用程序一切罪恶的根源是管理状态。“传统”的方式是MVC架构,或者一些变体。...文档时这么描述的: ? 但是… 视图应该直接通模型打交道么? 这样它们不久紧紧的耦合起来了么? 不管怎么样,我们还是来义务地看看Hello World示例吧: ?...不会有状态发生丢失的! 比对虚拟 DOM 开销一点也不昂贵,因此我们想怎么比对都可以。当其准备好要对 DOM 进行实际的修改时,它只会进行最少量的操作。没有额外的拖慢布局之虞!...它提出了一个实在是太大了点的模式转变,这总有点令人不舒服。不过,当你开始使用它时其优势会变得清楚起来。 React 文档很优秀. 你应该照着教程对其进行一下尝试。

    96320

    【译】改善React应用性能的5个建议

    1.使用 memo 和 PureComponent 考虑下面这个简单的 React 应用程序,您是否认为当 props.propA 更改值时 会重新渲染?...React 的作者意识到这并不是一个理想的结果,在重新渲染前简单地比较新旧 props 可以获得一些简单的性能提升…这就是 React.memo 和 React.PureComponent 的设计初衷!...现在,仅在 propB 实际更改值时才重新渲染,而不管其父级重新渲染多少次! PureComponent 让我们看看 PureComponent。...这会导致 JavaScript 在每次重新渲染此组件时重新分配新的内存,而不是在使用“命名函数”时分配的内存: import React, { useCallback } from "react";...使用 React.lazyand 和 React.Suspense 让 React 应用程序快速运行的一部分可以通过代码拆分来完成。

    1.4K10

    React虚拟DOM详解:优化性能的利器

    创建虚拟DOM树当React组件被渲染时,它会生成一个虚拟DOM树。这个虚拟DOM树是一个JavaScript对象树,它的结构与实际的DOM树相同。...React将虚拟DOM树与上一次渲染的虚拟DOM树进行比较当React组件的状态发生变化时,React会生成一个新的虚拟DOM树,并将它与之前的虚拟DOM树进行比较。...例如,假设需要将一个列表中的元素进行排序。如果直接操作实际的DOM树,需要重新计算和布局所有的元素,这是非常昂贵的。...如果使用虚拟DOM,可以只计算需要更新的部分,并将这些部分更新到实际的DOM树中,从而提高性能。2. 使用key属性在渲染列表时,应该为每个元素指定一个唯一的key属性。...例如,假设需要渲染一个列表: Apple Banana Cherry如果需要将列表中的元素进行排序,可以使用虚拟DOM来计算需要更新的部分

    56621

    社招前端一面react面试题汇总

    当state改变时,组件通过重新渲染来响应:// 正确做法This.setState({message: ‘Hello World’});react 的渲染过程中,兄弟节点之间是怎么处理的?...,而是给react用的,大概的作用就是给每一个reactNode添加一个身份标识,方便react进行识别,在重渲染过程中,如果key一样,若组件属性有所变化,则react只更新组件对应的属性;没有变化则不更新...最终更新只产生一次组件及其子组件的重新渲染,这对于大型应用程序中的性能提升至关重要。...如果计算的代价比较昂贵,也可以传一个函数给 useState。...例如,当从 /a 导航至 /b 时,会使用默认的 confirm 函数弹出一个提示,用户点击确定后才进行导航,否则不做任何处理;// 这是默认的确认函数const getConfirmation = (

    3K20
    领券