我有一个用例,页面必须在第一次渲染和单击按钮时调用相同的 fetch 函数。
代码类似于以下代码(参考:https ://stackblitz.com/edit/stackoverflow-question-bink-62951987?file=index.tsx ):
import React, { FunctionComponent, useCallback, useEffect, useState } from 'react';
import { fetchBackend } from './fetchBackend';
const App: FunctionComponent = () => {
const [selected, setSelected] = useState<string>('a');
const [loading, setLoading] = useState<boolean>(false);
const [error, setError] = useState<boolean>(false);
const [data, setData] = useState<string | undefined>(undefined);
const query = useCallback(async () => {
setLoading(true)
try {
const res = await fetchBackend(selected);
setData(res);
setError(false);
} catch (e) {
setError(true);
} finally {
setLoading(false);
}
}, [])
useEffect(() => {
query();
}, [query])
return (
<div>
<select onChange={e => setSelected(e.target.value)} value={selected}>
<option value="a">a</option>
<option value="b">b</option>
</select>
<div>
<button onClick={query}>Query</button>
</div>
<br />
{loading ? <div>Loading</div> : <div>{data}</div>}
{error && <div>Error</div>}
</div>
)
}
export default App;
对我来说,问题是 fetch 函数总是在任何输入更改时触发,因为eslint-plugin-react-hooks
强制我在useCallback
钩子中声明所有依赖项(例如:选定状态)。我必须useCallback
使用它才能与useEffect
.
我知道我可以将函数放在组件之外并传递所有参数(props、setLoading、setError、..等)以使其正常工作,但我想知道是否可以在保留相同效果的同时存档组件内部的 fetch 函数并遵守eslint-plugin-react-hooks
?
[更新] 对于有兴趣查看工作示例的任何人。这是从接受的答案派生的更新代码。 https://stackblitz.com/edit/stackoverflow-question-bink-62951987-vxqtwm?file=index.tsx