如何使用自定义挂钩在组件之间共享状态数据?

2024-04-14

我有以下自定义挂钩useFlash:

import { useState } from 'react';


export default function useFlash() {
  const [messages, setMessages] = useState([]);

  const showFlash = (message: string) => {
    setMessages([...messages, message]);
  };

  const clearMessage = (index: number) => {
    setMessages(messages.filter((_m, i) => index !== i));
  };

  return {
    messages,
    showFlash,
    clearMessage
  };
}

然后我将这个 HOC 提供给其他两个组件:

import React from 'react';
import useFlash from '../effects/useFlash';

const withFlash = (WrappedComponent: React.Component) => {
  const WithFlash = () => {
    const { messages, showFlash, clearMessage } = useFlash();

    return (
      <WrappedComponent
        messages={messages}
        showFlash={showFlash}
        clearFlashMessage={clearMessage}
      />
    );
  };

  return WithFlash;
};

export default withFlash;

它工作得很好,除了 HOC 的每次使用都会获得自己的状态数据。我需要国家是全球性的。我知道我可以使用消费者/提供者的上下文,但我认为这种方式会更简单一些。事实证明这不是真的,有没有办法让它全球化?


您需要使用 Context,但这并没有那么糟糕..

创建你的上下文..

import React, { useState } from 'react';

export const FlashContext = React.createContext();

export const FlashProvider = ({ children }) => {
  const [messages, setMessages] = useState([]);
  return (
    <FlashContext.Provider value={{ messages, setMessages }}>
      {children}
    </FlashContext.Provider>
  );
};

将您的组件包装在树中较高位置的提供程序中。

import React from "react";
import { FlashProvider } from "./flash-context";

const App = () => <FlashProvider><TheRest /></FlashProvider>;

export default App;

然后在您的自定义挂钩中使用上下文..

import React, { useContext } from "react";
import { FlashContext } from "./flash-context";

