reactjs 即使在index.js中使用QueryClientProvider,在外部包中使用react-query也会导致“No QueryClient set”错误

eufgjt7s  于 2023-02-04  发布在  React
关注(0)|答案(2)|浏览(119)

我尝试使用一个自行开发的包中的钩子,这个包在create-react-app应用程序中使用useQuery。
这是我的场景:我正在开发两个npm项目:"Core"和"Demo"。Core包含我希望在其他应用程序中使用的函数、挂接和组件(如Demo,它是一个CRA)。一些钩子包含useQuery不幸的是,当在其他应用程序(如Demo)中使用这个钩子时,我总是得到错误消息**"No QueryClient set,使用QueryClientProvider来设置一个",即使我设置了QueryClientProvider。
是否必须在
Core中设置任何配置才能使所需行为工作(例如,将使用的钩子放置在应用程序上下文中)?是否必须将包构建为特定模块?或者是否可以将应用程序的QueryClient传递给Core**的自定义钩子?
下面的代码展示了我的尝试:

  • 核心/挂钩/使用挂钩与使用查询. js *
export function useHookWithUseQuery() {
  const queryClient = useQueryClient();
  const { data } = useQuery(
    "QUERY_KEY",
    getDataFn
  );

  const invalidateData = () => {
    queryClient.invalidateQueries("QUERY_KEY");
  };

  return { data, invalidateData };
}
  • 演示/索引. js:*
ReactDOM.render(
  <React.StrictMode>
    <QueryClientProvider client={queryClient} contextSharing={false}>
      <App />
    </QueryClientProvider>
  </React.StrictMode>,
  document.getElementById("root")
);
  • 演示/应用程序. js *
import { useHookWithUseQuery } from "core/dist/hooks"; // also tried core/src/hooks
...

function App() {
  const { data } = useHookWithUseQuery();
 
  const { someFetchedText } = data;
  return (
    <div>{ someFetchedText }</div>
  );
}

下面介绍如何将Core安装到Demo

  • 核心版(构建+在Verdaccio本地发布)
    • rm-rf dist && NODE_ENV =生产数据包源--输出目录dist--复制文件
    • npm发布--注册表http://localhost:4873/
  • 在演示中
    • NPM配置注册表= http://本地主机:4873 npm i核心
2lpgd968

2lpgd9681#

如果还有人感兴趣的话,我也遇到了上面描述的同样的问题。
我的问题是我从本地文件夹安装了我的“核心”包,结果react-query没有正确地删除重复数据。
直接从git(或npm注册表)安装它允许npm正确地删除重复数据,并为我修复了这个问题。

omvjsjqw

omvjsjqw2#

我遇到了同样的问题,在Yarn锁或NPM包锁中删除重复的React查询依赖项是解决方案:
为了Yarn。你可以跑锁

npx yarn-deduplicate --strategy fewer

或用于 Package 锁.json:

npm dedupe

这会解决你的问题就像解决我的一样。

相关问题