我正在创造一个react context

该上下文将提供一项服务,该服务将订阅一些外部事件以保持更新.因此,为了防止任何泄漏,我必须通过在上下文将被 destruct 时取消订阅来清理此服务.

useEffect不同的是,我们可以在组件被销毁时返回一个回调,而我不知道如何对上下文做同样的事情.如何做到这一点,或者正确的替代方案是什么?

注意:我的直觉是,我应该在useEffect()中创建一个服务,并将其设置为上下文,但对于看起来像是简单的依赖项注入来说,这似乎很麻烦.

推荐答案

创建一个上下文提供者组件,将您的服务封装在一个useEffect块中.订阅服务通行证后,存储与服务/功能/等相关的状态...您想要为上下文的消费者使用的.

useEffect具有清理功能,当组件卸载时,您可以使用该功能取消订阅:

const ServiceContext = createContext();

const ServiceProvider = ({ children }) => {
  const [service, setService] = useState(); // store a reference to the service

  useEffect(() => {
    // subscribe to service

    setService(serviceInstance);
    
    return () => {
      // cleanup unsubscribe from service
    };
  }, []);
       
  return (
    <ServiceContext.Provider value={service}>
      {children}
    </ServiceContext.Provider>
  );
}

与问题没有直接关系--我通常在useContext左右添加一个简单的定制钩子包装:

const useService = () => useContext(ServiceContext);

然后在您的组件中:

const service = useService();

Reactjs相关问答推荐

如何使用React防止并发注册并处理Firestore数据库中的插槽可用性

从`redux—thunk`导入thunk `在stackblitz中不起作用

ReferenceError:未在Redux组件中定义窗口

使用useReducer时,props 未从父级传递给子或孙级

使用Reaction钩子窗体验证可选字段

如何在单击行中的图标时避免选中ionic 复选框?

当列表中的项的顺序改变并且使用唯一键作为它们的索引时,Reaction如何看待呈现方面?

react ';S使用状态不设置新状态

使用Ionic 7和React 18,如何访问历史对象以在页面之间导航?

MUI 日期 Select 器 - 最小日期混乱

React设置上下文并进行导航

无法从子组件传递数据到父组件

如何在 JS 中绘制具有不同笔画宽度的样条线

从 React 应用程序调用未经身份验证的 graphql 查询时出现错误:没有当前用户

使用 react pro 侧边栏展开折叠菜单

使用 react-markdown 组件时 Tailwind CSS 的问题

如何通过 id 从 useSprings 数组中删除元素

如何根据react 中的 map 功能一次只打开一个弹出窗口?

我在使用 Elements of stripe 时使用 React router v6

如何在按钮左下角制作 Material UI 菜单下拉菜单