我正在构建一些API钩子,我遇到了deps
属性的问题。我想在deps
的内容更改时重新调用useEffect
,而不是在永久循环中运行。deps
可以是未定义的或any[]
export const useReader = <TResponseData>({ url, deps, options }: TypeUseReader<TResponseData>) => {
const [data, setData] = useState<TResponseData | null>(null);
const [isLoading, setIsLoading] = useState<boolean>(false);
const [error, setError] = useState<number | null >(null);
async function fetchData(newUrl?: string) {}
useEffect(() => {
// ..fetch
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [url, deps]); // HERE, deps are forever loop
return {
data,
isLoading,
error,
fetchData
};
};
这就是我如何使用它:
return useReader<FOO>(
{
url: 'URL_PLACEHOLDER',
deps: [anything] /* FIXME: deps enters FOREVER LOOP */
}
);
我所尝试的:[deps ?? []]
和...[deps ?? []]
和deps
-所有这些都会创建永久循环
1条答案
按热度按时间8aqjt8rx1#
问题是,当您使用
deps
作为数组字面量调用useReader
时,每次都会创建一个新数组,因此useEffect
正确地检测到值的变化。一般来说,有两种方法来处理这个问题。
你可以让调用者负责-在
useReader
接口中指定它接受一个unknown
类型的dep
值。如果调用者想要传递一个值数组,那么这些值应该是稳定的,例如。更简单、更灵活的方法是接受一个
deps
数组(类型为unknown[]
),并将数组的成员分布在传递给useEffect
的其他依赖项之后:各种短绒对此感到不安,但就钩机械而言,这不是问题。