【发布时间】:2023-01-21 02:07:09
【问题描述】:
我有一个奇怪的案例,我需要允许标准的 useQuery 行为,但同时只需要在第一个 onSuccess 上运行一段代码。
我知道我可以通过 useRef 实现这一点,但是有没有办法解决这个问题?
我无法 1:1 重现问题,但您可以在第一个增量计数器重新设置为 100 后看到它。
const [counter, setCounter] = useState(0);
const { data, isLoading } = useQuery(
["key"],
() => {
return axios.get("https://picsum.photos/200");
},
{
onSuccess() { // this runs twice
setCounter(100);
console.log("fetch");
}
}
);
return (
<div className="App">
<button
onClick={() => {
setCounter(counter + 1);
}}
>
counter {counter}
</button>
{data?.data && "data is present"}
</div>
);
https://codesandbox.io/s/react-query-once-66lows?file=/src/App.tsx
【问题讨论】:
-
我想知道这样的用例在实践中会是什么?我们内部有一个
dataUpdateCount,如果我们要在 useQuery 的结果中公开它,您可以检查它是否等于1。我只是想知道为什么需要这样做? -
@TkDodo 我可能处理错了,但长话短说,我有一系列从 b/e 返回的项目。然后将数组构建到树中,用户可以对其进行编辑。因此,从查询返回的第一个数据被设置为展开的树元素(在我们的例子中是 1 层深),然后用户可以关闭或进一步打开。如果我不检查,扩展数组将始终更改,因为用户从 b/e 获取数据。我的组件可能有一些重新渲染问题,但在解决这个问题之前(假设这是一个重新渲染问题),我需要一个解决方法。
标签: javascript reactjs typescript react-query