export default function useFlash() {
  const { messages, setMessages } = useContext(FlashContext);

  const showFlash = (message) => {
    setMessages([...messages, message]);
  };

  const clearMessage = (index) => {
    setMessages(messages.filter((_m, i) => index !== i));
  };

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

如何使用自定义挂钩在组件之间共享状态数据? 的相关文章

随机推荐

  • 将DBContext服务添加到Worker项目中的program.cs中

    对于这一切还相当陌生 所以如果我做了任何愚蠢的事情 我深表歉意 我正在尝试实现一个与我设置的本地 SQL Server Express 数据库进行通信的工作项目 我将连接字符串存储在我的AppSettings Json如下所示 Loggin
  • 为什么 printf 仍然可以在 RAX 小于 XMM 寄存器中 FP 参数数量的情况下工作?

    我正在关注Linux 64系统中的 开始x64汇编编程 一书 我正在使用 NASM 和 gcc 在关于浮点运算的章节中 本书指定了以下用于添加 2 个浮点数的代码 在本书和其他在线资源中 我读到寄存器 RAX 根据调用约定指定要使用的 XM
  • 将数组作为声音播放并并行记录其输出

    我知道 Octave MATLAB 可以将数组作为声音播放 但我想知道 Octave 是否可以做到这一点 我想循环播放一系列频率 并让 Octave 使用计算机上的扬声器播放它们 并让 Octave 也记录使用麦克风输入的声音来获取最大值
  • 关于僵尸进程和线程的问题

    自从我阅读一些有关进程和线程的新主题以来 我脑海中浮现出这些问题 如果有人能帮助我 我会很高兴 1 如果一个线程被标记为不可取消 然后该进程在临界区内被终止 会发生什么 2 我们的程序是否有操作系统已知的主线程 我的意思是操作系统是否给予程
  • MSYS2环境的使用

    我想彻底了解MSYS2平台环境的使用情况 部分描述可在以下位置找到 https www msys2 org docs environments https www msys2 org docs environments 我理解的事情 MSY
  • 如何在 MongoDB 的 Linq 查询中使用 .Contains 和 ToLower?

    MongoDB C Linq 如何在 Linq 查询中使用 contains 和 ToLower List
  • 正则表达式将 10 位数字与特定模式完全匹配

    假设我给出一个模式 123 或 1234 我想匹配以该模式开头的任何 10 位数字 它应该正好有 10 位数字 Example 模式 123 应匹配 1234567890 但不匹配 12345678 我尝试了这个正则表达式 123 d 0
  • 按位运算符的结果是如何产生的?

    我很惊讶我在谷歌上找不到这个听起来简单的问题的答案 在检查了大约十几个不同的页面之后 我只想在这里问 根据这一页 http www leepoint net notes java data expressions bitops html 3
  • 如何在 Android 上回滚事务?

    这是交易的标准习惯用法 db beginTransaction try db setTransactionSuccessful finally db endTransaction 我想添加一个 catch 块 并且我想发出回滚 有可能吗 我
  • EJB注入时出现空指针异常

    我用一个无状态 Ejb 编写了非常简单的 Web 应用程序 当我实现接口时 有趣的时刻到来了 ejb 依赖注入不起作用 web xml
  • 如何使用 python 中的 spacy 库将句子转换为问题 [请参阅下面的我的代码进行更正]

    我需要使用 python 中的 spacy 将任何句子转换为问题 我下面的代码太长了 我需要做更多的工作才能将任何句子完成为问题格式 现在在这段代码中我根据以下条件制定条件是形式 需要形式 有形式 做形式通过检查过去时和现在时 输入 尼娜拉
  • 带有多行标签的 Tkinter 表单?

    我正在构建一个通用的 数据驱动的 Tkinter 表单 每行左侧有一个标签 右侧有一个输入字段 对于简单的测试数据 可以使用标签作为标签文本 但是当所需的标签文本比标签字段长时 它只会被截断 一旦构建了表单 我就不需要动态改变标签文本 文本
  • WPF 中的 PrintDialog.PrinterSettings 等效项

    我正在尝试向我正在编写的 C WPF 应用程序添加打印支持 对此我感到抓狂 我正在尝试从 WPF 应用程序中的窗口打印单个图像 该图像是运输标签 打印机是装有 4 x6 运输标签纸的热敏打印机 打印的代码如下 PrintDialog pd
  • springrabbitmq:无法将id设置为属性?

    我有一个属性文件 其中包含队列 其值为queue name 如果我在其他请使用该属性 那么它可以工作 但如果我在 id 上使用它 那么它会失败
  • 如何使用基于类的视图为 Django 指定自定义 404 视图?

    使用 Django 您可以通过在根目录中执行此操作来覆盖默认的 404 页面urls py handler404 path to views custom404 使用基于类的视图时如何做到这一点 我无法弄清楚 文档似乎也没有说什么 我试过了
  • MatDialog 内部的动画不起作用

    我有组件 对话框 我将在其中动态添加 删除组件 另外 我确实在进入 离开时有动画 因此当删除组件并添加新组件时 我希望以动画方式滑入滑出 但 MatDialog 内部不起作用 我认为问题出在动画上 但是当我将在对话框中显示的组件插入到使用
  • 如何显示由onclick事件触发的div

    我有两个divs 我想显示一个div 其中还有其他div在里面 当onclick事件被触发 任何帮助或建议将不胜感激 干得好 div display none document querySelector button addEventLi
  • 为什么不总是配置事件中心分区的最大数量?

    The Azure 事件中心概述 https azure microsoft com en us documentation articles event hubs overview 文章指出以下内容 分区数量在事件中心创建时指定 且必须在
  • C# - Debug.WriteLine - 此函数是异步的吗?

    我刚刚遇到一种情况 我正在调试一个迭代大量数据的线程 我正在使用 Debug WriteLine 打印正在处理的记录 刚刚发生的事情是该线程报告它已处理所有记录 但是 Visual Studio 的调试窗口仍然显示 我确信线程已经完成了它的
  • 如何使用自定义挂钩在组件之间共享状态数据?

    我有以下自定义挂钩useFlash import useState from react export default function useFlash const messages setMessages useState const