React useContext() 性能,自定义钩子内的 useContext

2023-11-24

我使用了一个结构反应钩子。它是基于全球Context包含减速器的组合(如 Redux 中)。 另外,我广泛使用定制挂钩来分离逻辑。 我有一个包含异步 API 请求的钩子,它变得相当麻烦,我有机会将该钩子的几乎每个函数拆分为其他钩子,但每个函数都使用全局上下文(更准确地说 - 从 useReducer() 调度)。

那么,问题:

  1. 在每个需要它的钩子中使用 useContext() 可以吗?
  2. 例如,如果我创建 10 个在内部使用 useContext() 的自定义挂钩并在组件中使用它们,它将如何影响性能。

Example:

供应商/Store.js

import React, { createContext, useReducer } from 'react';

export const StoreContext = createContext();

export const StoreProvider = ({ children }) => {
  /**
   * Store that contains combined reducers.
   */
  const store = useReducer(rootReducer, initialState);

  return (
    <StoreContext.Provider value={store}>{children}</StoreContext.Provider>
  );
};

钩子/useStore.js

import { useContext } from 'react';
import { StoreContext } from '../providers';

export const useStore = () => useContext(StoreContext);

钩子/useFoo.js

import { useCallback } from 'react';
import { useStore } from './useStore';

export const useFoo = () => {
  const [, dispatch] = useStore();

  const doFoo = useCallback(
    async params => {
      dispatch(actions.request());

      try {
        const res = await SomeService.getSomething(params);
        dispatch(actions.add(res));
        dispatch(actions.success());
      } catch (error) {
        dispatch(actions.failure());
      }
    },
    [dispatch]
  );

  return { doFoo };
};

钩子/useBar.js

import { useCallback } from 'react';
import { useStore } from './useStore';

export const useBar = () => {
  const [, dispatch] = useStore();

  const doBar = useCallback(
    async params => {
      dispatch(actions.request());

      try {
        const res = await SomeService.getSomething(params);
        dispatch(actions.success());
        dispatch(actions.add(res));
      } catch (error) {
        dispatch(actions.failure());
      }
    },
    [dispatch]
  );

  return { doBar };
};

钩子/useNext.js

...
import { useStore } from './useStore';

export const useNext = () => {
  const [, dispatch] = useStore();

  ...
};

组件/SomeComponent.js

const SomeComponent = () => {
  // use context
  const [store, dispatch] = useStore();

  // and here is the context
  const { doFoo } = useFoo();

  // and here
  const { doBar } = useBar();

  // and here
  useNext();

  return (
    <>
      <Button onClick={doFoo}>Foo</Button>
      <Button onClick={doBar}>Bar</Button>
      // the flag is also available in another component
      {store.isLoading && <Spin />}
    </>
  )
}

在内部,钩子可以引用组件拥有的状态队列。 (React 的 hooks 系统的底层 - Eytan Manor)

useContext只是从相关上下文提供者引用全局状态。几乎没有任何开销useContext正如你所关心的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

React useContext() 性能,自定义钩子内的 useContext 的相关文章

