如何导出 useContext 变量而不必在每个组件上调用 useContext?

Posted

技术标签:

【中文标题】如何导出 useContext 变量而不必在每个组件上调用 useContext?【英文标题】:How to export a useContext variable without having to call useContext on each components? 【发布时间】:2021-12-01 19:21:18 【问题描述】:

我编写了一个 toast 上下文并将整个项目包装在 toast 提供程序中。如果我的某个组件需要使用 toast,它会调用

function Component() 
   const toast = useToast();
   toast.success("")
   ...

有没有办法直接导入 toast 而不必在单个组件上调用 useToast() 如下?

import  toast  from "./toast-provider.tsx"

function Component() 
   toast.success("")
   ...

【问题讨论】:

【参考方案1】:

我假设您的 toast 类似于 <React.createContext().Provider />

在这种情况下,不能拨打toast.attribute,至少根据我的理解。您必须为类使用高阶组件,在您的情况下,使用 useContext 挂钩或类似的功能组件。

如果您希望能够使用点符号访问 toast 的属性,则 toast 必须是例如一个东西。这是创建上下文的一种可能性:

function getAttr2() 
  return "some dynamic value";


export const toast = 
  attribute1: "some attribute",
  attribute2: getAttr2()
;

但这当然不符合 React 使用上下文的方式。

【讨论】:

我的 useToast 基本上是“export const useToast = () => useContext(ToastContext);”。不过,您的建议在我的情况下不起作用,因为我的 toast 提供程序使用 react-toastitfy 并且需要在提供程序的末尾附加一个组件,而不仅仅是纯全局函数。谢谢你的回答。

以上是关于如何导出 useContext 变量而不必在每个组件上调用 useContext?的主要内容,如果未能解决你的问题,请参考以下文章

使用 React 钩子 useContext 避免不必要的重新渲染

如何修改使用 useContext 传递的状态变量(不是 setState 修改,更像是可视化编辑)

如何在数据帧中沿值的一列生成随机均匀分布而不必对所述列中的每个值重复?

在 Linux 上等待多个条件变量而没有不必要的睡眠?

如何使用Adobe Illustrator的变量

如何在 C# 中为类名起别名,而不必向使用该类的每个文件添加一行代码?