随机推荐

  • Nodatime 库中有工作日的概念吗?

    Nodatime 库中有工作日的概念吗 我想做的是以某种方式声明一个日历周有 5 个工作日 然后能够提出如下问题 从 任何给定日期 10 个工作日开始 结束日期是哪一天 or 从 这个日历日期 到 那个日历日期 这个间隔有多少个工作日 不
  • openssl 提供 Kubernetes Ingress Controller 假证书

    我已经配置了ssl证书 如果我访问https
  • 如何在 Bash 中写入二进制数据

    假设 Bash 脚本中有一个值为 001 的变量 如何将此二进制数据以位形式写入文件 如 001 而不是 1 echo将其写为字符串 但我想以位形式写 您可以使用以下命令以十六进制或八进制写入任意字节 printf x03 gt file
  • 使用推/拉更改 Bootstrap 中 col-*-12 列的顺序

    我有两列相同大小的 col xs 12 当屏幕尺寸与移动设备的尺寸相对应时 我会更改它们的位置 我会把它们按相反的顺序排列 我读过推和拉引导指令有助于实现这一点 但是是否可以使用以下类更改相同大小的两列的位置 div col xs 12 c
  • Imgur API - 即使“X-Ratelimit-Userremaining”不为 0,也会出现“请求过多”错误

    我正在通过 Imgur API 上传图像 https apidocs imgur com 但 即使前一个请求返回 X Ratelimit Userremaining 1216 我也收到 请求过多 错误 429 我的理解是 我应该能够在达到速
  • 日期分隔符问题

    我有以下代码 DateTime Now ToString MM dd yyyy 它总是给我这个输出 04 13 2011 而不是 04 13 2011 我可以知道为什么我会遇到这个奇怪的问题吗 几乎可以肯定 您所在的文化中默认的日期分隔符就
  • 检查 np.array 是否类似于日期时间的一致方法

    我正在进行一些单元测试 我需要确保函数始终返回类似 np datetime64 的对象 但是 它们可以是任何单位 年 日 纳秒等 我试过了 comp function returns datetime array inp assert is
  • Mongoose模型与Sinon的存根保存实例方法

    我正在尝试使用 Mongoose 模型测试用于保存小部件的服务功能 我想在我的模型上删除保存实例方法 但我找不到一个好的解决方案 我看过其他建议 但似乎没有一个是完整的 See this and this 这是我的模型 widget js
  • 尝试编译时出现 QT 未定义引用错误

    我在 QT 项目中添加了一个 IcecastServer 类 将头文件添加到 pro 文件中 并添加了一些代码 每次编译都会出现以下错误 release icecastserver o icecastserver cpp text 0x39
  • css3动画/过渡/变换:如何使图像变大?

    我想让我的图像高度增长到 1500px 希望宽度会自动调整大小 如果没有 我也可以轻松设置它 我正在使用 jquery animate 但它对我来说太不稳定了 我知道我可以使用 webkit transform scale 2 但我希望将其
  • 如何改变函数中变量的作用域?蟒蛇[重复]

    这个问题在这里已经有答案了 这似乎是一个非常愚蠢的问题 但我对 Python 中的范围规则感到困惑 在下面的示例中 我将两个带有值的变量 x y 发送到一个应该更改其值的函数 当我打印结果时 变量没有改变 def func1 x y x 2
  • 如果页面中有错误,则重定向到自定义错误页面

    我是新来的PHPWeb开发 我想知道 PHP 中是否有任何代码可以将我重定向到页面 我们将其命名为 myerrorpage php 页面上是否有错误 In JSP可以使用以下代码 我想知道上面有没有JSPPHP 中的代码类型 是 那么请帮忙
  • django:根据条件排除某些表单元素

    我有一些表单字段 我想根据是否满足特定条件来包含 排除这些字段 我知道如何包含和排除表单元素 但是当我希望它的元素根据函数的结果显示时 我很难做到这一点 这是我的表格 class ProfileForm ModelForm this tea
  • AWS EC2 究竟如何计算每小时成本?

    简单的问题 如果我有六个相同的 EC2 实例处理数据正好十分钟然后关闭 我会被收取六个小时还是一小时的费用 Update EC2 和 EBS 现在基于使用情况下降到第二个 旧答案变更的粒度精确到小时 来自 AWS 定价网站http aws
  • Blazor Checkbox双向绑定和更改事件

    绑定复选框并在该复选框更改时触发事件的正确方法是什么 我尝试了几种不同的方法 但都没有完全按照我的希望工作 请注意 该复选框位于组件中
  • 如何将sender参数传递给system.timers.timer

    如何将sender参数传递给system timers timer在 NET 中 timer1 timer new System Timers Timer interval timer1 timer AutoReset true timer
  • 如何使用 R 从 MATLAB 序列日期数字中提取时间?

    我有一些需要在 R 中使用的 MATLAB 序列日期号 但我必须将它们转换为正常日期 Matlab datestr 733038 6 ans 27 Dec 2006 14 24 00 你可以看到它给出了日期和时间 Now we try in
  • 如何将字符串转换回列表

    我有一个清单 ab 1 2 a b c I did strab str ab So strab现在是一个字符串 我想将该字符串转换回列表中 我怎样才能做到这一点 最简单和最安全的方法是使用ast literal eval import as
  • Firebase:提供的存储桶与 Swift 中当前实例的存储桶不匹配

    我有以下代码 let storageRef FIRStorage reference forURL gs slugbug appspot com dots intentional let imageRef storageRef child
  • React useContext() 性能,自定义钩子内的 useContext

    我使用了一个结构反应钩子 它是基于全球Context包含减速器的组合 如 Redux 中 另外 我广泛使用定制挂钩来分离逻辑 我有一个包含异步 API 请求的钩子 它变得相当麻烦 我有机会将该钩子的几乎每个函数拆分为其他钩子 但每个函数都使